Adaptation macro existante pour tableaux à taille variable

Bonjour,

Dans le cadre de mon activité professionnelle, je suis amené à compiler 4 tableaux excel en vue d'en faire, dans une phase ultérieure, un tableau croisé dynamique.

Ces tableaux proviennent d'une application pro.

Etant novice en VBA Excel, j'ai quand même réussi à confectionner la macro de base, certes complexe mais elle marche. Malheureusement pour moi, les tableaux d'origine sont à taille variable en termes de lignes. Et c'est là que ça se complique pour moi. J'ai essayé, en cherchant sur le forum, de l'adapter, mais vu la complexité de la macro, je me perd et suis bloqué à chaque fois.

Merci à celui qui pourrait m'aider.

Par exemple, comment adapter ce passage pour qu'il marche si mon tableau fait 500 lignes de plus :

Columns("A:A").Select

Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range("A1").Select

ActiveCell.FormulaR1C1 = "Type de ligne"

Range("A2").Select

ActiveCell.FormulaR1C1 = "Aérien BT"

Selection.AutoFill Destination:=Range("A2:A2747")

Range("A2:A2747").Select

idem avec cet autre passage sur un autre tableau :

Columns("B:B").Select

Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range("B2").Select

ActiveCell.FormulaR1C1 = "*"

Selection.AutoFill Destination:=Range("B2:B108")

Range("B2:B108").Select

Mon autre problème est de savoir quelle formule utilisée pour coller les 4 tableaux obtenus sur une seule feuille (sachant que ces tableaux ont plus ou moins de lignes d'une fois sur l'autre). Avec ma macro, lorsque je compile ces tableaux, si le nombre de lignes d'origine est plus grand, je perd des lignes.

Merci d'avance pour votre aide.

Bonsoir ED, bonsoir le forum,

Connaître le nombre de ligne d'un tableau est relativement aisé.

• Si celui-ci de comporte aucune ligne vide ou aucune colonne vide entre les données tu peux le sélectionner d'un coup en te plaçant dans n'importe quelle cellule (dans mon exemple je prendrait A1 qui est la plus logique) et utiliser CurrentRegion.

Range("A1").CurrentRegion.Rows.Count

va t'indiquer combien de ligne contient ton tableau et puisque dans mon exemple il commence à la ligne un tu sais aussi le numéro de la dernière ligne. Tu peux le stocker dans une variable et l'utiliser par la suite :

Dim DL As Long
DL = Range("A1").CurrentRegion.Rows.Count

• Si celui-ci comporte des lignes vides est donc ne permet pas l'utilisation de CurrentRegion, tu peux définir la dernière ligne éditée en prenant comme référence une colonne qui contient forcément une donnée. Imaginons que la colonne A contienne une données obligatoire. La dernière ligne éditée de la colonne A s'obtient avec :

DL = Cells(Application.Rows.Count, 1).end(xlUp).Row

Application.Rows.Count signifie la dernière ligne de l'onglet, 1 correspond à la colonne 1 (=A), End(xlUp) signifie que l'on remonte jusqu'à la dernière ligne éditée de la colonne et Row pour récupérer le numéro de ligne.

Ton code deviendrait :

Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Value = "Type de ligne"
Range("A2").Value = "Aérien BT"
DL= Cells(Application.Rows.Count, 1).End(xlUp).Row
Range("A2").AutoFill Destination:=Range("A2:A" & DL)

Évite les Select inutiles, il ne font que ralentir l'exécution du code !...

Pour coller plusieurs plages les une en-dessous des autres j'utilise une variable que j'appelle DEST (cellule de DESTination)

imaginons 4 tableaux dans 4 onglet différents (les 4 premiers) de taille variable que je veux les coller dans le cinquième onglet à partir de A1.

Je simplifie en optant pour le fait que chaque tableau commence en A1 et ne comporte aucun trou (ligne entière ou colonne entière vide entre les données). Ça me permet de boucler mais on peut aussi l'écrire tableau après tableau :

Dim DEST As Range

For I=1 to 4
    Set Dest = IIf(Sheets(5).Range("A1")="", Sheets(5).Range("A1"), Sheets(5).Cells(Application.Rows.Count, 1).End(xlUp).Offset(1,0))
    Sheets(I).Range("A1").CurrentRegion.Copy DEST
Next I

La variable DEST est définie à chaque passage de la boucle comme étant A1, si A1 est vide, sinon, la première cellule vide de la colonne A. Le tableau entier est copié avec CurrentRegion puis collé dans DEST (sans aucun Select)...

Bonjour et merci beaucoup pour cette réponse.

J'ai essayé d'intégrer

Columns("A:A").Select

Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range("A1").Value = "Type de ligne"

Range("A2").Value = "Aérien BT"

DL= Cells(Application.Rows.Count, 1).End(xlUp).Row

Range("A2").AutoFill Destination:=Range("A2:A" & DL)

mais la macro s'arrête sur la ligne "Range("A2").AutoFill Destination:=Range("A2:A" & DL)". Je pensais que mon souci provenait du fait que je n'avais pas déclaré ma variable, j'ai donc rajouté "Dim DL As Long". Mais sans succès.

Etant donné que j'ai 4 feuilles (4 tableaux), suis-je obligé de nommé mes variables de 4 façons différentes ?

J'ai également un souci avec la seconde variable. Dois-je l'intégrer telle que dans ma macro ou y a-t-il une procédure particulière.

Je suis novice en macro et j'ai un souci avec les variables.

Merci de m'aider.

Bonjour ED, bonjour le forum,

Travailler avec des bouts de code n'est pas toujours simple !... Si je reprends le "bout" qui pose problème voilà ce qu'il fait :

• Il insère une colonne avant la colonne A (les données de la colonne anciennement A se retrouvent dans la colonne B)

• Écrit "Type de Ligne" en A1

• Écrit "Aérien BT" en A2

• Définit la dernière ligne éditée de la colonne A (donc la ligne 2)

• Autorempli la plage A2:A2 avec la valeur de A2

Tu as saisi l'erreur ?!... Je pense que DL doit être définie soit avant de rajouter une colonne, soit sur la colonne B...

Le code devient alors :

DL = Cells(Application.Rows.Count, 1).End(xlUp).Row
Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Value = "Type de ligne"
Range("A2").Value = "Aérien BT"
Range("A2").AutoFill Destination:=Range("A2:A" & DL)

ou

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Value = "Type de ligne"
Range("A2").Value = "Aérien BT"
DL = Cells(Application.Rows.Count, 2).End(xlUp).Row
Range("A2").AutoFill Destination:=Range("A2:A" & DL)

Encore une fois, évite les Select inutiles... C'est une règle d'or !

Bonjour à tous.

Merci beaucoup ThauThème pour ton aide précieuse. Pour l'instant ta manip marche, je continue et te tiens au courant.

Encore une fois mille merci ThauThème de ton aide précieuse.

Ta manip marche impec.

Rechercher des sujets similaires à "adaptation macro existante tableaux taille variable"