2012-09-24 12 views
7

Próbuję uzyskać tak blisko funkcji wskaźników/klas abstrakcyjnych, jak mogę w VBA.Co to jest publiczny moduł obiektowy w języku VBA?

Mam klasę o nazwie VerificationManager i weryfikuję kilka komórek w kilku dopasowanych arkuszach kalkulacyjnych. Odbywa się to na różne sposoby w zależności od informacji i arkuszy kalkulacyjnych, które są z nim używane.

Chciałbym móc dokonać ponownego użycia kodu, określając metodę, która będzie wywoływana w ciągu znaków przy użyciu funkcji Application.Run. Więc mogę przepisać funkcję, która się zmienia.

Teraz, gdy używałem języka Java lub języka C#, byłbym w stanie rozszerzyć klasę abstrakcyjną i przepisać funkcje wewnętrzne na funkcję. Gdybym używał JavaScriptu, mógłbym zapisać funkcję w zmiennej i przekazać zmienną do klasy i wywołać ją stamtąd.

Wewnątrz mojej klasy mam publiczną właściwość o nazwie "verificationModule", którą ustawiam na nazwę funkcji, którą chcę wywołać.

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

Jednak gdy próbuję zadzwonić Application.Run pojawia się następujący błąd:

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"

Próbowałem już umieszczając mój User Defined typów w Class Module ale to w zasadzie powiedzieć, że moduł klasy był zły miejsce dla typu.

Odpowiedz

-2

Aby dodać moduł do aplikacji VBA, wykonaj następujące czynności (zakładając, że masz już wszedł do VBA IDE):

  1. Od Project Explorer kliknij prawym przyciskiem myszy na projekcie.
  2. Kliknij "Wstaw ..."
  3. Wybierz "Moduł".
  4. Jeśli nie istnieją moduły, zostanie utworzony nowy folder w projekcie VBA/Excel o nazwie "Moduły" i zostanie utworzony moduł o domyślnej nazwie "Moduł1".
  5. Kliknij dwukrotnie moduł, aby otworzyć go w edytorze źródłowym.

Tutaj należy umieścić UDT. Wierzę, że to ze względu na różnicę w sposobie takie typy przechowywane są wewnętrznie przez VBA w stosunku do struktury COM stylu elementów/obiektów deklarowanej/manipulowane jako klasy ...

enter image description here

+0

Wydaje mi się, że właśnie to zrobiłem, gdy stworzyłem wszystkie moduły do ​​projektu. Czy jest tu jeszcze coś, czego mi brakuje? – leeand00

+0

Gdzie umieściłeś UDT? Jako test, po prostu wstawiłem próbkę UDT na górze modułu utworzonego zgodnie z powyższym opisem i wygląda na to, że działało dobrze ... –

+0

Czy jestem nieporozumieniem problemu i czy chcesz przenieść swoje UDT do pełnej wersji? -fledged Klasy w VBA? –

8

Błąd pochodzi z pełnoprawny VB, w którym można utworzyć projekt dll ActiveX, utworzyć tam publiczną klasę i umieścić UDT w tej klasie.

W języku VBA używasz klas zamiast UDT, gdy musisz przymuszać do lub od wariantu.

Po prostu zadeklaruj klasę ze wszystkimi polami, które masz w swoim UDT, i usuń UDT.

Alternatywnie utwórz DLL w VB6, który zawierałby tylko deklarację typu i odniesienie do tej biblioteki z VBA. Lub, jeśli nie masz nic przeciwko IDL, po prostu utwórz plik TLB bezpośrednio.