2011-08-25 5 views
0

J'ai une table et le nombre de lignes dont elle dispose est inconnu. Chaque fois que l'utilisateur saisit un élément dans la colonne A de cette table, je veux que les autres colonnes de la table soient remplies dynamiquement avec des formules qui référencent l'élément que j'ai entré dans la colonne A.EXCEL/VBA - Insérer dynamiquement des formules dans des cellules

Je ne veux pas simplement Copiez la formule dans les colonnes B, C, D etc tout au long de ma feuille parce que le nombre de lignes dans la feuille est inconnu.

Existe-t-il un moyen efficace de le faire?

Mes tentatives d'écriture de code dans les événements onCalculate et onChange dans VBA semblent très inefficaces ou aboutissent à des boucles éternelles.

+0

Got it .... Sous Worksheet_Change privée (ByVal Target As Range) Si Target.Column = 3 Alors Application.ScreenUpdating = False application. calcul = xlCalculationManual Sheet2.Cells (Target.Row, 5) .Formula = "= XXX (" "XXX" "" & Target.Address & "E5)" Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomat ic Fin Si Fin Sub – stan

+0

Vous pouvez répondre vous-même si vous le souhaitez. –

Répondre

1

Voici un échantillon qui remplira les formules vides dans B, C et D à chaque fois que vos modifications de sélection:

En ThisWorkbook:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim oSh As Worksheet, oUsed As Range, oRng As Range 

    Set oSh = Sh 
    Set oUsed = oSh.UsedRange.Columns("B") 

    'only add to blank formulas 
    Set oRng = oUsed.Find("", LookIn:=xlFormulas) 

    Do While Not oRng Is Nothing 
     'B formula 
     oRng.Offset(, 0).FormulaR1C1 = "=RC[-1] + 100" 
     'C formula 
     oRng.Offset(, 1).FormulaR1C1 = "=RC[-1] + 100" 
     'D formula 
     oRng.Offset(, 2).FormulaR1C1 = "=RC[-1] + 100" 
     Set oRng = oUsed.Find("", oRng, xlFormulas) 
    Loop 
End Sub 

Cela fonctionne sur chaque feuille de calcul dans le classeur, vous pouvez donc vouloir tester la feuille dans laquelle vous vous trouvez.

+0

Je voudrais que tout cela vérifie que le changement s'est passé dans la bonne colonne pour accélérer Excel. Enveloppez votre code dans If Not Intersect (Cible, oUsed) Est-ce que Nothing .... Fin Si – RonnieDickson

+0

@RonnieDickson - J'ai pensé faire quelque chose comme ça, mais Target spécifie seulement ce qu'est la cellule Cible lorsque vous passez d'une cellule à l'autre . Donc, si je passe de la cellule A1 à la cellule B25, l'adresse de Target est B25, et par conséquent elle n'apparaîtra pas dans l'intersection ... je ne sais pas comment vérifier les changements uniquement dans la colonne A. Une autre façon de l'accélérer serait de désactiver la mise à jour de l'écran, mais cela pourrait être exagéré. – transistor1

2

Si vous utilisez Excel 2007 ou Excel 2010, définissez votre plage de liste comme Liste le fera automatiquement!
La meilleure macro est pas macro

+0

+1 C'est la meilleure façon de gérer cela – JMax

Questions connexes