2012-09-24 21 views
7

Ich versuche, so nah wie möglich an Funktionszeiger/abstrakte Klassen zu kommen, wie ich in VBA.Was ist ein öffentliches Objektmodul in VBA?

Ich habe eine Klasse namens VerificationManager und überprüft eine Reihe von Zellen in ein paar Tabellenkalkulation übereinstimmen. Dies geschieht auf unterschiedliche Art und Weise, abhängig von den Informationen und Tabellen, die damit verwendet werden.

Ich möchte in der Lage sein, den Code wiederverwendbar zu machen, indem Sie eine Methode angeben, die mit der Funktion Application.Run in einer Zeichenfolge aufgerufen wird. So kann ich die Funktion, die sich ändert, neu schreiben.

Nun, wenn ich Java oder C# verwenden würde, wäre ich in der Lage, eine abstrakte Klasse zu erweitern und die Interna in die Funktion umzuschreiben. Wenn ich JavaScript benutze, könnte ich eine Funktion in einer Variablen speichern und die Variable an die Klasse übergeben und von dort aus aufrufen.

Innerhalb meiner Klasse habe ich eine öffentliche Eigenschaft namens "verificationModule", die ich auf den Namen der Funktion, die ich es aufrufen möchte, festgelegt habe.

Sub VerifyWorkLocations(empLoc As EmployerLocation) 
... 
    For i = 0 To empLoc.numOfEmp 
     Application.Run verificationModule, empLoc.taxdescmatch, empLoc.employees(i) 
    Next i 
... 
End Sub 

aber wenn ich versuche, Application.Run ich die folgende Fehlermeldung zu nennen:

Compile Error:

"Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions"

Ich habe bereits versucht, meine benutzerdefinierte Typen in einem Class Module platzieren, aber es im Grunde gesagt, dass ein Klassenmodul war die falsche Platz für einen Typ.

Antwort

-2

Um ein Modul zu einer VBA-Anwendung hinzufügen, die folgenden Schritte versuchen (Sie bereits die VBA IDE habe angenommen eingegeben): Ihr Projekt

  1. von dem Project Explorer mit der rechten Maustaste.
  2. Klicken Sie auf "Einfügen ..."
  3. Wählen Sie "Modul."
  4. Wenn keine Module vorhanden sind, wird ein neuer Ordner im VBA/Excel-Projekt namens "Module" erstellt und ein Modul mit dem Standardnamen "Module1" wird erstellt.
  5. Doppelklicken Sie auf das Modul, um es im Quelltext-Editor zu öffnen.

Hier müssen Sie UDTs platzieren. Ich glaube, dies aufgrund der Unterschiede in der Art und Weise ist eine solche Typen intern von VBA in Bezug auf die COM-Stil Struktur der Elemente/Objekte gespeichert werden deklariert/als Klassen manipuliert ...

enter image description here

+0

Es scheint mir, dass ich das gemacht habe, als ich alle Module für das Projekt erstellt habe. Gibt es noch etwas, das ich vermisse? – leeand00

+0

Wo haben Sie die UDT abgelegt? Als Test habe ich einfach eine Beispiel-UDT oben in einem Modul platziert, das wie oben beschrieben erstellt wurde, und es scheint gut zu funktionieren ... –

+0

Oder verstehe ich das Problem nicht, und möchten Sie Ihre UDTs vollständig migrieren? Klassen in VBA? –

8

Der Fehler kommt aus Vollwertige VB, wo Sie ein ActiveX-DLL-Projekt erstellen können, erstellen Sie dort eine öffentliche Klasse und legen Sie eine UDT in diese Klasse.

In VBA verwenden Sie Klassen anstelle von UDTs, wenn Sie von oder zu einer Variante gezwungen werden.

Also deklarieren Sie einfach eine Klasse mit allen Feldern, die Sie in Ihrem UDT haben, und löschen Sie den UDT.

Erstellen Sie alternativ eine DLL in VB6, die nur die Deklaration des Typs enthalten und diese DLL von VBA verweisen würde. Oder, wenn Sie mit IDL vertraut sind, erstellen Sie einfach eine TLB-Datei direkt.