2009-05-11 13 views
5

Cette fonction très simple:Dans VBA, comment retourner un tableau/ou écrire dans des cellules en utilisant une fonction?

Function WriteArray() as Variant 
Dim array(0 To 2) 
array(0) = "A" 
array(1) = "B" 
array(2) = "C" 
WriteArray = array 
End Function 

Je me attendais à voir dans le résultat du tableau entier dans ma feuille de calcul Excel, mais ce n'est pas le cas: je ne reçois que la première chaîne. Je sais qu'il est astuce d'afficher tout le tableau dans la feuille de calcul (en sélectionnant une plage de cellules avec la formule + F2 + CTRL + MAJ + ENTRÉE), mais je préférerais que VBA gère tout cela.

J'ai également essayé d'utiliser la variable Application.Caller pour écrire directement dans la plage "Caller" mais le code casse.

Merci beaucoup pour votre aide!

EDIT: Voici un autre code que j'ai essayé d'utiliser:

Function WriteArray() As Variant 
    Dim arr(0 To 2) 
    arr(0) = "A" 
    arr(1) = "B" 
    arr(2) = "C" 
    WriteArray = arr 
    Dim StartRow, i As Integer 
    For i = 0 To UBound(arr) 
     Range("A" & i).Value = arr(i) 
    Next 
End Function 

Il brise la ligne "Range (" A "& i) .Value = arr (i)". Est-ce que mon Excel est cassé ?!

Répondre

6

Le code suivant écrit le tableau à une plage de cellules magnifiquement:

Function WriteArray() As Variant 
    Dim AbcList(0 To 2) as Variant 
    AbcList(0) = "A" 
    AbcList(1) = "B" 
    AbcList(2) = "C" 
    WriteArray = AbcList 
End Function 

Function WriteArrayToSpreadsheet() 
    Dim MyArray As Variant 
    MyArray = WriteArray() 

    Dim StartRow, i As Integer 
    StartRow = 1 
    For i = 0 To UBound(MyArray) 
     Range("A" & i + StartRow).Value = MyArray(i) 
    Next 
End Function 

Cela dit, je voudrais voir la partie du code où vous en train d'essayer de l'obtenir sur le feuille de calcul, pas où vous construisez le tableau. Alors je peux vous aider!

+0

En fait, cela ne fonctionne pas, le code VBA casse à "Range (" A "& i + StartRow) .Value = MyArray (i)" ... c'est mon problème aussi. Ce code fonctionne-t-il sur votre Excel? J'utilise Excel 2003. –

+0

Cela a fonctionné parfaitement dans Excel 2003. Changez chaque "tableau" dans votre code de début en un autre nom de variable qui n'est pas un mot réservé, comme AbcList ou quelque chose du genre. – Eric

+0

Pourtant, il se casse ... J'utilise exactement ce code: Fonction WriteArray() As Variant Dim arr (0 à 2) arr (0) = "A" arr (1) = "B" arr (2) = "C" WriteArray = arr Dim StartRow, i As Integer Pour i = 0 à UBound (arr) Range ("A" & i) .Value = arr (i) Suivant End Function A "Range (" A "& i) .Value = arr (i)", il sort juste le code, même sans jeter d'erreurs ... n'a pas de sens pour moi :( –

3

Vous n'êtes pas autorisé à écrire dans des cellules n'appelant pas l'appelant directement à partir d'une fonction de feuille de calcul dans Excel.

Si vous souhaitez utiliser une fonction de tableau (en utilisant la touche Maj-Ctrl-Entrée) vous devez changer votre code:

Function WriteArray() As Variant 
    Dim arr(0 To 2, 0 To 1) 
    arr(0, 0) = "A" 
    arr(1, 0) = "B" 
    arr(2, 0) = "C" 
    WriteArray = arr 
End Function 

Si vous voulez écrire en dehors des cellules d'appel vous devez mettre en œuvre une forme de rappel qui utiliserait l'automatisation pour écrire dans les autres cellules. C'est beaucoup plus compliqué et beaucoup plus susceptible de casser!

0

La meilleure solution que j'ai fait jusqu'à présent a été la création d'une procédure de la obtenir votre référence de plage et votre tableau et l'utiliser comme point de départ pour montrer horizontalement ou verticalement vos données ...

Comme suit:

Sub LoadArray(ByRef oRange, ByRef vArray) 
    Dim I 
    For I = 0 To UBound(vArray) 
     oRange.Offset(I, 0).Value = vArray(I) 
    Next 
End Sub 

'How to call: 
Dim anyArray 
anyArray = Array(1,2,3) 

Call LoadArray(Range("anyRange"), anyArray) 

Espérons que ça aide.

1

Le secret est de définir un tableau bidimensionnel. Les deux dimensions du tableau sont simplement la plage qui doit être définie pour un ensemble de données. La première dimension de tableau est le décalage de ligne et la deuxième dimension est le décalage de colonne.

Dans la deuxième exemple vous dimension est tout simplement pas "utilisé":

Sub Ente() 

    Dim myArray(0 To 3, 0) As String 
    myArray(0, 0) = "A" 
    myArray(1, 0) = "B" 
    myArray(2, 0) = "C" 

    Range("B7:B" & UBound(myArray) + 6) = myArray 

End Sub 

Ainsi, les boucles pas nécessaire! Simple et rapide.

Questions connexes