Amélioration d'un code

Bonjour à tous,

Je suis un Débutant en VBA et j'ai réaliser une macro via l'enregistreur de macro. j'ai donc rentrer une formule dans une cellule puis j'ai étirer celle-ci jusqu'à la ligne 2000 (pour être sur que ma formule s'applique peu importe la longueur du tableau que j'importe). (Oui je sais c'est une technique très rudimentaire ).

Pouvez-vous s'il vous plait m'aider à modifier ma macro pour que celle-ci recherche toute seule la fin du tableau ?? je vous joint le code en question ... (pardonnez d'avance la qualité de mon programme )

Merci d'avance

Sub ranger()
    Sheets("Comparateur").Select

    Range("A1").Select
    ActiveCell.FormulaR1C1 = _
        "=CONCAT(caché!RC,"" / "",caché!RC[1],"" / "",caché!RC[2],"" / "",caché!RC[3],"" / "",caché!RC[4],"" / "",caché!RC[5],"" / "",caché!RC[6],"" / "",caché!RC[7])"
    Range("A2").Select
    Columns("A:A").ColumnWidth = 68.67
    Range("A1").Select
    Selection.AutoFill Destination:=Range("A1:A2000"), Type:=xlFillDefault
    Range("A1:A2000").Select

    Range("D1").Select
    ActiveCell.FormulaR1C1 = _
        "=CONCAT(caché!RC[6],"" / "",caché!RC[7],"" / "",caché!RC[8],"" / "",caché!RC[9],"" / "",caché!RC[10],"" / "",caché!RC[11],"" / "",caché!RC[12],"" / "",caché!RC[13])"
    Range("D2").Select
    Columns("D:D").ColumnWidth = 68.44
    Range("D1").Select
    Selection.AutoFill Destination:=Range("D1:D2000"), Type:=xlFillDefault
    Range("D1:D2000").Select

    Range("C1").Select
End Sub

Bonsoir,

je vous propose une première simplification (mais il y a certainement mieux à faire), et elle ne reprend que la première partie de votre code, c'est à dire la colonne A :

    With Sheets("Comparateur")
        .Range("A1").FormulaR1C1 = _
            "=CONCAT(caché!RC,"" / "",caché!RC[1],"" / "",caché!RC[2],"" / "",caché!RC[3],"" / "",caché!RC[4],"" / "",caché!RC[5],"" / "",caché!RC[6],"" / "",caché!RC[7])"
        .Range("A1").AutoFill Destination:=Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
        Columns("A:A").ColumnWidth = 68.67
    End With

Mais pour la recherche de la taille du tableau je suis parti sur l'idée où vous importez les données, puis lancer la macro, donc il y a bien une cellule de fin de tableau.

@ bientôt

LouReeD

En effet, en exécutant votre code un message d'erreur apparait "erreur d'exécution 1004 la méthode AutoFiLL de la Classe Range à échoué". je pense que c'est lié a cela mais j'avoue ne pas trop comprendre

Vous avez une feuille, sur cette dernière vous copier un tableau de données, sur ce tableau vous voulez modifier les valeurs de la colonne A en les remplaçant par une formule, mais plutôt que de le faire sur 2000 ligne vous voulez que cela ne cible que le nombre de ligne réelle de la colonne A ?

Si c'est bien cela, alors essayez cette correction :

    With Sheets("Comparateur")
        .Range("A1").FormulaR1C1 = _
            "=CONCAT(caché!RC,"" / "",caché!RC[1],"" / "",caché!RC[2],"" / "",caché!RC[3],"" / "",caché!RC[4],"" / "",caché!RC[5],"" / "",caché!RC[6],"" / "",caché!RC[7])"
        DerLigne = .Range("A" & Rows.Count).End(xlUp).Row
        .Range("A1").AutoFill Destination:=Range("A1:A" & DerLigne), Type:=xlFillDefault
        Columns("A:A").ColumnWidth = 68.67
    End With

Mais vraiment pas sur...

@ bientôt

LouReeD

Bonjour,

La solution serait à priori surtout d'utiliser les tableaux structurés d'Excel, disponibles depuis une 15ène d'années, et qui étend les formules automatiquement pour nous...

Bonjour

C'est pas faux... Alors, comment ?

@ bientôt

LouReeD

Bonjour,

Excusez moi pour mon retour tardif, j'ai trouvé une solution efficace à mon problème en utilisant un code du tiens @LouReeD.

voici le code fonctionnel :

'déterminer la derniere ligne de la liste1 et noté cette variable DeLi
  DeLi = Range("A" & Rows.Count).End(xlUp).Row
    Range("I1").Select

'appliquer la formule CONCATENER jusqu'à la variable DeLi
    ActiveCell.FormulaR1C1 = _
        "=CONCATENATE(RC[-8],""    "",RC[-7],""    "",RC[-6],""    "",RC[-5],""    "",RC[-4],""    "",RC[-3],""    "",RC[-2],""    "",RC[-1])"
    Range("I2").Select
    Columns("I:I").ColumnWidth = 43.57
    Columns("I:I").ColumnWidth = 59.57
    Range("I1").Select
    Selection.AutoFill Destination:=Range("I1:I" & DeLi)

Bonne soirée à tous et merci de votre aide

Bonsoir,

trop de "Select" je pense, voyez si ceci fonctionne :

' déterminer la derniere ligne de la liste1 et noté cette variable DeLi
DeLi = Range("A" & Rows.Count).End(xlUp).Row

' appliquer la formule CONCATENER jusqu'à la variable DeLi
Range("I1").FormulaR1C1 = _
        "=CONCATENATE(RC[-8],""    "",RC[-7],""    "",RC[-6],""    "",RC[-5],""    "",RC[-4],""    "",RC[-3],""    "",RC[-2],""    "",RC[-1])"
Range("I1").AutoFill Destination:=Range("I1:I" & DeLi)

' mise en forme à l'issue
Columns("I:I").ColumnWidth = 59.57

@ bientôt

LouReeD

Rechercher des sujets similaires à "amelioration code"