Limiter l'export .csv aux lignes remplies

Bonjour à tous,

J'ai de nouveau besoin de vos conseils d'expert pour finaliser mon module de commande.

Pour expliquer brièvement, l'utilisateur saisi ses lignes de commandes, qui sont exportées en .csv pour être par la suite important dans un logiciel.

Le nombre de ligne de commande est donc aléatoire.

J'aimerai que seule les lignes remplies soient exporter, car dans mon .csv actuel je me retrouve avec tas de lignes contenant ";;;;;;;;;;;;;;"

Débutant en VBA, je pense que cela vient de ma manière de recopier mes données (avec la plage B2:B1000 par exemple)

Voici mon code actuel :

Sub commander()
Feuil9.Range("B2:B1000").Value = Feuil3.Range("F12:F1000").Value
Feuil9.Range("E2:E1000").Value = Feuil3.Range("D12:D1000").Value
Feuil9.Range("F2:F1000").Value = Feuil3.Range("E12:E1000").Value
Feuil9.Range("G2:G1000").Value = Feuil3.Range("G12:G1000").Value
Feuil9.Range("H2:H1000").Value = Feuil3.Range("I12:I1000").Value
Feuil9.Range("I2:I1000").Value = Feuil3.Range("J12:J1000").Value
Feuil9.Range("J2:J1000").Value = Feuil3.Range("T12:T1000").Value
Feuil9.Range("K2:K1000").Value = Feuil3.Range("K12:K1000").Value
Feuil9.Range("L2:L1000").Value = Feuil3.Range("M12:M1000").Value
Feuil9.Range("M2:M1000").Value = Feuil3.Range("N12:N1000").Value
Feuil9.Range("N2:N1000").Value = Feuil3.Range("O12:O1000").Value
Feuil9.Range("O2:O1000").Value = Feuil3.Range("P12:P1000").Value
Feuil11.Range("B2:B1000").Value = Feuil3.Range("J12:J1000").Value
Feuil11.Range("C2:C1000").Value = Feuil3.Range("K12:K1000").Value
Feuil11.Range("D2:D1000").Value = Feuil3.Range("T12:T1000").Value
Feuil11.Range("E2:E1000").Value = Feuil3.Range("S12:S1000").Value

Dim Target As Worksheet, Source As Worksheet, DL As Long, w As Range
Set Source = ActiveWorkbook.Worksheets("SAISIE COMMANDE")
Set Target = ActiveWorkbook.Worksheets("SUIVI COMMANDE")

j = Target.Range("A1000000").End(xlUp).Row + 1
DL = Source.Range("A" & Rows.Count).End(xlUp).Row
    For Each w In Source.Range("A12:A" & DL)
        If w.Value <> "" Then
           Source.Cells(w.Row, 1).Resize(, 20).Copy Target.Cells(j, 1)
           j = j + 1
        End If
    Next

Dim Chemin As String, NomFichier As String
 Dim extension As String

  Application.ScreenUpdating = False

      Chemin = "S:\Centrale d'achat\COMMANDE\"
   extension = ".csv"
   On Error Resume Next
    MkDir Chemin
     On Error GoTo 0
      NomFichier = "commande " & Feuil3.Cells(12, 7).Text & extension
      Feuil9.Copy

    With ActiveWorkbook
    .SaveAs Filename:=Chemin & NomFichier, FileFormat:=xlCSV, CreateBackup:=False
    .Close
    End With

    MsgBox "Le fichier a bien été créé et enregistré dans le dossier COMMANDE", vbInformation

End Sub

J'ai piocher dans divers code pour arriver a faire quelque chose de fonctionnel, ce dernier n'est certainement pas optimisé.

Merci d'avance pour votre support :)

Hello,

Je pense aussi d'un coté tu as B2:B1000 et de l'autre F12:F1000, on a un delta de 10 si je ne m'abuse.

Tu peux faire ton remplissage avec un for each comme tu as fait + bas.

Qqch dans ce genre :

dim rg as range
dim cellule as range
dim i as integer

set  rg = range("F12:F1000")

i = 2

For each cellule in  rg
if not isempty(cellule) then range("B" & i) = cellule
next 

Bonjour Rag,

Seulement certaines colonnes sont reportés de ma Feuil3 à ma Feuil9, du coup je n'arrive pas a le faire de cette manière.

J'ai corrigé le décalage de 10, ce qui m'enlève en effet les #N/A en bas de mon .csv.

Peut-être faire l'inverse ? Limiter l'export du fichier .csv aux lignes remplies ?

Merci pour ton retour dans tous les cas.

En fait si tu as des vides dans ta feuil3 en feuil9 ça va afficher NA.

Pour récupérer les non vide, il faut boucler aussi pour tester le contenu

Bonsoir Rag,

J’ai dans ma feuille 3 des formules jusqu’à la ligne 600, ce qui me permet d’avoir un outil pour saisir une commande assez fonctionnel et simple pour les utilisateurs.
J’ai seulement besoin de certaines colonnes à reporter dans ma feuille 9 qui sont ensuite exporter en .csv pour être intégrer à un logiciel.
Je ne sais pas si le fait d’avoir une multitude de lignes avec uniquement des « , » à un impact sur l’import, mais j’aimerai l’éviter.

D’ailleurs, mon fichier actuel s’enregistre en .csv « , » et non pas en .csv « ; » mais je ferai certainement un autre sujet pour cela.

Merci pour ton support encore une fois

post ton fichier

Bonjour Rag,

Voici mon fichier en PJ

Pour expliquer brièvement :

- Les commandes sont saisies dans "SAISIE COMMANDE"
- Une fois convertie, les données s'envoient dans mon suivi de commande ainsi que dans les fichiers .csv pour certaines données
- Les fichiers .csv s'enregistrent automatiquement
- Effacer permet d'effacer les données de la saisie commande, des fichiers .csv mais pas du suivi commande qui lui garde une trace

Mon objectif est de supprimer les lignes exportées alors que vide dans mon fichier

Merci d'avance pour tes précieux conseils

Edit: problème entre .csv(,) et .csv(;) résolu avec local:=True

Edit2: suite à une modification de la demande, le problème se pose uniquement pour le fichier nommé "HUB_IMP_PRXVTE_" (onglet commande.csv)

Bonjour. Une première chose me surprend en l'absence de visuel sur le fichier réel.

Feuil9.Range("B2:B1000").Value = Feuil3.Range("F12:F1000").Value

Comment faire rentrer les valeurs de F12:F1000 dans une plage comptant 10 cellules de plus (B2:B1000) ?

La méthode d'ensemble me paraît fausse : en copiant les données par colonnes au lieu de le faire par lignes non vides, tu intègres les lignes vides dont tu ne veux pas en fin de process.

Bonjour Optimix,

Merci pour ton retour, ce delta a déjà été corrigé en effet.

Le problème est que dans mon "SAISIE COMMANDE", le fichier comporte 20 colonnes, mais je n'ai besoin que de 15 colonnes dans ce fichier .csv.

Les autres colonnes servent à un suivi sur d'autres onglets.

Il a été corrigé où et comment ? Renvoie ton code corrigé qu'on zieute sur les modifs.
Est-ce qu'il y a des lignes vides dans la Feuil3 ?

Voici mon code actuel :

Sub commander()
Feuil9.Range("B2:B989").Value = Feuil3.Range("F13:F1000").Value
Feuil9.Range("E2:E989").Value = Feuil3.Range("D13:D1000").Value
Feuil9.Range("F2:F989").Value = Feuil3.Range("E13:E1000").Value
Feuil9.Range("G2:G989").Value = Feuil3.Range("G13:G1000").Value
Feuil9.Range("H2:H989").Value = Feuil3.Range("I13:I1000").Value
Feuil9.Range("I2:I989").Value = Feuil3.Range("J13:J1000").Value
Feuil9.Range("J2:J989").Value = Feuil3.Range("T13:T1000").Value
Feuil9.Range("K2:K989").Value = Feuil3.Range("K13:K1000").Value
Feuil9.Range("L2:L989").Value = Feuil3.Range("M13:M1000").Value
Feuil9.Range("M2:M989").Value = Feuil3.Range("N13:N1000").Value
Feuil9.Range("N2:N989").Value = Feuil3.Range("O13:O1000").Value
Feuil9.Range("O2:O989").Value = Feuil3.Range("P13:P1000").Value

Dim Target As Worksheet, Source As Worksheet, DL As Long, w As Range
Set Source = ActiveWorkbook.Worksheets("SAISIE COMMANDE")
Set Target = ActiveWorkbook.Worksheets("SUIVI COMMANDE")

j = Target.Range("A1000000").End(xlUp).Row + 1
DL = Source.Range("A" & Rows.Count).End(xlUp).Row
    For Each w In Source.Range("A13:A" & DL)
        If w.Value <> "" Then
           Source.Cells(w.Row, 1).Resize(, 20).Copy Target.Cells(j, 1)
           j = j + 1
        End If
    Next

Dim Chemin As String, NomFichier As String
 Dim extension As String

  Application.ScreenUpdating = False

      Chemin = "S:\COMMANDE\HISTORIQUE\"
   extension = ".csv"
   On Error Resume Next
    MkDir Chemin
     On Error GoTo 0
      NomFichier = "PRXVTE_" & Feuil3.Cells(10, 3).Text & extension
      Feuil9.Copy

    With ActiveWorkbook
    .SaveAs Filename:=Chemin & NomFichier, FileFormat:=xlCSV, local:=True, CreateBackup:=False
    .Close
    End With

    MsgBox "Fichier disponible dans le dossier COMMANDE\HISTORIQUE", vbInformation

End Sub

Oui il y a des lignes vides, j'ai 600 lignes avec des formules, mais en réalité seulement 13 avec des données par exemple. (Le fichier sera remis a zéro tous les jours)

Ce seront des utilisateurs divers qui saisieront les commandes, c'est plus simple si ils n'ont rien a touché dessus.

Une proposition, sans grande conviction.

8csv.xlsm (81.79 Ko)

Bonjour Optimix, merci pour ton retour.

Malheureusement, les lignes n'étant pas vides puisqu'elle contienne des formules, cela ne marche pas.

J'ai mis une formule qui permet de compter le nombre de lignes non vides, a un endroit ou l'utilisateur doit saisir du texte (il n'y a donc pas sa formule).
Dans mon exemple il y a 13 lignes.
Est-il possible d'adapter mon code en disant de ne copier que le nombre de ligne compté dans ma cellule H10 ?

Merci encore pour votre aide

Quand je t'ai demandé s'il y avait des lignes vides, ce sont des lignes n'ayant réellement aucun contenu, donc même pas une formule.

Non, le nombre global de lignes "un peu vides" en H10 ne sert à rien car on ne sait pas quelles sont celles qu'il faut virer. Je zieute ça.

Autant pour moi alors, je me suis mal exprimé.

Pour ce que je disais plus haut, ou l'on compte le nombre de cellule non vide, voici un exemple
En gros mon idée était par exemple de dire de copier G13:G12+Nombre en H10

exemple

Mais je comprend si ce n'est pas faisable.

Merci pour ta réactivité

Fais un essai en remplaçant CountA par Count pour voir.

C'est mieux avec le Count.

Mais cela me supprime les titres sur la feuille ou les données sont collées.

J'aurais besoin que cela vienne se coller sur la ligne 2, sans supprimer la ligne 1, et sans prendre la ligne 12 de mon document initial, donc pas mal de contrainte.
J'ai essayé de bidouiller un peu le code mais sans succès.

Bonjour thoms5G

J'ajoute mon grain de sel (pardon, excuses, ...) , et je me retire car Optimix tient le sujet depuis le début

Ce type de problème je l'ai déjà rencontré et sans voir exactement comment Optimix l'a traité , j'aurai fait un traitement vbScript pour retirer les lignes vides

L'avantage du VBScript c'est transposable en VBA, nul besoin de Excel , donc valable pour tout export, y compris Google Sheet et j'en passe

On lance le traitement facilement cscript Nom_du_script fichier_CSV_entree fichier_csv_sortie

Je sais le faire aussi en posershell pour ceux qui veulent

Copier le texte ci-dessous dans le fichier "nom_du_script" à vous de lui donner un nom

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0

sepCSV = ";"
Set objArgs= WScript.Arguments
sFileIn= objArgs(0)
sFileOut= objArgs(1)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objInputFile = objFSO.OpenTextFile(sFileIn, ForReading) '=1
Set objOutputFile = objFSO.OpenTextFile (sFileOut, ForAppending, True, TristateFalse)

Do While (objInputFile.AtEndOfStream = False)
strLine = objInputFile.ReadLine
if not Replace(strLine,sepCSV,"") = "" Then
objOutputFile.WriteLine strLine
End if
intLine=intLine+1
Loop
objOutputFile.Close
objInputFile.Close
Set objOutputFile =Nothing
Set objInputFile =Nothing

Bonjour Scraper,

Merci pour ton retour !
Pour être honnête je n'ai pas compris grand chose .

Dans l'idée, il faut que je traite le fichier .csv que j'ai exporté avec cela pour pouvoir supprimer les lignes c'est ça ?

Mon fichier .csv sera exporter directement sur un serveur pour être importé dans un logiciel tiers, ça ne m'arrange pas spécialement d'ajouter cette étape

Le même script en VBA à insérer dans Excel

On remplace

les lignes

Set objArgs= WScript.Arguments
sFileIn= objArgs(0)
sFileOut= objArgs(1)

par la ligne Sub et on ajoute End Sub à la fin

Et on l'appelle avec

Call RemoveEmptyLines( fichier_en_entrée, fichier_en_sortie)

Sub RemoveEmptyLines(sFileIn as String, sFileOut as String)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0

sepCSV = ";"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objInputFile = objFSO.OpenTextFile(sFileIn, ForReading) '=1
Set objOutputFile = objFSO.OpenTextFile (sFileOut, ForAppending, True, TristateFalse)

Do While (objInputFile.AtEndOfStream = False)
strLine = objInputFile.ReadLine
if not Replace(strLine,sepCSV,"") = "" Then
objOutputFile.WriteLine strLine
End if
intLine=intLine+1
Loop
objOutputFile.Close
objInputFile.Close
Set objOutputFile =Nothing
Set objInputFile =Nothing
End Sub
Rechercher des sujets similaires à "limiter export csv lignes remplies"