Créer une boucle avec VBA

Bonjour à tous,

J'aimerais développer une boucle avec macro VBA mais je ne sais pas quel type de boucle utiliser. Voici ma problématique:

Vérifier si le nombre de ligne en colonne A du classeur "données" est > 40

Si oui, alors on applique le code ci-dessous, c'est à dire qu'on renseigne les 40 étiquettes d'un doc Word avec la valeur des 40 premières cellules de la colonne A, on imprime le doc Word, on supprime les 40 premières lignes de la feuille 2 du doc Excel "Données" . En suite on vérifie à nouveau si le nombre de ligne en colonne A du classeur "données" est toujours > 40. Si oui on répète cette procédure et ainsi de suite. C'est sur ce point que je bloque :/

nb_ligne = Worksheets(2).Range("A65536").End(xlUp).Row
If (nb_ligne) > 40
For i = 1 To 40
'les signets du document Word sont nommés Blank_MP1_panel1 , Blank_MP1_panel2 , Blank_MP1_panel3
With WordDoc.Bookmarks("Blank_MP1_panel" & i).Range
.Text = Worksheets(2).Cells(i, 1) & vbCrLf & vbCrLf & Worksheets(2).Cells(i, 4) & vbCrLf & vbCrLf & Worksheets(2).Cells(i, 5)
.Font.Name = "arial"
.Font.Size = 10
.Font.Bold = True
.Font.Italic = False
.Font.Color = RGB(3, 34, 76)
End With
Next i

WordApp.Visible = False

WordApp.ActiveDocument.PrintOut

Worksheets(2).Rows("1:40").Select
Selection.Delete Shift:=xlUp

Si non ( le nombre de ligne en colonne A du classeur "données" est < 40) alors:

nb_ligne = Worksheets(2).Range("A65536").End(xlUp).Row
If (nb_ligne) < 40
For i = 1 To Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
'les signets du document Word sont nommés Blank_MP1_panel1 , Blank_MP1_panel2 , Blank_MP1_panel3
With WordDoc.Bookmarks("Blank_MP1_panel" & i).Range
.Text = Worksheets(2).Cells(i, 1) & vbCrLf & vbCrLf & Worksheets(2).Cells(i, 4) & vbCrLf & vbCrLf & Worksheets(2).Cells(i, 5)
.Font.Name = "arial"
.Font.Size = 10
.Font.Bold = True
.Font.Italic = False
.Font.Color = RGB(3, 34, 76)
End With
Next i

WordApp.Visible = False

WordApp.ActiveDocument.PrintOut

Est-ce possible de réaliser une boucle avec tous ces éléments ? Une boucle While? Until... ? Pourriez-vous me conseiller et m'aiguiller s'il vous plait ?

Merci à vous :)

JB

Edit modo : en lien avec le sujet ici https://forum.excel-pratique.com/s/goto/1061935

Bonjour

Cela me paraît inutilement compliqué : j'ajouterai une colonne numérotant les lignes et dans Word je lancerais mon publipostage en filtrant sur 1 à 40 puis 41 à 80, etc, éventuellement par une macro Word...

Bonsoir,

merci pour votre réponse. En fair c'est pour renseigner une feuille Word comportant des étiquettes AVERY. Ce document est disponible sur leur site Web en téléchargement...

merci

jb

RE

Un publipostage comportant une planche de 40 étiquettes peut enchaîner automatiquement les pages de 40.

Donc sauf si tu crains de ne pas remplir complétement la dernière planche, je ne vois pas ton problème...

Il suffit si c'est le cas :

  • soit de filtrer dans Word de 1 à n, n étant un multiple de 40 avant de lancer le publipostage
  • soit dans Excel, manuellement ou par code, de couper coller ce qui reste au delà d'un multiple de 40 dans autre onglet

De toute façon Word ne peut publiposter depuis une source Excel ouverte ce qui compliquer ta boucle inutile qui réinvente le publipostage

D'accord, donc autant reproduire la plaquette d'étiquettes avec EXCEL ? Dans ce cas, savez-vous comment je pourrais reproduire cette plaquette ? Avec des shapes ou en ajustant la taille des cellules ? Certains membres me proposaient cette solution

Merci

JB

A nouveau 78chris,

Ta deuxième solution me plairait bien mais comment développer ce code?

Merci

JB

RE

Ton code date du moyen age, lol : cela fait 9 ans que les classeurs ont plus de 65536 lignes et qu'on utilise des tableaux structurés

Avec un tableau structuré nommé BD et un onglet de report Feuil2

Sub Decaler()
    With [BD].ListObject
        y = .ListRows.Count
        If y Mod 40 > 0 Then
            y2 = Round(y / 40, 0) * 40 + .Range.Row + 1
            x1 = .Range.Column
            x2 = .Range.Columns.Count + x1 - 1
            y3 = y - y2 + .Range.Row + 1
            x3 = .Range.Columns.Count
            Set Trop = ActiveSheet.Range(Cells(y2, x1), Cells(.Range.Rows.Count, x2))
            With Worksheets("Feuil2")
                .Range(.Cells(2, 1), .Cells(y3 + 1, x3)).Value = Trop.Value
            End With
            Trop.ClearContents
            .Resize Range(Cells(1, 1), Cells(y2 - 1, x2))
        End If
    End With
End Sub

A associer à un bouton placé sur la feuille contenant les données à publiposter

Bonjour,

OK donc je vais adapter mon classeur en tableau structuré et appliquer le code proposé. Je vais essayer ça

merci à vous

Rechercher des sujets similaires à "creer boucle vba"