web-dev-qa-db-fra.com

Excel VBA: remplissage automatique de plusieurs cellules avec des formules

J'ai une grande quantité de données que j'ai collectées à partir de différents fichiers. Dans ce classeur principal, j'ai différents types de formules pour chaque cellule. Dans la plage A à F, les données des autres fichiers sont collectées. Dans la plage H à AC, j'ai la formule que je remplis automatiquement en la faisant glisser manuellement vers le bas chaque fois que de nouvelles données sont entrées. Le code ci-dessous est ce que j'ai utilisé et il n'a que 6 formules différentes que je veux remplir automatiquement.

Application.ScreenUpdating = False

lastRow = Range("B" & Rows.Count).End(xlUp).Row
Range("D2").Formula = "=$L$1/$L$2"
Range("D2").AutoFill Destination:=Range("D2:D" & lastRow)

Range("E2").Formula = "=$B2/2116"
Range("E2").AutoFill Destination:=Range("E2:E" & lastRow)

Range("F2").Formula = "=$D$2+(3*SQRT(($D$2*(1-$D$2))/2116))"
Range("F2").AutoFill Destination:=Range("F2:F" & lastRow)

Range("G2").Formula = "=$D$2-(3*SQRT(($D$2*(1-$D$2))/2116))"
Range("G2").AutoFill Destination:=Range("G2:G" & lastRow)

Range("H2").Formula = "=IF($E2>=$F2,$E2,NA())"
Range("H2").AutoFill Destination:=Range("H2:H" & lastRow)

Range("I2").Formula = "=IF($E2<=$G2,$E2,NA())"
Range("I2").AutoFill Destination:=Range("I2:I" & lastRow)
ActiveSheet.AutoFilterMode = False

Application.ScreenUpdating = True

Cependant, dans le classeur principal, il y a environ 15 formules différentes que je veux qu'il remplisse automatiquement chaque fois que de nouvelles données entrent. J'ai plusieurs classeurs principaux et la formule n'est pas constante. L'insertion du code ci-dessus pour chaque formule est pénible. Existe-t-il un moyen permettant au programme de le faire glisser automatiquement? Dans le classeur principal, j'ai déjà écrit les formules. J'ai essayé de nombreux codes différents pour le remplir automatiquement, mais jusqu'à présent, celui ci-dessus est le seul qui fonctionne sans me donner d'erreurs. J'ai essayé d'utiliser quelque chose comme ça ou une version similaire à celle-ci, mais aucune ne fonctionne:

With wbList.Sheets("Attribute - 10 mil stop")
    lastRow = Worksheets(ActiveSheet.Name).Range("B2").Rows.Count
    'Worksheets(ActiveSheet.Name).Range(Selection, Selection.End(xlDown)).Select
    Worksheets(ActiveSheet.Name).Range("D2:I2").Select
    Selection.AutoFill Destination:=Range("D2:I" & Range("B2" & Rows.Count).End(xlDown).Row)
End With

Je me suis tellement amusé avec le code. Je ne sais même pas si c'est supposé être comme ça. Merci pour l'aide!

15
user3233328

L'approche que vous recherchez est FillDown. Une autre façon de ne pas avoir à vous botter la tête à chaque fois est de stocker des formules dans un tableau de chaînes. Les combiner vous donne une méthode puissante de saisie de formules par la multitude. Le code suit:

Sub FillDown()

    Dim strFormulas(1 To 3) As Variant

    With ThisWorkbook.Sheets("Sheet1")
        strFormulas(1) = "=SUM(A2:B2)"
        strFormulas(2) = "=PRODUCT(A2:B2)"
        strFormulas(3) = "=A2/B2"

        .Range("C2:E2").Formula = strFormulas
        .Range("C2:E11").FillDown
    End With

End Sub

Captures d'écran:

Résultat en ligne: .Range("C2:E2").Formula = strFormulas:

enter image description here

Résultat en ligne: .Range("C2:E11").FillDown:

enter image description here

Bien sûr, vous pouvez la rendre dynamique en stockant la dernière ligne dans une variable et en la transformant en quelque chose comme .Range("C2:E" & LRow).FillDown, un peu comme ce que vous avez fait.

J'espère que cela t'aides!

39
Jerome Montino

Sur la base de mon commentaire, voici une façon d'obtenir ce que vous voulez faire:

Commencez par sélectionner n'importe quelle cellule de votre plage et appuyez sur Ctrl + T

Cela vous donnera ce pop-up:

enter image description here

assurez-vous que le texte Où est votre tableau est correct et cliquez sur ok, vous aurez maintenant:

enter image description here

Maintenant, si vous ajoutez un en-tête de colonne en D, il sera automatiquement ajouté au tableau jusqu'à la dernière ligne:

enter image description here

Maintenant Si vous entrez une formule dans cette colonne:

enter image description here

Après l'avoir saisie, la formule sera automatiquement remplie jusqu'à la dernière ligne:

enter image description here

Maintenant, si vous ajoutez une nouvelle ligne à la ligne suivante sous votre table:

enter image description here

Une fois entré, il sera redimensionné à la largeur de votre tableau et toutes les colonnes contenant des formules seront également ajoutées:

enter image description here

J'espère que ceci résoudra votre problème!

6
user2140261