2010-06-18 7 views
0

Débutant VBA ici. J'essaie d'utiliser une formule matricielle via excel vba mais je n'arrive pas à spécifier une plage dynamique pour la formule. J'ai:Plage dynamique dans un tableau de formules

Range("xyz").FormulaArray = "=somefunction(Data!RC:R[8]C[49])" 

Mais la prochaine fois, il pourrait être

Range("xyz").FormulaArray = "=somefunction(Data!RC:R[15]C[32])" 

Cela ne semble pas fonctionner. Y a-t-il une solution à cela?

Répondre

3

Si par plage dynamique vous entendez une gamme dont la taille est déterminée par des variables VBA (par exemple jRow et kCol) puis

Range("xyz").FormulArrayR1C1 = "=somefunction(Data!RC:R[" _ 
        & cstr(jRow) & "]C[" & cstr(kCol) & "])" 

Si vous demandez comment déterminer combien de lignes et de colonnes dans une zone sont occupé regarder

Range.CurrentRegion 
Range.CurrentArray 
Range.End(xlUp).Row (also xlDown, xlRight, xlLeft) 
0

Vous ne savez pas exactement ce que vous cherchez, mais peut-être que cela aidera. Le code ci-dessous utilise la fonction "CountA" pour vérifier combien de cellules dans la plage spécifiée contiennent des données (en utilisant A1: A10, mais peut être n'importe quelle plage), puis copie ce nombre de cellules de worksheet1 à worksheet2. Cela ne fonctionnera que si les données sont continues (pas de cellules vides entre les données).

Sur Worksheet1, mettre quelques chiffres dans les cellules A1: A5, par exemple ...

Sub DynamicRange() 
    Dim CountA_Range As Range, intCountA_Result As Integer, CopyRange As Range 

    Set CountA_Range = Worksheets(1).Range("A1:A10") 
    intCountA_Result = WorksheetFunction.CountA(CountA_Range) 

    Set CopyRange = ThisWorkbook.Worksheets(1).Rows("1:" & intCountA_Result) 

    CopyRange.Copy 
    Worksheets(2).Rows("1").PasteSpecial (xlPasteValues) 

End Sub 
1

Il suffit d'écrire votre fonction comme si vous le faites dans la première cellule. Pour exmaple:

Range("A1:C150")= "=C33*D21+Countif(G100:G500,"">0"")" 

Vous obtiendrez le même résultat en écrivant la formule =C33*D21+Countif(G100:G500,">0") dans la gamme A1 et faire face à aller A1:C150