[RESOLU] VBA : Pbm export csv

spicken

XLDnaute Nouveau
Bonjour,
Je vous sollicite chère communauté pour un problème qui m'anime depuis quelques ... jours.
Je souhaite procéder à un export CSV d'un tableau mais j'ai une petite contrainte à savoir que pour toutes premières colonnes vides/null/empty etc ... et bien qu'il passe à la ligne suivante et non à la cellule d'à côté de la même ligne.
Voici mon code :
VB:
Sub exportCSV()
'
'
' Export Macro
' Macro d'export
Dim Plage As Object, oL As Object, oC As Object, Tmp As String, Sep$
sUser = Environ("username")
Sep = ";"
Set Plage = ActiveSheet.Range("A4:N4" & ActiveSheet.Range("A400").End(2).Row)
Open "ExportOF_" & Format(Date, "dd-mmmm-yyyy") & "_" & Format(Time, "hh.mm") & ".csv" For Output As #1

For Each oL In Plage.Rows
    Tmp = ""
    For Each oC In oL.Cells
    If Cells.Select = "" Then GoTo oL
        Tmp = Tmp & CStr(oC.Text) & Sep
    Next oC
Print #1, Tmp
oL:
Next oL

MsgBox "Le fichier a bien été exporté dans c:\Users\" & sUser & "\Documents !"
Close

End Sub

Au final l'idéal serait que j'ai un fichier CSV où uniquement les lignes qui ont la colonne A remplies sont transposés en CSV. Ma contrainte : n'avoir aucune ligne dans mon CSV complètement de ;;;;;;;;
A noter que par exemple s'il y a des lignes de la colonne N vides, elles doivent être présentent dans mon CSV.
Merci d'avance pour votre aide.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@spicken [Bienvenue sur le forum]
A défaut de de fichier de test, je propose ceci
(La macro SetDataTest ne sert qu'à générer des données de test)
VB:
Sub SetDataTest()
Application.ScreenUpdating = False
Cells.Clear
[A4] = "ITEM1": [A4].AutoFill [A4:N4], 0: [A5:N50] = "=ROW()*COLUMN()"
[A10:A12,A19:A22,A29:A33,A41:A46] = Empty
MsgBox "Fin génération des données de test", vbInformation + vbOKOnly
End Sub
Sub Export_CSV_Bis()
Dim xPath$, NomFic$
xPath = CreateObject("WScript.Shell").SpecialFolders(16)
Range("A5:A50").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
ActiveSheet.Copy
ActiveSheet.Rows("1:3").Delete
Application.DisplayAlerts = False
NomFic = Format(Now, """ExportOF_""dd-mmmm-yyyy""_""hh.mm"".csv")
  With ActiveWorkbook
    .SaveAs Filename:=xPath & "\" & NomFic, FileFormat:=xlCSV, local:=True
    .Close False
  End With
End Sub
 

spicken

XLDnaute Nouveau
Bonjour Staple1600 aka JM,
Tout d'abord merci de ton accueil et de ta disponibilité pour m'accompagner dans ce problème.
Je n'ai pas joint le fichier tout simplement car il n'y a pas de particularité. C'est juste un tableau avec des informations des colonnes A à N que je souhaite exporter en CSV.
Pour la solution que tu me proposes, j'ai plutôt bien réussi à m'en imprégner et comprendre comment tu as procédé.
Mes questions relatives à ton code :
- xPath : tu créés un object, que signifie le ("WScript.Shell").SpecialFolders(16) ??
- Je ne souhaite pas forcément supprimer les 3 premières lignes mais pas forcément les avoirs dans mon CSV ?
- Lorsque j'émule ton code, il me met un message d'erreur "Pas de cellule correspondantes" sur la ligne
VB:
Range("A4:A50").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
- Il m'interesse de supprimer toutes les lignes pour celles où la 1er colonne est vide, néanmoins le vide correspondant à une résultant d'une fonction qui est dans la cellule. Comment puis-je faire en sorte que la valeur résultante soit traitée dans la code et non liée au "blank" ?
D'avance merci pour ton retour, en attendant je bûche en parallèle pour trouver une solution.
 

Staple1600

XLDnaute Barbatruc
Re

Ma macro telle qu'écrite fonctionne de pair avec la macro SetDataTest (qui sert ici u créer des données exemples puisque comme déjà dit pas de fichier exemple fourni par le demandeur...)
Donc pour tester , il suffit de créer un classeur vierge
1) de lancer la macro SetDataTest
2) puis de lancer la macro Export_CSV_Bis

Et normalement tu obtiendras un *.CSV dans le répertoire Documents de la session Windows active

(C'est ce qui se passe sur mon PC, signifiant donc que la macro fonctionne, légitimant ainsi le fait que je poste le code VBA dans ta discussion ;))
 

spicken

XLDnaute Nouveau
Re,
Effectivement je n'ai pas eu de soucis avec ton code et a fonctionné du premier coup. Je t'en remercie pour cela.
Le résultat toutefois ne correspond pas à mon attente notamment sur le fait que l'export CSV contient des lignes ;;;;;;
Etant donné que c'est un fichier qui a vocation à être intégré dans une application, elle supporte mal les lignes ";;;;;;;;;;"
Comment pourrais-je faire par l’intermédiaire d'une boucle où la condition est si la colonne A est vide tu me la supprimes ça OK ton code fonctionne très bien mais que aussi, les valeurs exportées se concentrent que sur les lignes non vides ?
Dans le cas de mon exemple le début de mon CSV est très bien mais si je descend au delà de la zone remplie j'ai mon document comme ceci :
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
Et c'est ce que je veux éviter.
Que me conseillerais-tu ?
Merci encore de ton aide.
 

spicken

XLDnaute Nouveau
Bon après pas mal de recherches, tout en tenant compte des réponses apportées, voici le code que j'ai pu implémenter pour répondre à mes attentes.
Ce n'est pas parfait et probablement perfectible toutefois le résultat match avec l'attendu de mon application.
Une nouvelle fois merci pour tes réponses, si tu penses pouvoir apporter davantages à cette solution, je suis preneur.
VB:
Sub exportCSV()
' Export Macro

Dim Plage As Object, oL As Object, oC As Object, Tmp As String, Sep$
sUser = Environ("username")
Sep = ";"
Set Plage = ActiveSheet.Range("A5:N5" & ActiveSheet.Range("A400").End(2).Row)
Open "ExportOF_" & Format(Date, "dd-mmmm-yyyy") & "_" & Format(Time, "hh.mm") & ".csv" For Output As #1
'Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
For Each oL In Plage.Rows
    Tmp = ""
    For Each oC In oL.Cells
        Tmp = Tmp & CStr(oC.Text) & Sep
    Next oC

    If InStr(Tmp, ";;;;;;;;;;;") Then GoTo oL
        Print #1, Tmp
oL:
Next oL

MsgBox "Le fichier a bien été exporté dans c:\Users\" & sUser & "\Documents !"
Close

End Sub
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Re,
Et c'est ce que je veux éviter.
Que me conseillerais-tu ?
Merci encore de ton aide.
Je te conseillerai de relire mes réponses puis de t'interroger en dedans de toi pour chercher à appréhender ce qui t’empêche de comprendre que la présence d'un fichier exemple identique dans sa structure au fichier original, déposé par tes soins, permettrait de faire des tests en situation quasi-réelle. ;)

Ma macro a été écrite sur l'interprétation de ton message, pas en se basant sur du concret: un fichier exemple

NB:
- Je ne souhaite pas forcément supprimer les 3 premières lignes mais pas forcément les avoirs dans mon CSV ?
Où est le problème puisque ma macro créé une copie temporaire de la feuille (dont on se fout au final, non?)
Ta demande
Au final l'idéal serait que j'ai un fichier CSV où uniquement les lignes qui ont la colonne A remplies sont transposés en CSV
C'est ce que fait ma macro, non ?
 
Dernière édition:

spicken

XLDnaute Nouveau
Bonjour,
Effectivement ton fichier m'a beaucoup aidé à arriver à ce résultat. Pas tant sur le résultat mais sur la forme. Oui ma solution reste proche de ce que j'avais initialement mais la variété de solution couplé à ton regard vis à vis de mon problème m'a permis de me remettre en question sur le détail qui me manquait.
Ta solution
Seul problème que j'y ai rencontré c'est qu'il me mettait des lignes ;;;;;;;;;;; dans le fichier CSV, lorsqu'il n'y avait aucune valeur sur toute la ligne qui appartenait au fichier temporaire. (dont on se fou effectivement). Or ce détail m'était nécessaire. De plus j'avais une erreur que je n'ai pas comprise sur le "range("A5":"A50"), comme quoi la cellule était inconnu. Je n'ai pas bien compris et ne me suis pas attardé dessus.
  • De plus, le fait de mettre dans un fichier temporaire ne m'arrangeai pas car comme stipulé, j'ai de nombreuses fonctions dans mes cellules et ça faisait sauter le résultat.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@spicken
???
Je m'exprime en klingon où tu t'ingénues à ne pas comprendre... :rolleyes"

Si le demandeur (donc toi) avait joint un fichier Excel exemple et un fichier *.CSV (le résultat souhaité), nous aurions, nous les répondeurs, eu une base concrète pour tester nos macros!

A défaut de PJ, j'ai testé à l'aveugle (en devant créer moi-même de quoi tester, sans être sûr d'être dans la cible)

Sinon selon les us et coutumes, il est apprécié que le demandeur publie sa solution dans son fil pour le bénéfice de la communauté XLDienne ;)
 

Statistiques des forums

Discussions
315 146
Messages
2 116 758
Membres
112 851
dernier inscrit
nicolas418568488