Macro de mise en forme
Bonjour,
Je perds beaucoup de temps chaque jour à transformer des factures en listes de colisage pour mon boulot...
J'aimerais me créer une macro qui me permette de faire le boulot beaucoup plus vite mais tous mes essais en essayant d'enregistrer une macro sont loin de me satisfaire, notamment parce que les caractéristiques du fichier de départ sont variables...
En fichier joins un exemple de facture en feuille1 avec le résultat attendu en feuille 3.
Voici les étapes que doit effectuer la macro :
1 - Couper les données de la colonne C (en dessous de Total Blles) et les coller en colonne A
2 - Insérer en colonne C la formule =Ax*Bx (dans ce cas =A25*B25) puis l’étendre jusqu’en bas du tableau uniquement sur les lignes non vides en A….sachant que le nbre de ligne vides entre chaque ligne non vide est variable, tout comme la longueur du tableau….
Pour délimiter le haut du tableau je pense que l'on peut utiliser comme référentiel les en tête de colonne et pour le bas la cellule "Tous les montants sont exprimés en" qui est systématiquement 2 lignes en dessous du bas du tableau.
3 - Copier les cellules A3 :M5 de la feuille 2 --> coller au niveau de la cellule "Degré" (G23 dans ce cas) en feuille 1 tout en conservant les formules.
4 - Étendre les cellules de G25 :S25 jusqu’au bas du tableau sur les lignes non vides en A….sachant que le nbre de ligne vides entre chaque ligne non vide est variable, tout comme la longueur du tableau.
(Attention les m3 ne doivent pas s’incrémenter en m4, m5 etc svp)
5-Coller la zone A8 :N12 de la feuille 2 en F au niveau de la bordure du bas du tableau (variable), (F223 dans ce cas).
6-Adapter les sommes (J223 :J227) à la taille du tableau.
7-Supprimer la cellule « Tous les montants sont exprimés en » ainsi que la cellule « EUR »
8-Dans l'idéal j'aimerais que les bordures soient propres.. mais bon c'est facultatif
Et c’est tout ...!
Merci d'avance à tous ceux qui voudront bien se pencher sur la question !
Bonsoir,
une proposition, pour une caisse de vin.
Sub listecolisage()
Set ws1 = Worksheets("Feuil1")
Set ws2 = Worksheets("feuil3")
dl = ws1.Range("C:C").Find("Tous les montants sont exprimés en").Row - 2
ws2.Range("A28:S" & dl + 20).Delete
ws1.Range("B24:B" & dl).Copy ws2.Range("A24")
ws1.Range("C24:E" & dl).Copy ws2.Range("D24")
ws1.Range("G24:G" & dl).Copy ws2.Range("G24")
For i = 24 To dl Step 4
If ws2.Range("A" & i + 1) <> "" Then
ws2.Range("B25").Copy ws2.Range("B" & 1 + i)
ws2.Range("C25").Copy ws2.Range("C" & 1 + i)
ws2.Range("B" & 1 + i) = ws1.Range("H" & 1 + i) / ws2.Range("A" & 1 + i)
ws2.Range("H25:S27").Copy ws2.Range("H" & i + 1)
ws2.Range("S26").Copy ws2.Range("S" & i)
Else
For j = i To dl
ws2.Range("S26").Copy ws2.Range("S" & j)
Next j
Exit For
End If
Next i
ws2.Range("A" & dl).Copy
ws2.Select
ws2.Range("B" & dl & ":S" & dl).Select
ws2.Paste
ws2.Range("S" & dl).Borders(xlEdgeRight).Weight = xlMedium
Worksheets("Feuil2").Range("A8:N12").Copy ws2.Range("A" & dl + 1)
ws2.Range("E" & dl + 1).Formula = "=sum(L25:L" & dl & ")"
ws2.Range("E" & dl + 2).Formula = "=sum(N25:N" & dl & ")"
ws2.Range("E" & dl + 3).Formula = "=sum(R25:R" & dl & ")"
ws2.Range("E" & dl + 4).Formula = "=sum(C25:C" & dl & ")"
ws2.Range("E" & dl + 5).Formula = "=sum(A25:A" & dl & ")"
End SubMerci h2so4 pour cette proposition, malheureusement même moi je n'ai pas de prix préférentiel sur les vins...domage
En revanche je sais pas si ça vient de moi ou de la macro mais ça ne fonctionne pas du tout, ça me donne des bouts de document éparpillés en feuille 3, rien à voir avec ce à quoi je m'attendais.. une idée ??
Merci encore
bonsoir,
c'est que je suis parti sur une mauvaise base, en tout cas cela fonctionne pour l'exemple que tu as donné.
je vais voir ce que je peux faire pour rendre le code un peu moins dépendant d'une structure fixe, mais sans bon vin cela va etre dur
bonsoir,
voici un nouveau code basé sur la recherche d'une première ligne dans la fature sur base de "lg cde" en colonne A
recherche d'une première ligne sur la liste de colisage baseé sur "Nb colis" en colonne A
et pour le reste sur les infos trouvées dans l'exemple fourni.
Sub insere()
Set ws1 = Worksheets("Feuil1")
Set ws2 = Worksheets("feuil3")
pl1 = ws1.Range("A:A").Find("Lg cde").Row + 1
pl2 = ws2.Range("A:A").Find("Nb colis").Row + 1
dl = ws1.Range("C:C").Find("Tous les montants sont exprimés en").Row - 2
ws2.Range("A" & pl2 + 4 & ":S" & dl + 20).Delete
ws1.Range("B" & pl1 & ":B" & dl).Copy ws2.Range("A" & pl2)
ws1.Range("C" & pl1 & ":E" & dl).Copy ws2.Range("D" & pl2)
ws1.Range("G" & pl1 & ":G" & dl).Copy ws2.Range("G" & pl2)
For i = pl2 To dl
If ws2.Range("A" & i) <> "" Then
ws2.Range("B" & pl2 + 1).Copy ws2.Range("B" & i)
ws2.Range("C" & pl2 + 1).Copy ws2.Range("C" & i)
ws2.Range("B" & i) = ws1.Range("H" & i) / ws2.Range("A" & i)
ws2.Range("H" & pl2 + 1 & ":S" & pl2 + 1).Copy ws2.Range("H" & i)
End If
Next i
ws2.Range("A" & dl & ":S" & dl).Borders(xlEdgeBottom).Weight = xlMedium
ws2.Range("S" & pl2 & ":S" & dl).Borders(xlEdgeRight).Weight = xlMedium
Worksheets("Feuil2").Range("A8:N12").Copy ws2.Range("A" & dl + 1)
ws2.Range("E" & dl + 1).Formula = "=sum(L25:L" & dl & ")"
ws2.Range("E" & dl + 2).Formula = "=sum(N25:N" & dl & ")"
ws2.Range("E" & dl + 3).Formula = "=sum(R25:R" & dl & ")"
ws2.Range("E" & dl + 4).Formula = "=sum(C25:C" & dl & ")"
ws2.Range("E" & dl + 5).Formula = "=sum(A25:A" & dl & ")"
End SubJe viens de comprendre, c'est que je supprime le contenu de la feuille 3 avant d'éxécuter la macro donc forcement il reste plus grand chose...
En fait j'avais mis la feuille 3 pour modèle uniquement mais il faudrait que la macro s’exécute sur la feuille 1, car il y a des données en en tête que j'ai supprimé dans le fichier mais qui sont propres à chaque document.
Tiens voilà une bouteille
bonsoir,
macro adaptée,
j'ai dû modifier feuil2 (les formules)
Un dernier petit problème : la colonne C n'affiche pas la multiplication A*B .
Après ça ce sera vraiment parfait ! Ca va me faire gagner pas mal de temps dès demain !!
Génial un grand merci à toi !
Bonne soirée