Dupliquer ligne Excel pour publipostage Word
Bonjour à tous,
Voila, je vous présente un peu ma situation, je souhaite créer un publipostage.
Les étiquettes de mon publipostage correspondent aux articles d’une commande qui a été passée. Dans l’exemple que je vous ai envoyé, seul une commande nous intéresse par exemple la 11.
Je veux créer une étiquette non pas par lot d’article, mais par article c-a-d que, si dans ma colonne quantité j’ai un nombre X supérieur à 1, je veux créer X étiquettes. Malheureusement, après plusieurs recherches, je crois que cette manipulation est difficile à faire sur Word via un publipostage donc je pensais plutôt modifier mon fichier source, à savoir, mon fichier commande sur Excel et pour cela, je pensais dupliquer chaque ligne sur Excel en fonction de la quantité présente dans la colonne D ici. Malheureusement, je n’ai aucune notion pour faire des macros même si je pensais que le code pourrait avoir cette tête :
Debut Macro
Si C = Numero de ma commande (donc déclaration d’une constante C)
Créer une boucle ( For je pense ou DO While avec comme condition, tant que mon i est égal au numéro de ma commande) qui va tester toutes les lignes de ma commande
Si Numero Y dans colonne D > 1
Prendre la ligne puis la dupliquer autant de fois que Numero Y
Fin de macro
Mais enfin comme vous le voyiez, à part écrire du pseudo code, je ne sais pas du tout comment m’y prendre donc j’accepterai toute aide
Bonne journée à tous.
Bonjour et bienvenue sur le forum
Un essai à tester. Te convient-il ?
Bye !
Salut Gmb,
Alors la, merci beaucoup c'est excatement ce que je souhaitais en revanche, j'ai plusieurs autres questions qui suivent mainteant ^^
La premiere et la plus simple je pense c'est, une fois que j'ai duplique mes lignes de la maniere voulue, comment serait-t-il possible de retourner a l'etat initial ?
Seconde question, peux-tu m'expliciter un peu ton code ? En gros, j'ai bien compris que ta partie Macro1 c'etait ce qui realisait effectivement le fait de dupliquer la ligne mais je n'ai pas bien compris la partie Dupliquer.
Tu declares une variable In mais je croyais que la declaration se faisait de la maniere suivant : Dim nom_varaible As type_de_la_varaible, or dans ton code il y a une virgule qui apparait, d'ou vient-elle et que signifie t elle ?
Ensuite, si tu veux bien rentrer un peu plus dans le detail pour que je comprenne un peu la logique derriere ca serait top.
J'aimerais bien comprendre le code pour que je sache quelle valeur remplacer pour l'adapter au fichier sur lequel je vais devoir travailler
Encore une fois merci pour ton aide !
Ps : J'ai essaye de transposer ton code a mon fichier et quand j'essaie de lancer la macro, j'ai le message suivant qui s'affiche : "Run time error 13 : Type Missmatch"
Est-ce que ca peut venir du fait que le numero de ma commade est composee non pas d'une suite de chiffre mais egalement de lettre cad : AABB1010 par exemple ?
Ps : Il semblerait que j'ai la reponse a ma premiere question puisque en modifiant le type de la variable d'Integer a Variant cela semble fonctionner, maintenant, dans la partie "Macro" de la macro, lorsque j'essaie de l'utiliser, seule une partie de ma ligne est dupliquee alors que je voudrais la dupliquer entierement, j'ai beau essaye d'avoir modifier cette partie du code :
Range("A4:D4").Select
Selection.Copy
Range("A5:D6").Select
Selection.Insert Shift:=xlDown
En :
Range("A2:S2").Select
Selection.Copy
Range("A5:S6").Select
Selection.Insert Shift:=xlDown
Cela ne change pas.
J'ai essaye de tester un peu juste la partie de la macro effectuant la duplication des lignes et je ne sais pas pourquoi, apres m'en etre servi, une partie de mes lignes est encadree en pointiles (je n'arrive pas a voir quel partie du code correspond a cette operation)
Bonjour Deca, Gmb, bonjour le forum,
Puisque je m'y suis aussi penché dessus je me permets de t'envoyer ma proposition. Attention j'utilise l'onglet Sheet2 donc veille à ce qu'il ne contienne pas de données car elle risquent d'être effacées...
Le code :
Sub Macro1()
Dim COM As Range 'déclare la variable COM (COMmande)
Dim NCOM As String 'déclare la variable NCOM (Numéro de COMmande)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TL(1 To 1, 1 To 4) As Variant 'déclare la variable TL (Tableau de la Ligne)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Sheets("Sheet1").Select 'sélectionne l'onglet "Sheet1"
On Error Resume Next 'en cas d'erreur passe à la ligne suivante (si bouton "Annuler" avec aucune ligne sélectionnée)
Set COM = Application.InputBox("Cliquer sur une ligne de la commande !", "N• COMMANDE", Type:=8) 'définit la boîte d'entrée COM qui permet de désigner la commande désirée
If COM Is Nothing Then 'condition : si aucune sélection n'a été faite
MsgBox "Vous devez cliquer sur n'importe quelle cellule de la ligne contenant la commande désirée !" 'message
Exit Sub 'sort de la procédure
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
NCOM = CStr(Cells(COM.Row, 1).Value) 'défini le numéro de la commade NCOM (converti en texte)
TV = Sheets("Sheet1").Range("A1").CurrentRegion 'définit le tableau des valeurs TV
If Sheets("Sheet2").Range("A1").Value <> "" Then Sheets("Sheet2").Range("A1").CurrentRegion.Delete 'supprime d'éventuelles anciennes données dans l'onglet "Sheets2"
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs en commençant par la seconde
If CStr(TV(I, 1)) = NCOM Then 'condition : Si le numéro de commande (converti en texte) correspond à CNUM
For J = 1 To 4 'boucle 2 sur les 4 colonnes J du tableau TV
TL(1, J) = TV(I, J) 'récupère dans la ligne 1, colonne J de TL la valeur ligne I colonne J de TB
Next J 'prochaine colonne de la boucle 2
For L = 1 To TL(1, 4) 'boucle 3 : sur la quantité à acheter
'définit la cellule de destination DEST
Set DEST = IIf(Sheets("Sheet2").Range("A1").Value = "", Sheets("Sheet2").Range("A1"), Sheets("Sheet2").Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
DEST.Resize(1, 4) = TL 'renvoi le tableau de la ligne TL dans la cellule de destination DEST
Next L 'prochaine colonne de la boucle 2
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
Sheets("Sheet2").Select 'selectionne l'onglet "Sheet2"
End SubBonjour Thauthème
@Deca
Deca a écrit :serait-t-il possible de retourner a l'etat initial ?
C’est ce que fait la version 2 ci-après.
peux-tu m'expliciter un peu ton code ?
Je te l’ai commenté.
En fait, la macro 1 que j’ai oublié d’effacer, est le résultat de la macro que j’ai enregistré pour avoir la syntaxe exacte des instructions qui permettent de dupliquer des lignes.
On retrouve cette syntaxe dans la macro où j’y ai adapté les adresses des cellules en y insérant la variable ln.
Tu declares une variable In mais…
On n’est pas obligé de donner son type quand on déclare une variable, bien que ce soit recommandé.
Mais on peut les déclarer sur une même ligne commençant par ’’Dim’’ à condition de les séparer par une virgule.
Pour bien faire il faudrait donc avoir :
Dim ln As Long, cde As String
Remarques sur tes messages compémentaires.
Quand tu écris :
Range("A4:D4").Select
Selection.CopyTu as intérêt à condenser ces 2 instructions ainsi, pour gagner en rapidité d’exécution :
Range("A4:D4").CopyPar ailleurs, la plage ‘’Range(‘’A4:D4’’) correspond à 4 cellules.
Et la plage Range("A5:D6") correspond à 8 cellules .
Tu ne peux donc pas coller la première plage sur la 2°.
En fait, pour coller, il suffit de désigner la première cellule de la plage où on veut coller. Cela pourrait donner, par exemple :
Range("A4:D4").Copy Range(‘’A5’’)
Et si tu ne veux copier que les valeurs, et non les formats, tu fais un collage spécial de la façon suivante :
Range("A4:D4").Copy
Range(‘’A5’’).PasteSpecial xlPasteValues
OK ?
Et pour terminer, je ne saurais trop te conseiller de te pencher sur la macro de Thauthème, plus sophistiquée que la mienne. Normal, c'est un crack !
Bye !
Deca a écrit :La premiere et la plus simple je pense c'est, une fois que j'ai duplique mes lignes de la maniere voulue, comment serait-t-il possible de retourner a l'etat initial ?
Voilà un exemple très explicite de la raison pour laquelle il ne faut PAS faire de macro tant que l'on peut s'en passer...
Cela se faisait en 2 colonnes triviales :
ID= si( QTY[ligne-1] < QTY[ID] ; ID[ligne-1] ; ID[ligne-1]+1)
QTY = si (ID=ID[ligne-1]; QTY[ligne-1]+1 ; 1)
avec ID le n° de la ligne du fichier source, et QTY le n° du duplicata
Cela donne autant de lignes que d'item*quantité
Bonjour le fil, bonjour le forum,
Suite à un email perso d'une rare classe, je m'auto-censure et supprime ce coup de gueule inutile et simpliste...
Bonjour a tous et merci du temps que vous avez tous passe a me répondre (desole pour les accents, je travaille avec un qwerty et je n'arrive pas a les faire quand je ne travaille pas sur Word)
Alors il y a beaucoup de chose et j'ai peu de temps pour répondre mais j'en prendrai un peu plus pour le faire des que je le pourrais.
Tout d'abord, merci Gmb pour m'avoir expliquer un peu plus en detail ta macro, effectivement en étant un peu plus attentif, j'aurais du voir que ta partie "macro "correspondait au cœur de la macro "Dupliquer". C'est vrai que si je m’étais souvenu un peu plus de mes cours de Java, j'aurais du savoir qu'on pouvait declarer plusieurs variable sur la meme ligne, malheureusement cette matière me rebutait fortement (d'ou ma presence sur ce forum, probablement :p)
Concernant la macro de Thauteme, effectivement je suis assez impressione par son efficacité, néanmoins je dois vous avouer que meme avec les explications, elle me parait moins clair que celle de Gmb meme si elle me semble plus robuste, j'ai essaye de la bidouiller un peu mais par exemple, lorsque j'utilise un numero de commande qui a un format de type AA11 (ce qui serait mon cas dans la pratique)
Ensuite Peuwi, merci du conseil mais dans tes formules, je ne vois pas ce qui effecute l'action de dupliquer justement mais ca ca doit etre juste moi qui suis mauvais avec Excel
Quoiqu'il en soit, encore une fois, merci a tous pour votre aide (je ne clos pas encore le sujet parce que je vais peut etre avoir de nouvelles questions qui vont suivre quand je vais avoir le temps de remettre un peu le nez dedans aujourd'hui)
Deca
Re-bonjour a tous,
Je continue d'essayer d'un peu m'approprier la macro pour pouvoir la modifier un peu comme je le souhaiterais.
Pour l'instant, je continue de me baser sur celle de Gmb qui est pour l'instant, plus accessible pour moi.
Dans la pratique, mon tableau de valeur s'étends jusqu’à la colonne T.
Je travaille avec le code suivant :
Dim ln, cde As String
Sub DupliquerTest()
cde = InputBox("Donner le numero de la commade :", "Numero commande", Range("A" & ActiveCell.Row))
For ln = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
If Range("A" & ln) = cde Then
If Range("S" & ln) > 1 Then
Range("A" & ln & ":T" & ln).Copy
Range("A" & ln + 1 & ":T" & ln + Range("F" & ln) - 1).Insert Shift:=xlDown
End If
End If
Next ln
End SubJ'ai donc modifie le code suivant :
Dim ln As Long, cde As String
Sub Dupliquer()
cde = InputBox("Donner le n° de la commande :", "N° Commande", Range("A" & ActiveCell.Row))
If cde = "" Then End
For ln = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 '
If Range("A" & ln) = cde Then
If Range("D" & ln) > 1 Then
Range("A" & ln & ":D" & ln).Copy
Range("A" & ln + 1 & ":D" & ln + Range("D" & ln) - 1).Insert shift:=xlDown
End If
End If
Next ln
End SubEn modifiant simplement les Range. Ma premiere question est, pourquoi lorsque dans mon code, j'essaie de modifier
Range("A" & ln + 1 & ":T" & ln + Range("F" & ln) - 1).Insert Shift:=xlDown En remplacant le "F" par un "T", ca entraine une erreur de compilation (Run Time error 13 : Type missmatch) ?
De plus, lorsque ma commande est composee uniquement de numero, j'ai beau essayer de modifier la declaration de ma variable cde en Variant, j'ai malgre tout des problemes ?
Merci d'avance pour le nouveau coup de main.
Bonne journee a tous