Modification d'une VBA pour obtention d'un fichier .csv avec 3 lignes
Bonjour,
Dans notre environnement de travail, nous utilisons un tableau Excel avec des macros.
La personne qui était calée en VBA a quitté l'entreprise.
Je souhaite améliorer le tableur. Il est déjà en forme, mais comment modifier VBA pour prendre en compte mes changements, je ne sais pas trop.
Je vous partage les captures d'écran de ce qui est existant aujourd'hui, et ce que j'ai modifié ainsi que la VBA actuelle et celle que j'ai changée.
Je ne viens pas ici pour obtenir quelque chose de tout de la part de cerveau en VBA, mais je souhaiterai également acquérir un peu d'expérience sur ce sujet.
J'ai consulté les cours mais y a plein de choses dans la macro actuelle qui ne sont pas abordées.
Sur la macro, il y a un ordre à respecter sur la position des données.
La macro doit reposer sur la présence ou non de données en cellule K6/K7/K8.
Si y a quelques choses en K8 (sous entendu y a déjà des données en K6 e K7), il faut qu'en A1 à l'extraction, y est telles types de données, en A2, pareil et en A3 pareil. En suivant la position des données dans chacune des trois lignes.
Si pas de données en K8 mais en K6 et K7, alors extraction en A1 et A2.
Et si seulement en K6, alors compiler des données en A1 uniquement. J'ai vu des fonctions avec If (not) IsEmpty, avec une condition And.
Fichier excel actuel :
Fichier excel futur :
VBA actuelle :
Sub creer_logisticoms()
Dim codeNDP, Client_Exp, Code_dest, Factur, Camion, Dossier, Code_Exp, chemin, nom_fichier_logisticom, code_ENT As String
Dim Colis, PoidsBrut, PoidsNet, Valeur
Dim ladate, Datefacture As Date
Dim mafeuille As Worksheet
chemin = "J:\Flux_Douane\" 'indication du répertoire temporaire de dépose des fichiers logisticoms, ici en prod
Set mafeuille = ActiveSheet
ThisWorkbook.Sheets("Extrac").Activate
Cells.Select
Selection.ClearContents
lig = ThisWorkbook.Sheets("Extrac").Range("A1").CurrentRegion.Rows.Count
mafeuille.Activate
If Range("F26") = "1 Exped. / 1 Fact." Then code_ENT = "DJ" Else code_ENT = "PS" 'modifier. Peu importe, ca sera du DJ
For Each c In ActiveSheet.Range("A6:A25").Cells 'ici que A6
If c.Value <> "" Then
Client_Exp = c.Value
Colis = c.Offset(0, 1).Value
PoidsBrut = c.Offset(0, 2).Value
PoidsNet = c.Offset(0, 3).Value
Valeur = c.Offset(0, 4).Value
Facture = c.Offset(0, 5).Value
Datefacture = c.Offset(0, 6).Value
Code_Exp = c.Offset(0, 7).Value
Code_dest = Range("D1").Value
codeNDP = Range("G3").Value
Camion = Range("B30").Value
Dossier = Range("B32").Value
SITECODE = Range("F2").Value
If Dossier = "" Then Dossier = Camion
ladate = Range("B28").Value
If ladate = 0 Then ladate = Range("F28").Value
If Code_Exp = "" Then
MsgBox ("Pas de code exportateur créé pour " & Client_Exp & " - Arrêt de la procédure")
Exit Sub
End If
If Camion = "" And Dossier = "" Then
MsgBox ("Une référence dossier est obligatoire si pas de n° de Camion - Arrêt de la procédure")
Exit Sub
End If
If Code_dest = "" Then
MsgBox ("Aucun Destinataire indiqué - Arrêt de la procédure")
Exit Sub
End If
If codeNDP = "" Then
MsgBox ("Code NDP obligatoire pour les logisticoms - Arrêt de la procédure")
Exit Sub
End If
' copie des infos sur la feuille extrac
If Camion = "" Then Camion = "GROUPAGE"
ThisWorkbook.Sheets("Extrac").Range("A" & lig).Value = Facture
ThisWorkbook.Sheets("Extrac").Range("B" & lig).Value = Dossier
ThisWorkbook.Sheets("Extrac").Range("C" & lig).Value = CStr(ladate)
ThisWorkbook.Sheets("Extrac").Range("D" & lig).Value = Camion
ThisWorkbook.Sheets("Extrac").Range("E" & lig).Value = Code_dest
ThisWorkbook.Sheets("Extrac").Range("F" & lig).Value = Code_Exp
ThisWorkbook.Sheets("Extrac").Range("G" & lig).Value = Colis
ThisWorkbook.Sheets("Extrac").Range("H" & lig).Value = PoidsBrut
ThisWorkbook.Sheets("Extrac").Range("I" & lig).Value = PoidsNet
ThisWorkbook.Sheets("Extrac").Range("J" & lig).Value = Valeur
ThisWorkbook.Sheets("Extrac").Range("K" & lig).Value = codeNDP
ThisWorkbook.Sheets("Extrac").Range("L" & lig).Value = CStr(Datefacture)
ThisWorkbook.Sheets("Extrac").Range("M" & lig).Value = code_ENT
ThisWorkbook.Sheets("Extrac").Range("N" & lig).Value = SITECODE
lig = lig + 1
End If
Next
ThisWorkbook.Sheets("Extrac").Activate
ActiveSheet.Range("A1").CurrentRegion.Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
nom_fichier_logisticom = Dossier & ".csv"
ActiveWorkbook.SaveAs Filename:=chemin & nom_fichier_logisticom, _
FileFormat:=xlCSV, CreateBackup:=False
ActiveWorkbook.Close SaveChanges:=False
ThisWorkbook.Sheets("Extrac").Activate
Cells.Select
Selection.ClearContents
Range("A1").Select
mafeuille.Activate
MsgBox ("Fichier des Logisticoms du dossier " & Dossier & " créé dans le répertoire d'importation serveur - Impression de la feuille X2")
impression
End SubMes modifications ci-dessous
Dans Dim, quand y a un 1 c'est en référence à la ligne, un 2 aux données de la ligne 7 et un 3 pour la ligne 8.
Avec As String, j'ai vu que c'est que du texte, donc c'est le cas ici avec l'ajout/modification de plusieurs nouvelles références
Avec As Long, données numériques, des valeurs peuvent dépasser les 32767.
Sub creer_logisticoms_vd()
Dim codeNDP1, codeNDP2, codeNDP3, Client_Exp, Code_dest, Facture1, Facture2, Facture3, Gratuit1, Gratuit2, Gratuit3, Camion, Dossier, Code_Exp, chemin, nom_fichier_logisticom, code_ENT As String
Dim Colis, PB1, PB2, PB3, PN1, PN2, PN3, Valeur1, Valeur2, Valeur3, Devise, Usup1, Usup2, Usup3, EnteteG, Colis1, Colis2, Colis3 As Long
'PB/PN poids brut et poids net, EnteteG = tout le logisticom
Dim ladate, DateF1, DateF2, DateF3, As Date 'F=facture
End SubEnsuite, pour cette partie je ne comprends pas tout pour le Dim et le Set.
Dim mafeuille As Worksheet
chemin = "J:\Flux_Integration\" 'indication du répertoire temporaire de dépose des fichiers logisticoms, ici en prod
Set mafeuille = ActiveSheet
ThisWorkbook.Sheets("Extrac").Activate
Cells.Select
Selection.ClearContentsIci RAS
mafeuille.Activate
'Le code entreprise sera toujours DJ - Suppression PS
code_ENT = "DJ"Là, ca se gatte... A partir de la partie commençant par ThisWorkbook, c'est l'ordre qu'il faut conserver. C'est paramétré ainsi dans la zone test, interne dans l'entreprise.
'Si ndp présente en cellule K8 alors
If Not IsEmpty(Range("K8")) Then
'NDP EN K6 ALORS METTRE EN CELLULE A1 DE L'EXTRAC
lig = ThisWorkbook.Sheets("Extrac").Range("A1").CurrentRegion.Rows.Count
'L'exportateur n'est qu'en cellule A6
For Each c In ActiveSheet.Range("A6").Cells
Client_Exp = c.Value
Colis1 = Range("B6").Value
PB1 = Range("C6").Value
PN1 = Range("D6").Value
Valeur1 = Range("E6").Value
Facture1 = Range("F6").Value
DateF1 = Range("G6").Value
Type1 = Range("H6").Value
Gratuit1 = Range("I6").Value
If Gratuit1 = "" Then Gratuit1 = 0 'Si la case I6 est vide alors il met un 0
Code_Exp = Range("B2").Value
Code_dest = Range("D2").Value
codeNDP1 = Range("K6").Value
Camion = Range("B11").Value
Dossier = Range("A17").Value
SITECODE = Range("F2").Value
ladate = Range("K12").Value
Usup1 = Range("M6").Value
ThisWorkbook.Sheets("Extrac").Range("A" & lig).Value = Facture1 '=ExpNum ' copie des infos sur la feuille extrac
ThisWorkbook.Sheets("Extrac").Range("B" & lig).Value = Dossier
ThisWorkbook.Sheets("Extrac").Range("C" & lig).Value = CStr(ladate) 'la date de création du logisticom reprise en cellule K12
ThisWorkbook.Sheets("Extrac").Range("D" & lig).Value = Camion
ThisWorkbook.Sheets("Extrac").Range("E" & lig).Value = Code_dest
ThisWorkbook.Sheets("Extrac").Range("F" & lig).Value = Code_Exp
ThisWorkbook.Sheets("Extrac").Range("G" & lig).Value = Colis1
ThisWorkbook.Sheets("Extrac").Range("H" & lig).Value = PB1
ThisWorkbook.Sheets("Extrac").Range("I" & lig).Value = PN1
ThisWorkbook.Sheets("Extrac").Range("J" & lig).Value = Valeur1
ThisWorkbook.Sheets("Extrac").Range("K" & lig).Value = codeNDP1
ThisWorkbook.Sheets("Extrac").Range("L" & lig).Value = CStr(DateF1) '= Date facture 1
ThisWorkbook.Sheets("Extrac").Range("M" & lig).Value = code_ENT
ThisWorkbook.Sheets("Extrac").Range("N" & lig).Value = SITECODE
ThisWorkbook.Sheets("Extrac").Range("O" & lig).Value = Usup1
ThisWorkbook.Sheets("Extrac").Range("P" & lig).Value = Range("I9").Value 'Tout le logisticom en gratuit?
ThisWorkbook.Sheets("Extrac").Range("Q" & lig).Value = Gratuit1
ThisWorkbook.Sheets("Extrac").Range("R" & lig).Value = Range("I10").Value 'Devise
ThisWorkbook.Sheets("Extrac").Range("S" & lig).Value = Range("H6").Value '=CodeDoc
ThisWorkbook.Sheets("Extrac").Range("T" & lig).Value = Range("F6").Value '=ReferenceDoc
ThisWorkbook.Sheets("Extrac").Range("U" & lig).Value = Range("G6").Value '=DateDoc
lig = lig + 1
NextAprès est-ce ainsi qu'il faut poursuivre pour mettre en A2 et A3 ?
Il y a peut-être un moyen d'éviter toutes ces répétitions ?
'si pas de ndp en k8 mais ndp en celulle k7 - elseif
If IsEmpty(Range("K8")) And Not IsEmpty(Range("K7")) Then
'NDP EN K6
lig = ThisWorkbook.Sheets("Extrac").Range("A1").CurrentRegion.Rows.Count
'L'exportateur n'est qu'en cellule A6
For Each c In ActiveSheet.Range("A6").Cells
Client_Exp = c.Value
Colis1 = Range("B6").Value
PB1 = Range("C6").Value
PN1 = Range("D6").Value
Valeur1 = Range("E6").Value
Facture1 = Range("F6").Value
DateF1 = Range("G6").Value
Type1 = Range("H6").Value
Gratuit1 = Range("I6").Value
If Gratuit1 = "" Then Gratuit1 = 0 'Si la case I6 est vide alors il met un 0
Code_Exp = Range("B2").Value
Code_dest = Range("D2").Value
codeNDP1 = Range("K6").Value
Camion = Range("B11").Value
Dossier = Range("A17").Value
SITECODE = Range("F2").Value
ladate = Range("K12").Value
Usup1 = Range("M6").Value
ThisWorkbook.Sheets("Extrac").Range("A" & lig).Value = Facture1 '=ExpNum
ThisWorkbook.Sheets("Extrac").Range("B" & lig).Value = Dossier
ThisWorkbook.Sheets("Extrac").Range("C" & lig).Value = CStr(ladate) 'la date de création du logisticom reprise en cellule K12
ThisWorkbook.Sheets("Extrac").Range("D" & lig).Value = Camion
ThisWorkbook.Sheets("Extrac").Range("E" & lig).Value = Code_dest
ThisWorkbook.Sheets("Extrac").Range("F" & lig).Value = Code_Exp
ThisWorkbook.Sheets("Extrac").Range("G" & lig).Value = Colis1
ThisWorkbook.Sheets("Extrac").Range("H" & lig).Value = PB1
ThisWorkbook.Sheets("Extrac").Range("I" & lig).Value = PN1
ThisWorkbook.Sheets("Extrac").Range("J" & lig).Value = Valeur1
ThisWorkbook.Sheets("Extrac").Range("K" & lig).Value = codeNDP1
ThisWorkbook.Sheets("Extrac").Range("L" & lig).Value = CStr(DateF1) '= Date facture 1
ThisWorkbook.Sheets("Extrac").Range("M" & lig).Value = code_ENT
ThisWorkbook.Sheets("Extrac").Range("N" & lig).Value = SITECODE
ThisWorkbook.Sheets("Extrac").Range("O" & lig).Value = Usup1
ThisWorkbook.Sheets("Extrac").Range("P" & lig).Value = Range("I9").Value 'Tout le logisticom en gratuit?
ThisWorkbook.Sheets("Extrac").Range("Q" & lig).Value = Gratuit1
ThisWorkbook.Sheets("Extrac").Range("R" & lig).Value = Range("I10").Value 'Devise
ThisWorkbook.Sheets("Extrac").Range("S" & lig).Value = Range("H6").Value '=CodeDoc
ThisWorkbook.Sheets("Extrac").Range("T" & lig).Value = Range("F6").Value '=ReferenceDoc
ThisWorkbook.Sheets("Extrac").Range("U" & lig).Value = Range("G6").Value '=DateDoc
lig = lig + 1
Next
'NDP EN K7
lig = ThisWorkbook.Sheets("Extrac").Range("A2").CurrentRegion.Rows.Count
Client_Exp = c.Value
Colis2 = 0
PB2 = Range("C7").Value
PN2 = Range("D7").Value
Valeur2 = Range("E7").Value
Facture2 = Range("F7").Value
DateF2 = Range("G7").Value
Type2 = Range("H7").Value
Gratuit2 = Range("I7").Value
If Gratuit2 = "" Then Gratuit1 = 0 'Si la case I6 est vide alors il met un 0
End If
Code_Exp = Range("B2").Value
Code_dest = Range("D2").Value
codeNDP2 = Range("K7").Value
Camion = Range("B11").Value
Dossier = Range("A17").Value
SITECODE = Range("F2").Value
ladate = Range("K12").Value
Usup2 = Range("M7").Value
ThisWorkbook.Sheets("Extrac").Range("A" & lig).Value = Facture2 '=ExpNum
ThisWorkbook.Sheets("Extrac").Range("B" & lig).Value = Dossier
ThisWorkbook.Sheets("Extrac").Range("C" & lig).Value = CStr(ladate) 'la date de création du logisticom reprise en cellule K12
ThisWorkbook.Sheets("Extrac").Range("D" & lig).Value = Camion
ThisWorkbook.Sheets("Extrac").Range("E" & lig).Value = Code_dest
ThisWorkbook.Sheets("Extrac").Range("F" & lig).Value = Code_Exp
ThisWorkbook.Sheets("Extrac").Range("G" & lig).Value = Colis2
ThisWorkbook.Sheets("Extrac").Range("H" & lig).Value = PB2
ThisWorkbook.Sheets("Extrac").Range("I" & lig).Value = PN2
ThisWorkbook.Sheets("Extrac").Range("J" & lig).Value = Valeur2
ThisWorkbook.Sheets("Extrac").Range("K" & lig).Value = codeNDP2
ThisWorkbook.Sheets("Extrac").Range("L" & lig).Value = CStr(DateF2) '= Date facture 2
ThisWorkbook.Sheets("Extrac").Range("M" & lig).Value = code_ENT
ThisWorkbook.Sheets("Extrac").Range("N" & lig).Value = SITECODE
ThisWorkbook.Sheets("Extrac").Range("O" & lig).Value = Usup2
ThisWorkbook.Sheets("Extrac").Range("P" & lig).Value = Range("I9").Value 'Tout le logisticom en gratuit?
ThisWorkbook.Sheets("Extrac").Range("Q" & lig).Value = Gratuit1
ThisWorkbook.Sheets("Extrac").Range("R" & lig).Value = Range("I10").Value 'Devise
ThisWorkbook.Sheets("Extrac").Range("S" & lig).Value = Range("H7").Value '=CodeDoc
ThisWorkbook.Sheets("Extrac").Range("T" & lig).Value = Range("F7").Value '=ReferenceDoc
ThisWorkbook.Sheets("Extrac").Range("U" & lig).Value = Range("G7").Value '=DateDoc
lig = lig + 1
'si non, sous entendu que y a que en k6 une ndp - else
Else
'NDP EN K6
lig = ThisWorkbook.Sheets("Extrac").Range("A1").CurrentRegion.Rows.Count
Client_Exp = c.Value
Colis1 = Range("B6").Value
PB1 = Range("C6").Value
PN1 = Range("D6").Value
Valeur1 = Range("E6").Value
Facture1 = Range("F6").Value
DateF1 = Range("G6").Value
Type1 = Range("H6").Value
Gratuit1 = Range("I6").Value
If Gratuit1 = "" Then Gratuit1 = 0 'Si la case I6 est vide alors il met un 0
End If
Code_Exp = Range("B2").Value
Code_dest = Range("D2").Value
codeNDP1 = Range("K6").Value
Camion = Range("B11").Value
Dossier = Range("A17").Value
SITECODE = Range("F2").Value
ladate = Range("K12").Value
Usup1 = Range("M6").Value
ThisWorkbook.Sheets("Extrac").Range("A" & lig).Value = Facture1 '=ExpNum
ThisWorkbook.Sheets("Extrac").Range("B" & lig).Value = Dossier
ThisWorkbook.Sheets("Extrac").Range("C" & lig).Value = CStr(ladate) 'la date de création du logisticom reprise en cellule K12
ThisWorkbook.Sheets("Extrac").Range("D" & lig).Value = Camion
ThisWorkbook.Sheets("Extrac").Range("E" & lig).Value = Code_dest
ThisWorkbook.Sheets("Extrac").Range("F" & lig).Value = Code_Exp
ThisWorkbook.Sheets("Extrac").Range("G" & lig).Value = Colis1
ThisWorkbook.Sheets("Extrac").Range("H" & lig).Value = PB1
ThisWorkbook.Sheets("Extrac").Range("I" & lig).Value = PN1
ThisWorkbook.Sheets("Extrac").Range("J" & lig).Value = Valeur1
ThisWorkbook.Sheets("Extrac").Range("K" & lig).Value = codeNDP1
ThisWorkbook.Sheets("Extrac").Range("L" & lig).Value = CStr(DateF1) '= Date facture 1
ThisWorkbook.Sheets("Extrac").Range("M" & lig).Value = code_ENT
ThisWorkbook.Sheets("Extrac").Range("N" & lig).Value = SITECODE
ThisWorkbook.Sheets("Extrac").Range("O" & lig).Value = Usup1
ThisWorkbook.Sheets("Extrac").Range("P" & lig).Value = Range("I9").Value 'Tout le logisticom en gratuit?
ThisWorkbook.Sheets("Extrac").Range("Q" & lig).Value = Gratuit1
ThisWorkbook.Sheets("Extrac").Range("R" & lig).Value = Range("I10").Value 'Devise
ThisWorkbook.Sheets("Extrac").Range("S" & lig).Value = Range("H6").Value '=CodeDoc
ThisWorkbook.Sheets("Extrac").Range("T" & lig).Value = Range("F6").Value '=ReferenceDoc
ThisWorkbook.Sheets("Extrac").Range("U" & lig).Value = Range("G6").Value '=DateDoc
lig = lig + 1Ici je devrais m'en être sorti
If Camion = "" Then
MsgBox ("Il manque la plaque d'immatriculation du camion")
If c.Value = "" Then
MsgBox ("Il manque le nom de l'exportateur en cellule A6")
End IfEt enfin cette partie, je comprends pas grand chose :( et qu'il faut certainement modifier)
ThisWorkbook.Sheets("Extrac").Activate
ActiveSheet.Range("A1:A3").CurrentRegion.Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
nom_fichier_logisticom = Dossier & ".csv"
ActiveWorkbook.SaveAs Filename:=chemin & nom_fichier_logisticom
ActiveWorkbook.Close SaveChanges:=False
ThisWorkbook.Sheets("Extrac").Activate
Cells.Select
Selection.ClearContents
Range("A1").Select
mafeuille.Activate
MsgBox ("Fichier des Logisticoms du dossier " & Dossier & " créé dans le répertoire d'importation serveur - Impression de la feuille X1")
impression
End SubJ'ai fait un test, en lançant play. J'ai l'erreur suivante : Erreur de compilation, Bloc If sans End If
Merci pour votre précisieuse aide et conseil
Sans le fichier que vous a laissé votre prédécesseur en état de fonctionner, je ne vois pas comment on pourrait vous aider.
Pour commencer, je suis assez étonné que la macro "creer_logisticoms()" commence par détruire tout ce que contient l'onglet "Extrac". C'est ce que signifie le code
ThisWorkbook.Sheets("Extrac").Activate
Cells.Select
Selection.ClearContentspour demander juste après combien de lignes sont occupées.
lig = ThisWorkbook.Sheets("Extrac").Range("A1").CurrentRegion.Rows.CountBonsoir Optimix,
Merci pour votre réponse et d'avoir consacré un petit peu de temps à ma demande. Je vous joins le fichier.
J'avouerais que votre premier message je comprends pas tout sur les 3 lignes sur la macro (actions qui en découlent et vous a permis de conclure ceci). Peut-être qu'avec le fichier vous trouverez réponse.
Concernant la destruction, c'est peut--être parce qu'en créant un autre fichier au format .csv, ca clear les données de l'onglet extract pour continuer à travailler dessus et créer d'autres csv avec des données différentes (selon les factures que l'on reçoit des exportateurs)
Merci par avance,
Le fichier que vous avez mis en ligne n'est pas celui que votre prédécesseur a laissé derrière lui. Le nom de l'onglet "ANCIENNE VERSION" était différent.
Avez-vous une sauvegarde de ce fichier avant que vous ne cherchiez à l'améliorer ?
Je confirme que l'onglet Extrac est un onglet temporaire. On peut s'en passer, car il est possible de créer directement le fichier CSV sans avoir recours à un copier-coller ultra-laborieux.
1) Dans la nouvelle version, j'aurais besoin que vous complétiez ou confirmiez la place exacte des champs à mettre dans le fichier csv.
- N° Facture : J2 ?
- Dossier : B12 ?
- Date de départ : L2 ou C13 si L2 est vide ?
- Camion : B11
- Code destinataire : D2
- Code expéditeur : B12 ?
- Colis : B9
- Poids Brut : C9
- Poids Net : D9
- Valeur : E9
- Code NDP : ?
- Date facture : L12
- Code ENT : toujours DJ ?
- SITECODE : F2
2) Je suppose que la cellules B2 n'est pas utile dans le fichier CSV.
3) Enfin, j'ai cru comprendre que la procédure creer_logiticoms () avait été écrite par votre prédécesseur et que creer_logiticoms_vd () était de vous. Vous confirmez ?
Une réponse aux questions que je vous avais posées m'aurait permis de comprendre que vous souhaitiez changer le format (les champs) du fichier CSV en question.
Je n'ai pas encore implémenté la fonction de sauvegarde au format CSV pour être sûr du contenu de l'onglet "Extrac". Testez la macro ci-dessous et dites-moi si le contenu est celui attendu. Ne vous occupez pas de la barre des titres, elle ne sert que pour la phase de développement.