Contrôle du contenu de texte dans une boucle

Bonjour à tous,

Je reviens vers vous car j'ai réussi à créer une macro Excel qui remplit des contrôle de contenu dans des modèles de façon automatique (un genre de publipostage avancé).

Toutefois, je suis confronté à un soucis. Je boucle sur une table (une partie de mon tableur Excel) pour créer les document

s. Par exemple lorsque je pars du milieu des données, de la ligne 27 par exemple. Mon code créé bien le doc avec le nom contenu en ligne 27 mais les infos renseignées dans les contrôles eux correspondent à ceux de la ligne 2 pour la ligne 27, 3 pour la ligne 28 etc. Le bouclage ne se fait pas au niveau de ma partie de code concernant le remplissage des contrôles de contenus de texte, il repart systématiquement de la 2e ligne du tableau.

Je vous mets le doc en pj avec un modèle, en espérant que vous pourrez m'aider

10test.docx (90.43 Ko)

Je pense que le problème vient du remplissage du tableau. Essayez un truc dans ce goût-là :4

        Dim plage As Range, cell As Range
        Dim Table() As Variant

        Set plage = Range("A27:BX27") ' A DEFINIR
        ReDim Table(plage.Columns.Count)

        For Each cell In plage
            i = i + 1
            Table(i) = cell.Text
        Next

Merci pour cette réponse.

Malheureusement je suis trop novice pour comprendre où l'intégrer dans mon code.

Je pense que le soucis arrive au niveau de la ligne de code :

Set cell = ActiveSheet.Rows(1).Find(ctrl.Title)

J'ai l'impression qu'elle fait repartir la valeur j à 0 alors que jusqu'à ce moment dans la macro, la valeur j est bien celle de la boucle sur la Table() considérée...

Je pense qu'il y a un gros bug dans votre code.

Lorsque vous décidez de mettre dans le tableau Table la plage A27:BX27 en écrivant Table = Range("A27:BX27"), vous mettez les données de la plage dans un tableau de 1 ligne sur 76 colonnes. Plus loin, vous faites une boucle en écrivant : For j = LBound(Table, 1) To UBound(Table, 1). Comme il n'y a qu'une seule ligne, votre boucle va aller de 1 à 1 et non pas de 1 à 76.

Enfin, je ne vois pas dans votre code où vous ouvrez le modèle Test.docx.

Merci pour le retour.

J'ai récupéré la macro déjà faite (qui marche bien pour passer plusieurs docs en prenant les infos sur plusieurs colonnes).

La boucle For j = LBound(Table, 1) To UBound(Table, 1) permet bien de passer toutes les lignes (quand il y en a plusieurs).

Le traitement des colonnes se fait par le biais de ctrl.Title qui fait le lien entre le nom de la colonne et celui du titre du contrôle du contenu de texte enrichi.

Pour le modèle, j'ai dû oublier de faire une modif dans le doc Excel, il doit prendre le nom du modèle dans la colonne A par le biais de cette ligne de code :

Set templateDoc = wrdApp.Documents.Open(ThisWorkbook.Path & "\" & Table(i, 1) & ".docx")

J'ai fait de nouveaux essais. Le soucis venait bien de

Set Cell = ActiveSheet.Rows(1).Find(ctrl.Title)
If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(j)

Le j étant réinitialisé par le ActiveSheet.Rows(1) prend donc la valeur 2 puis 3... En fonction du nombre de lignes traitées.

J'ai trouvé une parade en déclarant une variable nombre correspondant à la première ligne à traiter en plus de la définition de ma table :

Dim lignedeb As Integer
lignedeb = 18 'PREMIERE LIGNE A TRAITER A DEFINIR pour un début de Table en A18 lignedeb = 18
Table = ws.Range("A18:BX19") 'A DEFINIR

A la suite de ça, la Table n'ayant pas d'en-têtes, je retire 1 à lignedeb pour ne pas avoir de décalage

lignedeb = lignedeb - 1 'on enlève 1 car Table n'a pas d'en-têtes

Enfin, avant de passer au Next j (donc après avoir traité le premier document) dans ma boucle j'ajoute 1 à lignedeb pour passer à la ligne suivante.

Un peu bricolage certainement mais ça fonctionne parfaitement !

Meric Optimix pour votre aide, bon dimanche !

Le principal est que ça marche. Attention à la maintenance du système si quelqu'un doit passer derrière vous.

Bon dimanche à vous.

Rechercher des sujets similaires à "controle contenu texte boucle"