Votre question
Résolu

VBA - Excel - Export CSV : lignes de ";" vides

Tags :
  • Microsoft Excel
  • Export
  • Programmation
Dernière réponse : dans Programmation
15 Mai 2015 17:49:05

Bonjour
Dans une Sub VBA j'exporte en csv diverses feuilles du classeur (une 10zaine).
Ces feuilles sont le résultat de liaisons depuis une feuille de saisie.
Elles comportent donc des lignes dont les cellules sont des formules.
ex : (= si(FeuilSaisie!A1<>"";FeuilSaisie!A1;"")
Les formules sont "tirées" sur 500 lignes, mais les données qu'elles "récupèrent" depuis la feuille de saisie s'étalent entre 150 et 500 lignes suivant le cas.
J'utilise "not IsEmpy" pour trouver la dernière ligne "non-vide" Mais il semble que IsEmpty considère qu'une cellule avec une formule n'est pas "vide" même si la formule ramène "".
Les fichiers csv une fois créés comportent alors entre 0 et 350 lignes de ";" sans données.
Comment faire pour que les lignes sans données des feuilles excel, mais qui comportent des formules ne soient pas exportées.
Cette procédure s'inscrit dans un ensemble de processus que différents utilisateurs mettent en oeuvre. Il n'est pas possible de leur demander de faire un "copier-coller" pour des raisons fonctionnelles
J'ai simplifié le code présenté ici qui comporte des lignes en sus notamment des filtres sur le nom de la feuille pour en différencier les colonnes à exporter.
Merci pour toute idée technique.
SVP, pas d'idée fonctionnelle, si je fais ainsi c'est que je suis tributaire d'autres fonctionnements
Cordialement
CoolRider

  1.  


Sub export(Feuilnote As String, chemin As String)
' export au format "csv"

' appelé par la form "nomdesfeuilles" paramètres reçus : le nom de la feuille à exporter et le chemin
'
Sep = ";"

NomFic = ThisWorkbook.Name
LonFic = Len(NomFic)
LonFic = LonFic - 5
NomFic = Left(NomFic, LonFic)

Sheets(Feuilnote).Select
Lig = 1 'première ligne à vérifier
Do While Not IsEmpty(Range("A" & Lig))
Lig = Lig + 1
Loop
' recherche de la dernière ligne non vide

Set Plage = ActiveSheet.Range("A1:F" & ActiveSheet.Range("A" & Lig).End(3).Row)
Open chemin & "\" & NomFic & "_" & Feuilnote & ".csv" For Output As #1
For Each oL In Plage.Rows
Tmp = ""
For Each oC In oL.Cells
Tmp = Tmp & CStr(oC.Text) & Sep
Next
Print #1, Tmp
Next
Close
' exporte les feuilles au format "csv", "nom du fichier de travail_nom de la feuille"
' Gesterr::
End Sub

[/code]

Autres pages sur : vba excel export csv lignes vides

16 Mai 2015 02:18:14

Salut,
Je pense avoir clairement compris ton problème, mais je ne suis pas certain de ma réponse.
Le "Loop" est il vraiment a la bonne place ?
Voilà ce que je lis dans ta boucle :
Tant que la Case "Ax" n'est pas vide alors incrémente numéro de ligne et après tu ferme ta boucle...
Au final ta boucle ne fait qu’incrémenter un numéro de ligne et rien d'autre..
Loop ne devrait il pas être plus loin dans ton Code ?
Pardon si je me suis trompé.
Ca fait plus de 10 ans que je n'ai plus programmé.
m
0
l

Meilleure solution

18 Mai 2015 13:35:00

Bonjour,

Voici la correction de ton code:

Sub export(Feuilnote As String, chemin As String)
' export au format "csv"

' appelé par la form "nomdesfeuilles" paramètres reçus : le nom de la feuille à exporter et le chemin
'
Sep = ";"

NomFic = ThisWorkbook.Name
LonFic = Len(NomFic)
LonFic = LonFic - 5
NomFic = Left(NomFic, LonFic)

Sheets(Feuilnote).Select
Lig = 1 'première ligne à vérifier

' A la place de cette ligne
' Do While Not IsEmpty(Range("A" & Lig))
'
LastLig = Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row

'A supprimer
'Lig = Lig + 1
'Loop
' recherche de la dernière ligne non vide

'A mettre à jour :
Set Plage = ActiveSheet.Range("A1:F" & LastLig)
Open chemin & "\" & NomFic & "_" & Feuilnote & ".csv" For Output As #1
For Each oL In Plage.Rows
Tmp = ""
For Each oC In oL.Cells
Tmp = Tmp & CStr(oC.Text) & Sep
Next
Print #1, Tmp
Next
Close
' exporte les feuilles au format "csv", "nom du fichier de travail_nom de la feuille"
' Gesterr::
End Sub
partage
Contenus similaires
22 Mai 2015 17:16:24

BernardLaurent a dit :
Salut,
Je pense avoir clairement compris ton problème, mais je ne suis pas certain de ma réponse.
Le "Loop" est il vraiment a la bonne place ?
Voilà ce que je lis dans ta boucle :
Tant que la Case "Ax" n'est pas vide alors incrémente numéro de ligne et après tu ferme ta boucle...
Au final ta boucle ne fait qu’incrémenter un numéro de ligne et rien d'autre..
Loop ne devrait il pas être plus loin dans ton Code ?
Pardon si je me suis trompé.
Ca fait plus de 10 ans que je n'ai plus programmé.


Merci de ta réponse,
Non mon code "devrait être bon", d'ailleurs lorsque je visualise par MsgBox la valeur de la dernière ligne lig a bien la bonne valeur à savoir la dernière ligne non vide.
C'est à l'écriture que l'export me rajoute les lignes vides de données mais comportant des formules.
Bon, j'ai fait qque chose de pas élégant, je test si j'ai une suite de ";" et si c'est le cas je n'écris pas la ligne.
En attendant mieux, ça marche.
Cordialement
CoolRider

m
0
l
22 Mai 2015 17:32:37

Jerome MULDER a dit :
Bonjour,

Voici la correction de ton code:

Sub export(Feuilnote As String, chemin As String)
' export au format "csv"

' appelé par la form "nomdesfeuilles" paramètres reçus : le nom de la feuille à exporter et le chemin
'
Sep = ";"

NomFic = ThisWorkbook.Name
LonFic = Len(NomFic)
LonFic = LonFic - 5
NomFic = Left(NomFic, LonFic)

Sheets(Feuilnote).Select
Lig = 1 'première ligne à vérifier

' A la place de cette ligne
' Do While Not IsEmpty(Range("A" & Lig))
'
LastLig = Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row

'A supprimer
'Lig = Lig + 1
'Loop
' recherche de la dernière ligne non vide

'A mettre à jour :
Set Plage = ActiveSheet.Range("A1:F" & LastLig)
Open chemin & "\" & NomFic & "_" & Feuilnote & ".csv" For Output As #1
For Each oL In Plage.Rows
Tmp = ""
For Each oC In oL.Cells
Tmp = Tmp & CStr(oC.Text) & Sep
Next
Print #1, Tmp
Next
Close
' exporte les feuilles au format "csv", "nom du fichier de travail_nom de la feuille"
' Gesterr::
End Sub


Merci Jérôme,
C'est une solution sympatique, mais malheureusement, j'ai le même résukltat. A savoir pour toutes mes lignes vides de données mais qui comportent une formule, mon csv comporte des lignes de ce type ";;;;;;;;"
Comme pour mon code ou je visualisais (pour debug) la valeur de Lig j'avais bien le n° de la dernière ligne avec des données, avec ton code si je visualise lastlig j'ai bien le n° de la dernière ligne avec des données. Mais comme pour mon code à l'écriture je me retrouve avec des ";;;;;;" pour toutes les lignes qui sont vides données mais comportent une formule.
Bon j'ai fait un truc pas élégant mais qui marche : avant l'écriture physique, je teste si ma ligne dans tmp n'est pas ";;;;;;" et je n'écrit que si le test est thrue.
Cordialement
CoolRider
m
0
l
22 Mai 2015 17:37:35

Coucou Je ne sais pas comment clore le sujet
Merci de me le rappeler
CoolRider
m
0
l