# Externe DLL unter VBA(Excel) einbinden



## FIAzubi (12. Juli 2004)

Moin moin

Wollte unter VBA, in einer Externe DLL-Datei eine Prozedur namens: "abc" od. "asd" der Klasse "Class1" ausführen lassen.


```
Declare Function test Lib "C:\Documents and Settings\My Documents\ClassLibrary1.dll" () As Long

Public Sub test()
Call abc
'Call asd

End Sub
```


Leider kommt bei "Call abc" ein Compiler Error: Sub or Function not defined.
Was habe ich da vergessen

Vielen Dank schonmal


----------



## Retlaw (12. Juli 2004)

Du hast vergessen "abc" zu deklarieren.


----------



## FIAzubi (12. Juli 2004)

*?*

Als was soll ich abc deklarieren? "abc" ist der name einer Prozedur in der Klasse, die in der DLL liegt.


----------



## FIAzubi (12. Juli 2004)

Hab das mal wie folgt Probiert.
Geht aber auch nicht.

Was mach ich Falsch?



```
Declare Function Class1 Lib "C:\Documents and Settings\My Documents\ClassLibrary1.dll" () As Long



Public Sub test()
Dim abc
Set abc = New Class1


Call abc

'Call asd

End Sub
```


----------



## Shakie (12. Juli 2004)

probier's mal wenn du die DLL nach "Windows\System32" kopierst und dann nur:
	
	
	



```
Declare Function Class1 Lib "ClassLibrary1.dll" () As Long
```


----------



## FIAzubi (12. Juli 2004)

Geht leider auch nicht.

Das Problem ist, der findet den Einsprungspunkt nicht. Den Pfad zur DLL ist in Ordnung.


----------



## Retlaw (13. Juli 2004)

Hatte angenommen du hast die DLL schon registriert, falls nicht hol das nach.  
Das kannst du entweder vorher machen oder während der Laufzeit.

Übrigens: Wenn du Class1 als *Function* deklarierst, wie willst du davon dann mit new eine neue Instanz erstellen?

Deklaration von Funktionen einer DLL siehe VBA-Hilfe "Declare-Anweisung".
Da steht alles drin was du brauchst damit die Anweisung richtig wird.

Gehts dann immer noch nicht und du hast die DLL selber geschrieben schau nach ob die auch keinen Fehler hat.


----------



## FIAzubi (13. Juli 2004)

*Fragen über Fragen*

moin moin


bin relativ neu in diesem Gebiet. Hab deshalb auch noch nicht so viel Erfahrung. 
Wie registriere ich eine DLL während der Laufzeit bzw. wie regestriere ich eine DLL überhaupt?

Aus meiner VBA-Hilfe werd ich nicht so recht schlau.... 


Die DLL Funktioniert. Hab Sie unter VB.net eingebunden und eine Prozedur aufgerufen.


----------



## Retlaw (13. Juli 2004)

Hier gibts ein gutes Tutorial für PlugIns (erklärt aber gut den Umgang mit DLLs, auch das Registrieren).
Ansonsten ruf mal die Hilfe auf (in einem MS-Office-Produkt deiner Wahl den VBA-Editor aufrufen und dann Hilfe oder F1) und gib "Declare" oder "Declare-Anweisung" ein, da ist die Syntax schön übersichtlich dargestellt mit viel Erklärungen.

PS: Kenne mich mit .NET nicht aus aber kanns sein das diese DLL dann nur mit .NET funktioniert?


----------



## Cthulhu (13. Juli 2004)

tach

wenn die dll selbst geschrieben hast, musste sie nicht registrieren, kannst den Pfad hard codieren.

bsp.

```
Public Declare Function MessageTest Lib "c:\temp\messageDLL.dll" Alias "Message" (lngHWND As Long) As Integer
```

Als Alias steht dann der Funktionsname.

Probier mal das


----------



## FIAzubi (13. Juli 2004)

> PS: Kenne mich mit .NET nicht aus aber kanns sein das diese DLL dann nur mit .NET funktioniert?



Das weiß ich auch nicht. Mir ist nur bekannt, dass es keine AvtiveX-DLL ist. 
Möchte sie dennoch gerne in VBA einbinden. Kann es sein, dass VB.net eine DLL in ein Format erstellt, die VBA nicht entschlüsseln kann?
Gibt es vielleicht noch eine andere Möglichkeit externe Prozeduren einer Klasse, in einer Datei abzuspeichern und mittels VBA auszuführen?

Bekomm immer die Fehlermeldung: 
Run-time error '453!:
Can't find DLL entry point abc in C:\..........dll

Quasi findet er die Datei, kann nur nicht auf die Prozedur "abc", in der Klasse "Class1" zugreiffen.


Wenn ich den Pfad FALSCH eingebe, kommt:
File not found: C:\........dll


----------



## Cthulhu (13. Juli 2004)

Bin im mom auch grad mit dlls am rumbasteln. Diese Fehlermeldung mit Einistiegspoint nicht gefunden, kommte, wenn der Function-Name falsch ist.
Nach 
	
	
	



```
...Function
```
  kannst ein selbst gewählter Name hinschreiben, nach 
	
	
	



```
...Alias
```
 kommt der Function-Name.

Der Aufruf funktioniert dann so:

```
MessageTest(Me.hWnd)
```
Auf mein bsp. bezogn


----------



## FIAzubi (13. Juli 2004)

Hab ich probiert. Kommt aber auch noch der selbe Fehler mit Einsprungsmarke nicht gefunden.

Hab mal meine DLL ausgelesen:


```
Public Class Class1
    Public Function abc()
        MsgBox("abc")

    End Function
End Class
```

mehr steht in der DLL nicht drin.


darum versuch ich schon verzweifelnd auf die Function "abc" aufzurufen.


----------



## FIAzubi (13. Juli 2004)

Muss ich vielleicht zusätzlich die Klasse in der DLL angeben Wenn ja, wie mach ich das?


----------



## Cthulhu (13. Juli 2004)

Bei VB weiss ichs net, hab meine DLL mit C geschrieben. Wie hast du denn die DLL erstellt?


----------



## FIAzubi (13. Juli 2004)

Genau da liegt vielleicht das Problem. Hab Sie mit VB.net erstellt.
Leider war es mir nicht möglich, daraus eine ActiveX-DLL zu erstellen.
Hab aber keine andere Möglichkeit oder kann man mit VBA ähnliche Dateien erstellen, wo man die Prozedur extern während der Laufzeit öffnen kann?

Damit ich nicht jedesmal das gleiche Modul schreiben muss, bzw bei Änderungen jedes Modul einzeln verändern muss, brauch ich eine externe Datei mit den ich die Functionen einmalig verwalten kann.


----------



## FIAzubi (13. Juli 2004)

Gibt es eine Möglichkeit: Einen Verweis auf einen Code in einer *.bas or *.cls wärend der Laufzeit zu geben?


----------



## Retlaw (13. Juli 2004)

Versuchs mal mit

```
set myDLL = CreateObject("Class1")
myDll.abc
```
Evtl. noch unter Projekte (in Excel unter Extras) => Referenzen die DLL ins Projekt einbinden. Die DLL muss dazu evtl. auch im System registriert sein.


----------



## FIAzubi (13. Juli 2004)

Kann die DLL-Datei nicht zu den Referenzen hinzufügen. Ist keine ActiveX-DLL.

Die Function createObjekt kann ich nicht ausführen. Mir fehlt die Libary, weißt du zufällig welche das ist?


----------



## Retlaw (13. Juli 2004)

Hast du es richtig geschrieben? Es heißt CreateObje*c*t()
Das ist eine eingebaute Funktion von VB(A).

Beispiele:

```
set Word = CreateObject("Word.Application")
set FSO = CreateObject("Scripting.FileSystemObject")
```

Evtl. musst du bei dir noch den Projektnamen der DLL davor hängen:

```
set myDLL = CreateObject("DLLProjektName.Class1")
myDll.abc
```


----------



## FIAzubi (13. Juli 2004)

Da hab ich wohl ein ziehmliches Problem. 
Geht immer nochnicht. 


Die Function CreateObject() geht nur, wenn ich unter Tools->Referenzen.. die DLL angebe. 
Wenn ich die versuche einzufügen, kommt aber eine Fehlermeldung, da es keine ActiveX-DLL ist.


----------



## FIAzubi (14. Juli 2004)

Kann es sein, dass VBA nicht alle DLL-Formate unterstützt? Sondern nur die COM- und ActiveX-DLLs?


----------



## derGugi (14. Juli 2004)

Du hast offensichtlich eine Klasse erstellt, also musst du meiner Meinung nach eine ActiveX-Dll erstellen um die Klasse verwenden zu können. Wenn du das nicht willst, musst du in deiner DLL eine Funktion AUSSERHALB der Klasse erstellen, auf die du nacher zugreifen kannst (mittels Declare blabla.).


----------



## FIAzubi (14. Juli 2004)

@derGugi
Vielen Dank für den Tipp

werd es gleich mal ausprobieren.


----------



## FIAzubi (14. Juli 2004)

*Schade!*

Kann keine DLL erstellen, wo bloß die function integrierd ist. Der Brauch irgendwie die Funktion in einer Klasse.

Mach ich da was falsch?
Kann ich mittels VBA eine DLL-Datei erstelln?


----------



## derGugi (14. Juli 2004)

Hmm, ich hab so das Gefühl, dass du keine .NET dlls im alten VBA verwenden kannst. Oder ist das Excel-VBA auch .NET? Das weiss ich leider nicht, hab noch nie mit dem Framework gearbeitet. 

Aber was ich weiss: VB.NET erstellt COM+ DLLs, VB6 COM (oder ActiveX) Dlls. Wenn kein .NET Framework installiert ist, kannst du nun auch nicht die .NET dlls verwenden. 

vielleicht hilft dir das weiter:  http://www.vb-fun.de/cgi-bin/forum.pl?ID=2&action=zeigeseite&nummer=4491


----------



## FIAzubi (15. Juli 2004)

Vielan Dank für den Link... 

Kennt jemand von euch ein Tool, womit man den Export einer DLL auslesen kann?
Vermute einfach mal, dass der Funktionsname falsch integriet ist und man die Funktion deshalb anders ansprechen muss.

Bsp: nicht  "abc" sondern "@@abc" oder so etwas.


----------



## Turbman (28. Juli 2005)

Probiers mal mit diesem Tool.
Dependency Walker


----------



## Shakie (28. Juli 2005)

Bei Visual Studio ist ein Dependency-Walker dabei: entweder zu finden im Startmenü unter "Microsoft Visual Studio 6.0-Dienstprogramme" --> "Depends" oder im Visual Studio Verzeichnis auf der Festplatte die Datei "DEPENDS.EXE" im Unterverzeichnis "\Common\Tools\" starten

Edit: Das setzt natürlich voraus, dass du Visual Studio hast und nicht beispielsweise eine andere Version von VB verwendest.


----------



## Turbman (28. Juli 2005)

Es ging um VBA(Excel) und VB.Net. Da gibt es meines Wissens so ein Tool leider nicht.
Aber an sonsten hast du natürlich recht.


----------

