cs_ckimoi
Messages postés15Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 2 mars 2010
-
14 mars 2008 à 11:53
cs_ckimoi
Messages postés15Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 2 mars 2010
-
14 mars 2008 à 15:56
Hello tous, je galère:
j' ai fichier csv extrait de ma base access qui contient les doubles quotes pour les champs nonn vide,
je l'ouvre sous excel pour le retravailler (format date, classement ....)
je l'enregistre en .CSV
le reouvre avec textpad ou notpad ou wordpad , mais les doubles quote ont disparu pour les champ non vide et j' en ai absolument besoin pour le réimporter dans une bas mysql
j'ai cherché , cherché et cherché et je ne m'en sors pas , qu'est ce que je peux rajouter à cette macro pour lors de l'enregistrement excel me rajoute des guillemets pour encadrer une valeur non nul dans le csv:
Code:
Sub test()
'
' test Macro
' Macro enregistrée le 14/03/2008 par e203112
'
'
ActiveWorkbook.SaveAs Filename:= _
"C:\Documents and Settings\e203112\Desktop\arcad\CSV\last\test12h.csv", _
FileFormat:=xlCSV, CreateBackup:=False
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202171 14 mars 2008 à 14:37
A toi de personnaliser la chose, mais voilà deja quelques bases
Sub test()
ExportCSV ActiveSheet, "C:\a.csv"
End Sub<hr />
Sub ExportCSV(ByRef voSheet As Worksheet, ByRef vsCsvFilePath As String)
Dim nRow As Long
Dim nCol As Long
Dim nRows As Long
Dim nCols As Long
Dim xsParts() As String
Dim nIndex As Long
Dim iFile As Integer
Dim sBuffer As String
Dim bIsLineEmpty As Boolean
Const sSep = ";" '# On pourrais récupérer le separateur de liste spécifié dans les regioal settings
'# On récupère le nombre de lignes et de colonnes reelement utilisées
nRows = voSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
nCols = voSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
'# On créé un tableau pour contenir les données de la feuille Excel
ReDim xsParts(nCols * nRows * 2 - 2)
'# Ensuite, on parcoure chaque ligne
For nRow = 1 To nRows
'# On ne stockes pas les lignes vides...
If bIsLineEmpty Then
'# ... donc si on en rencontre une, on la suppriem du tableau
nIndex = nIndex - nCols + 1
ElseIf nRow > 1 Then
'# Si on se trouve après la première ligne, on ajoute un saut de ligne
xsParts(nIndex) = vbCrLf
'# Et on décale le curseur d'ecriture
nIndex = nIndex + 1
End If
'# On initialise le flag
bIsLineEmpty = True
'# Et pour chaque colonne de notre feuille...
For nCol = 1 To nCols
'# On ajoute un séparateur (";") entre les colonnes
If nCol > 1 Then
xsParts(nIndex) = sSep
nIndex = nIndex + 1
End If
'# On récupère le texte de la cellule en cours
sBuffer = voSheet.Cells(nRow, nCol)
'# Si la cellule est non vide...
If LenB(sBuffer) Then
'# notre flag passe à False: la ligne doit être conservée
bIsLineEmpty = False
'# Ensuite, si on est dans la première colonne
If nCol = 1 Then
'# On mémorise le contenu de la cellule tel quel
xsParts(nIndex) = sBuffer
Else
'# Dans le cas contraire, on ajoute des guillemets
xsParts(nIndex) = """" & sBuffer & """"
End If
End If
'# Et on décale le curseur d'ecriture
nIndex = nIndex + 1
Next nCol
Next nRow
'# Ici, on ecrit le tableau dans un fichier
iFile = FreeFile
Open vsCsvFilePath For Output As iFile
Print #iFile, Join(xsParts, vbNullString)
Close iFile
End Sub<hr />
, ----
By Renfield
cs_ckimoi
Messages postés15Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 2 mars 2010 14 mars 2008 à 13:41
Merci,
j'ai testé aussi ,
en rajoutant des guillemets dans mes cellules contenant du non vide mais j'obtiens dans le CSV du triple quote
ex: "garage dupont" me donne en csv """garage dupont""" et moi j'ai besoin d'obtenir "garage dupont"
Mon gros soucie c'est que j'ai 150 colonnes et 20000 lignes (dur dur)
testé également tous les script que j'ai pu trouvé en VBS en sql ... mais appart modifié un quote anglais "," en euro ";" rien y fait
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202171 14 mars 2008 à 14:45
si tu te demande pourquoi je compliques la chose avec un tableau, c'est pour accélerer le traitement... j'évite de me trainer une chaine que j'agrandirait n fois, j'evite aussi de faire n accès au fichier...
cs_ckimoi
Messages postés15Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 2 mars 2010 14 mars 2008 à 15:56
Compliqué la chose, c'est pas le mot, je prefers toujours en avoir trop que pas assez,
et effectivement pour 20000 lignes et 130 colonnes, le traitement a duré moins d'une minute!!!
PS: je me suis penché dessus et j'avoue que ce script est parfais même la cerise y est:
If nCol = 1 Then
'# On mémorise le contenu de la cellule tel quel
xsParts(nIndex) = sBuffer
Else
'# Dans le cas contraire, on ajoute des guillemets
xsParts(nIndex) = """" & sBuffer & """"