Ich habe gerade entdeckt, dass ich einige .NET-Klassen aus VBA mit der CreateObject-Methode erstellen kann, die COM-Klassen erstellen kann. Dies ist ziemlich cool, aber die erstellte Klasse ist spät gebunden, so dass Sie keine Intellisense usw. erhalten. Also, was ich zu tun hoffte, war VBA-Wrapper-Klassen zu schreiben und alle Methodenaufrufe an einen internen Verweis auf das .Net-Objekt zu delegieren. p>
Das funktioniert also gut für ein ArrayList-Objekt für alles außer für den Verweis auf den Enumerator. Es gibt einen Hack für VBA, mit dem Sie Ihre eigenen Sammlungen erstellen und die For Each-Syntax zum Aufzählen Ihrer Sammlungen verwenden können. Das Folgende ist ein Beispiel:
%Vor%Die meisten Implementierungen enthalten einen Verweis auf ein VBA Collection-Objekt und übergeben den Enumerator für das Collection-Objekt. Aber da ich eine .Net ArrayList halte, möchte ich das weitergeben. Allerdings bekomme ich "Ungültige Prozedur Aufruf oder Argument", wenn ich es versuche.
Mein aktueller Versuch ist dies:
%Vor%Ich bin mir ziemlich sicher, dass dies möglich ist, weil es möglich ist, die ArrayList-Sammlung ohne den Wrapper direkt zu durchlaufen. ZB
%Vor%Ich kann ohne die For Each-Funktionalität leben, aber es wäre schön, wenn ich es zur Arbeit bringen könnte, besonders wenn es so aussieht, als wäre es fast da.
Bearbeiten: Es ist wahrscheinlich erwähnenswert, dass das Instanziieren einer ArrayList und das anschließende Aufrufen von GetEnumerator den gleichen Fehler auch außerhalb einer Wrapperklasse ergibt.
Weitere Bearbeitung: Beachten Sie, dass beim Versuch, eine Variable vom Typ IUnknown auf das Ergebnis der GetEnumerator-Methode zu setzen, immer noch derselbe Fehler auftritt.
%Vor%Final Edit: Dank @ RegEdits Kommentaren unten konnte ich dies zum Laufen bringen und dachte, ich würde den Code hinzufügen:
%Vor%Wenn Sie
verwenden %Vor% Sie deklarieren ein COM-Objekt. Aber COM implementiert IEnumerator als IEnumVARIANT
, das IUnknown
direkt erbt, und COM ist nicht glücklich, den Rückgabewert GetEnumerator
in Object
zu setzen. Stattdessen können Sie
BEARBEITEN: Beachten Sie, dass, obwohl ArrayList
implementiert IEnumerable
, es überlädt GetEnumerator
mit einer Methode, die index
und count
übernimmt. Sie müssen also das Schlüsselwort Nothing
in VBA verwenden, wenn Sie die Überladung ohne Parameter aufrufen möchten.
Sie können sehen, dass es funktioniert, denn wenn Sie Ihre ursprünglichen Codezeilen einfügen, fügen Sie zwei Elemente zur Liste hinzu und verwenden dann einen Aufruf wie
%Vor%Sie erhalten jetzt einen neuen (erwarteten) Fehler, der Sie darüber informiert, dass Offset / Länge außerhalb der Grenzen liegen.