2012-04-24 22 views
7

Ich habe eine Funktion in VBA, die ein Array von Zeichenfolgen generiert. Es funktioniert einwandfrei, wenn es von einer anderen VBA-Funktion aufgerufen wird, aber nicht beim Aufruf aus dem Arbeitsblatt.Array-Funktion in Excel VBA

Hier ist, wie es verwendet werden soll:

  • wählen A1: A3
  • Schreib in der Bearbeitungsleiste =Test(), dann Ctrl-Shift-Enter traf es um eine Array-Funktion
  • A1 A enthalten sollte, sollte A2 enthalten B, und A3 sollte enthalten C

Wenn ich das tatsächlich versuche, es pu ts A in allen drei Zellen des Arrays. Wie kann ich die Daten von Test in die verschiedenen Zellen des Arrays erhalten?


Für diejenigen, die es sehen möchten, hier ist der Code der Funktion. Beachten Sie, dass die Funktion problemlos funktioniert, wenn sie von anderen Funktionen aus aufgerufen wird.

Function Test() As String() 
    Dim a(1 To 3) As String 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = a 
End Function 

Antwort

8

Ihre Funktion funktioniert einwandfrei, wenn Sie die Daten transponieren. Um dies zu tun, müssen Sie Variant() statt String():

Function Test() As Variant() 
    Dim a(1 To 3) As Variant 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = Application.Transpose(a) 
End Function 
+1

Ich hatte keine Ahnung, dass die Standardrichtung eines Arrays eher nach rechts als nach unten gerichtet war. – Joe

+0

Leider scheint es keinen einfachen automatischen Weg für Excel zu geben, das Array horizontal oder vertikal zu füllen. Es könnte jedoch ein paar Tricks geben. –

+0

Yup, wie @andy Holaday darauf hinweist, hat Chip Pearson auch das horizontale/vertikale Dilemma herausgefunden. –

0

einfach das Problem herausgefunden - die erste Dimension eines Arrays von VBA in Excel gehen ist horizontal, nicht vertikal. Um die Ausgabe von Test zu sehen, setzen Sie die Array-Funktion =Test() in A1: C1 (nicht A1: A3).

+0

diese Antwort in Kombination oben mit dem einen von Charles Williams Lesen ein wenig verwirrend ist, obwohl beide sind richtig. Ein 1D-VBA-Array wird wie eine einzelne Zeile an Excel übergeben (wie in der ursprünglichen Test-UDF zu sehen). Ein 2D-VBA-Array wird mit der ersten Dimension in einer Spalte übergeben (wie in der Test-UDF von Charles angezeigt). –

4

Sie könnten Chip Pearson's advice on returning an array from a UDF überprüfen möchten.

Dies ist meine erste Antwort hier. Ich hoffe, das ist nicht unangemessen.

+0

Es ist nie falsch, auf die Website von Chip Pearson zu verweisen. Zumindest hoffe ich nicht, wie ich es die ganze Zeit tue! +1 –

3

Ich finde es am einfachsten, immer mit 2-dimensionalen Arrays zu arbeiten, dann müssen Sie nicht umsetzen etc

Function Test() As String() 
    Dim a(1 To 3, 1) As String 
    a(1, 1) = "A" 
    a(2, 1) = "B" 
    a(3, 1) = "C" 
    Test = a 
End Function