Résolu VBA - Excel - Export CSV : lignes de ";" vides

  • Auteur de la discussion 900div
  • Date de début

900div

Nouveau membre
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

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
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]
 

BernardLaurent

Expert
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é.
 

Jerome MULDER

Habitué
Meilleure réponse
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
 

900div

Nouveau membre


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

 

900div

Nouveau membre


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
 

900div

Nouveau membre
Coucou Je ne sais pas comment clore le sujet
Merci de me le rappeler
CoolRider
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 059
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut