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 SubJ'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
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").ValueComment 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 SubOui 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.
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.
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 =NothingBonjour 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