[Déplacé VB6 --> VB.NET] Probleme apostrophe avec excel

ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010 - 4 févr. 2010 à 16:10
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 5 févr. 2010 à 18:28
Bonjour,
je fais un export en excel et au moment de l'insertion des infos, voici une requete typique que j'ai:
INSERT INTO Feuil1 VALUES 
(1,'Réfrigérateurs 1 porte ',50,'Froid et conservation  ',51,'Réfrigérateurs 1 porte ',0,'',5140215,'WHIRLPOOL Réfrigérateur 1 porte ARC1394WH ','276,8304 ','258,72 ','0 ','276,8304 ','347,021833152 ','19,6 ','6 ','82 ','11/12/2007 09:36:42 ','8 jours ouvrés ')


Jusque là tout se passe bien.mais quand j'ouvre mon fichier excel, quand je clique sur les colonnes ou cellules qui sont de type string, il apparait un apostrophe devant le texte.
Comment faire pour enlever cet apostrophe en vb.net?
Merci d'avance.
Ca fait des heures que je tourne en rond.

14 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
4 févr. 2010 à 20:27
Salut
Très flou.
Tu fournis une requète SQL + Tu parles d'export depuis Excel + Tu demandes une solution en VB.Net !!
Va falloir faire du tri ou être plus précis !

Regarde aussi pourquoi :
- il y a systématiquement un espace à la fin de chaque donnée
- les chiffres sont encadrés par des '

Normalement, une syntaxe SQL de ce type inclut aussi le nom des champs :
Insert Into maTable
(monChamp1, monChamp2, ..., monChampX)
Values ()

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 09:15
oublions la requete:
sur ce lien de microsoft :http://support.microsoft.com/kb/257819/fr

C'est marqué:
Avertissement concernant la modification de données Excel à l'aide d'ADO : Lorsque vous insérez des données texte dans Excel à l'aide d'ADO, la valeur de texte est précédée d'une apostrophe. Ceci peut provoquer des problèmes par la suite lors du travail avec les nouvelles données.


Y a t-il une solution pour contourner le problème?
Merci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 09:31
Bonjour,
Microsoft signalant le problème mais ne signalant aucune parade, il me semble que tu devras alors "retraiter" les données de ta feuille Excel.
Si cette dernière contient beaucoup de données, tu auras probablement intérêt à travailler sur un tableau dynamique (constitué sur la base du "Range" à traiter), puis à "écraser" les données de ton "Range" par celles de ton tableau modifié .. (vitesse de traitement nettement meilleure).
Pour modifier chaque valeur de ton tableau (enlever le signe ' devant et derrière, s'ils sont là, tu sais faire, quand-même ..!)
Voilà ...
Reviens si tu as des difficultés à mettre ceci en oeuvre (en code).


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
5 févr. 2010 à 09:32
Quand les textes peuvent ressembler à des équations de calcul (par exemple un texte qui commencerait par un = ), la solution consiste à mettre une ' devant la chaine pour dire à Excel qu'il s'agit d'une chaine.
C'est donc une réaction à peu près normal de Excel qui prend les devant pour éviter les problèmes.
Excel est un tableur et, accessoirement, une base de données.

La seule solution que je vois serait une macro qui supprimerait les ' en tête de cellule quand il y en a, mais tu risques de tomber sur le cas de figure expliqué au début de ce message.
La meilleure des solutions serait d'adopter une vraie base de donnée.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 10:09
J'ai le code comme suit, comment pourrai-je le retraiter pour ignorer les apostrophes?Merci.
Dim m_sConn1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & CheminFichier & " " & _
                    ";Extended Properties=""Excel 8.0;HDR=YES"""
        Dim conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1)

        Dim s_entete As String = ""
        Dim s_ligne As String = ""
s_entete = "CREATE TABLE Feuil1 ("

                    For i As Integer = 0 To dttRequete.Columns.Count - 1
                        If LCase(Left(dttRequete.Columns(i).DataType.Name, 3)) "int" Or LCase(Left(dttRequete.Columns(i).DataType.Name, 4)) "deci" Then
                            s_entete = s_entete & "[" & Replace(dttRequete.Columns(i).ColumnName, " ", "_") & "] float"
                        Else
                            If Left(dttRequete.Columns(i).ColumnName, 4) = "xml_" Then
                                Dim t_colonne() As String = Split(dttRequete.Columns(i).ColumnName, "_")
                                s_entete = s_entete & "[" & Replace(Replace(Replace(t_colonne(UBound(t_colonne)), " ", "_"), "**", ""), "/", "_") & "] text"
                            Else
                                s_entete = s_entete & "[" & Replace(dttRequete.Columns(i).ColumnName, " ", "_") & "] text"
                                's_entete = s_entete & "[" & Replace(dttRequete.Columns(i).ColumnName, " ", "_") & "] char(255)"
                            End If
                        End If

                        If i < dttRequete.Columns.Count - 1 Then s_entete = s_entete & ","
                    Next
                    s_entete = s_entete & " )"

                    Dim cmdCreate As New System.Data.OleDb.OleDbCommand(s_entete, conn1)
                    cmdCreate.ExecuteNonQuery()
                    cmdCreate.Dispose()
 s_ligne = "INSERT INTO Feuil1 VALUES ("
                For i As Integer = 0 To dttRequete.Columns.Count - 1

                    If Not row(i) Is System.DBNull.Value Then
                        If LCase(Left(dttRequete.Columns(i).DataType.Name, 3)) "int" Or LCase(Left(dttRequete.Columns(i).DataType.Name, 4)) "deci" Then
                            s_ligne = s_ligne & Replace(row(i), ",", ".")
                        Else
                            If Left(dttRequete.Columns(i).ColumnName, 4) = "xml_" Then
                                '' balises xml
                                Dim tmp As String = Replace(Replace(row(i), Chr(10), ""), Chr(13), "
")
                                Dim xml As New System.Xml.XmlDocument
                                Try
                                    tmp = Left(tmp, tmp.LastIndexOf("</root>") + Len("</root>"))    ' on enleve les caracteres apres la racine "</root>", par exemple les "
"
                                    xml.LoadXml(tmp)
                                    Dim t_colonne = Split(dttRequete.Columns(i).ColumnName, "_")

                                    If Left(t_colonne(UBound(t_colonne)), 2) = "**" Then
                                        tmp = xml.SelectSingleNode(t_colonne(1) & "[@" & t_colonne(2) & "='" & Right(t_colonne(UBound(t_colonne)), Len(t_colonne(UBound(t_colonne))) - 2) & "']").Attributes("Valeur").InnerText
                                    Else
                                        tmp = xml.SelectSingleNode(t_colonne(1)).InnerText
                                    End If
                                    's_ligne = s_ligne & "'" & Replace(Replace(Replace(tmp, vbLf, "
"), vbTab, " "), "'", "''") & "'"
                                    s_ligne = s_ligne & "'" & Replace(Replace(Replace(tmp, vbLf, "
"), vbTab, " "), "'", "''") & "'"
                                Catch ex As Exception
                                    s_ligne = s_ligne & "' '"
                                End Try
                            Else
                                s_ligne = s_ligne & "'" & Replace(row(i), "'", "''") & " '"
                            End If
                        End If
                    Else
                        If LCase(Left(dttRequete.Columns(i).DataType.Name, 3)) "int" Or LCase(Left(dttRequete.Columns(i).DataType.Name, 4)) "deci" Then
                            s_ligne = s_ligne & "0"
                        Else
                            s_ligne = s_ligne & "''"
                        End If
                    End If

                    If i < dttRequete.Columns.Count - 1 Then
                        s_ligne = s_ligne & ","
                    End If

                Next
                s_ligne = s_ligne & ")"
                Dim lignes As New System.Data.OleDb.OleDbCommand(s_ligne, conn1)
                lignes.ExecuteNonQuery()
                lignes.Dispose()

            Next



Je fais l'insertion au niveau de la ligne que j'ai mis en rouge.
Merci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 10:50
Ce n'est pas là ce que je t'avais suggéré !
Je t'avais suggéré de :
1) exécuter ta requête en l'état (sans rien tenter de modifier à ce niveau)
2) générer un tableau dynamique des données ainsi récupérées (ton range)
exemple :
dim tablo
tablo )= range("A1:C100").value
te donnera un tablo contenant toutes les valeurs du range A1:C100
travailler sur ce tableau tablo pour y modifier tes valeurs(suppression du ')
exemple :
If left(tablo(1,10),1) "'" then tablo(1,10) mid(tablo(1,10),2)
A toi de le faire en boucle, hein ...
3) écraser par les valeurs (ainsi modifiées) de tablo ===>> range("A1:C100").value = toto
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 10:51
J'ai regardé des discussions, il parait que range serait la solution par exemple:
Sub Delete_PrefixCharacters()
    Dim rngCell

    ' Loop through all used cells in the active worksheet.
    For Each rngCell In Spreadsheet1.ActiveSheet.UsedRange

        ' If a prefix character exists, delete it.
        If rngCell.PrefixCharacter <> "" Then
            rngCell.Value = rngCell.Value
        End If
    Next
End Sub


Mais je ne sais pas comment je pourrai l'utiliser avec mon code que j'ai posté avant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 11:21
traiter comme je te l'ai dit (un tableau dynamique) est plus rapide que de traiter les cellules de ta feuille directement
Mais fais comme tu veux.... mais gaffe à l'alignement (ton préfixe n'est un ' que si alignement à gauche).
Et je ne comprends pas ceci :
Mais je ne sais pas comment je pourrai l'utiliser avec mon code que j'ai posté avant.

Quelle que soit la méthode (la mienne ou la tienne) : elle n'est à appliquer qu'après l'exécution simple de ta requête (sans rien modifier à ce stade des données qu'elle retourne) !

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 11:29
Ce que je ne comprends pas c'est "lle n'est à appliquer qu'après l'exécution simple de ta requête (sans rien modifier à ce stade des données qu'elle retourne)".
Parce que je ne fais pas de modifications de données.
Je fais juste l'insertion à ce niveau:
Dim lignes As New System.Data.OleDb.OleDbCommand(s_ligne, conn1)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 12:06
et tout le traitement que tu as mis avant ?

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 13:49
ce que j'ai mis avant, c'est juste pour recupérer des données depuis ma base de données.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 15:13
Ah ! (j(y voyais d'autres traitements, mais ...)
Alors : si tu as maintenant ta feuille remplie avec ces données, mais dont certaines cellules commencent par un ' que tu veux faire sauter :
C'est à la suite de là, que tu dois traiter les cellules de ta feuille (comme indiqué plus haut) !


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ddove53 Messages postés 623 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 15 juin 2010
5 févr. 2010 à 15:32
Voilà voilà,lol.
Donc si je comprends bien c'est après l'insertion de ma ligne que je dois faire mon traitement?
Dim lignes As New System.Data.OleDb.OleDbCommand(s_ligne, conn1)
lignes.ExecuteNonQuery()
lignes.Dispose()

Next


Comment pourrai-je faire ce traitement en rapport avec "lignes"?
Merci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
5 févr. 2010 à 18:28
Je crois t'avoir répondu et assez clairement !
Lorsque et seulement lorsque ta feuille est complètement remplie par tes données (car çà, tu l'as fait, non ? ... sinon ton problème est en amont) ===>> ce n'est qu'alors que tu lances le traitement "réparateur", tel que défini plus haut (en envoyant à ton objet définissant la feuille concernée les instructions Excel nécessaires)


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0