Arbeiten mit arrays in VBA
Bin ich ein bisschen ein problem, die Arbeit mit arrays in VBA, wo das gleiche wäre trivial in (fast) jeder anderen Sprache auch:
Public Function getArray() As MyType()
'do a lot of work which returns an array of an unknown length'
'this is O(N^2) or something equally intensive so I only want to call this once'
End Function
Public Sub doSomething()
Dim myArray() As MyType
Set myArray = getArray() 'FAILS with "Cannot assign to array error"'
End Sub
Ich denke, es könnte sein, dass ich zu definieren, die Länge des Arrays im Voraus, oder ReDim ein dynamisches array. Aber ich weiß nicht, die Länge des zurückgegebenen Arrays vor der Zeit, und ich möchte vermeiden, den Aufruf der Funktion zweimal:
Public Sub doSomething()
Dim myArray(0 To UBound(getArray()) As MyType 'not entirely sure if this would work, but it involves calling getArray twice which I'd like to avoid
Set myArray = getArray()
End Sub
In C# - oder Java-das äquivalent wäre:
public MyType[] getArray(){
//do some work and return an array of an unknown length
}
public void doSomething(){
MyType[] myArray;
myArray = getArray(); //one line and I don't need to define the length of array beforehand
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei der Zuweisung von arrays von benutzerdefinierte Objekte in vba, müssen Sie übergeben, um als Variantenich habe ein voll funktionsfähiges Muster.Klassenmodul mit dem Namen MyType:
Code im Standardmodul:
Wenn Sie das erste mal ausführen
doSomething
ein array mit zufälliger Länge wird generiert, und Sie werden sehen, eine Meldung, die sagt, "Lange Prozess abgeschlossen". Nachfolgende AufrufedoSomething
wird die erneute Verwendung der array erstellt, das erste mal.Wenn Sie kopieren Sie diesen code und führen Sie einfach die
Test
sub aufrufendoSomething
drei mal. Sehen Sie die message-box einmal und die Ausgabe vondoSomething
im Direktfenster drei mal.Gut, man könnte das array übergeben, als Referenz an die Funktion wie folgt:
Innerhalb der Funktion können Sie
ReDim
array wollte.Es ist durchaus möglich, ein array zurückgeben, von einer Funktion in VBA. Nach MSDN:
So brauchen Sie nur zu ändern Sie Ihren bestehenden code durch entfernen
Set
von der Zuweisungsanweisung:Variant
anstelle von einem bestimmten Typ, aber wie hast du da rausgefunden, das ist unabhängig von der Tatsache, dass Sie erstellt haben, ein Objekt einer benutzerdefinierten Klasse. Vielen Dank für den code testen und zu überprüfen, dass es tatsächlich funktioniert.Ich denke, dass Sie gerade benötigen, um loszuwerden, das
set
im SetmyArray = getArray()
Dieser verhält sich richtig:
Set
erforderlich ist