AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Excel VBA: Declare Function Libname als Variable – Wie geht das?
Thema durchsuchen
Ansicht
Themen-Optionen

Excel VBA: Declare Function Libname als Variable – Wie geht das?

Ein Thema von Andreas13 · begonnen am 9. Okt 2021 · letzter Beitrag vom 10. Okt 2021
Antwort Antwort
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#1

Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 00:25
Hallo Community,
ich bräuchte wieder mal Euer Spezialwissen: Es geht um die „Declare Function“ in VBA. https://docs.microsoft.com/de-de/off...lare-statement

[ Öffentlich | Privat ] Declare PtrSafe Sub name Lib "libname" [ Alias "aliasname" ] [ [ [ arglist ] ) ]

Nehmen wir ein einfaches Beispiel:
Code:
Declare Function Funkt_1 Lib "MyLib.dll" _
(ByVal X As Double) As Double
Funkt_1 befindet sich hierbei in MyLib.dll
Ich möchte gerne den String "MyLib.dll" durch die Variable MyLibName ersetzen, wobei MyLibName den kompletten Pfad und den DLL-Namen enthält.

VBA bring stets die Fehlermeldung: "Fehler beim Kompilieren: Erwartet: Zeichenfolgenkonstante"

Meine Fragen:
1):
Kann man Excel irgendwie austricksen?

2):
Oder, wenn das nicht geht, wie kann ich Excel veranlassen, "MyLib.dll" im selben Verzeichnis zu suchen, wo sich die Excel-Datei befindet?

Ich habe beim Öffnen des Excel-Files das entsprechende Verzeichnis ermittelt und in der Variablen strPfad abgelegt. Selbst ein an und für sich unnötiges ChDir(strPfad) bleibt wirkungslos.
Code:
Private Sub Get_Pfad()
  strPfad = ThisWorkbook.Path
  ChDir strPfad
End Sub

Public Sub Workbook_Open()
  Get_Pfad
End Sub
Vielen Dank für Eure Hilfe im Voraus!

Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 06:50
Zitat:
Ich möchte gerne den String "MyLib.dll" durch die Variable MyLibName ersetzen, wobei MyLibName den kompletten Pfad und den DLL-Namen enthält.
Das funktioniert nicht!
Es wird eine Konstante erwartet keine Variable.

Es muß eine Zeichenfolge Konstante sein! Also innerhalb Anführungszeichen = "MyLib.dll" oder wie auch immer.
Absolute Pfade innerhalb der Anführungszeichen sollten jedoch funktionieren.

Das dürfte auch nicht funktionieren..
Code:
const MyLibName = "myfullpath\MyLib.dll"
Denn MyLibName ist nicht in Anführungszeichen eingeschlossen.

Was eventuell helfen kann ist deine Library wenn nicht gefunden mit LoadLibrary zu laden.
Das muß aber geschehen bevor irgend etwas von deiner DLL verwendet wird. Nachher das Freigeben nicht vergessen.
Zitat:
Kann man Excel irgendwie austricksen?
Nein!
Zitat:
Oder, wenn das nicht geht, wie kann ich Excel veranlassen, "MyLib.dll" im selben Verzeichnis zu suchen, wo sich die Excel-Datei befindet?
Dort sucht Excel zuerst!
Bedenke aber wenn solche Fehler aufkommen und die DLL nicht gefunden wird obwohl im Pfad vorhanden, fehlen unter umständen andere Abhängigkeiten die deine DLL benötigt.
---------------
Wenn Du lediglich den Namen der Dll angibst, sprich ohne Pfadangabe, wird an folgenden Orten nach der Dll gesucht:

1. Verzeichnis deiner Exel-Datei..
2. In dem Systemverzeichnis [Windows-Verzeichnis]\System32
3. Im [Windows-Verzeichnis] (z.B. C:\Windows)
4. An den in der PATH Umgebungsvariablen angegebenen Verzeichnissen.

Geändert von venice2 ( 9. Okt 2021 um 07:49 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 19:30
Danke Emil für Deine Ausführungen!

Zitat:
Oder, wenn das nicht geht, wie kann ich Excel veranlassen, "MyLib.dll" im selben Verzeichnis zu suchen, wo sich die Excel-Datei befindet?
Dort sucht Excel zuerst!
Bedenke aber wenn solche Fehler aufkommen und die DLL nicht gefunden wird obwohl im Pfad vorhanden, fehlen unter umständen andere Abhängigkeiten die deine DLL benötigt.
---------------
Wenn Du lediglich den Namen der Dll angibst, sprich ohne Pfadangabe, wird an folgenden Orten nach der Dll gesucht:

1. Verzeichnis deiner Exel-Datei..
2. In dem Systemverzeichnis [Windows-Verzeichnis]\System32
3. Im [Windows-Verzeichnis] (z.B. C:\Windows)
4. An den in der PATH Umgebungsvariablen angegebenen Verzeichnissen.
Ja, das kenne ich auch: Das nennt man Theorie...
Bei mir ist zwischen Theorie und Praxis – aus welchen Gründen auch immer – eine riesige Kluft vorhanden: Bei mir findet Excel 2016 Pro (32-Bit) auf meinem Entwicklungsrechner keine DLL im Verzeichnis der Excel-Datei, nur im Windows-Verzeichnis: C:\Windows\. Auf meinem anderen, noch "jungfräulichen" PC – nur mit Win-10 Entreprise und Office 2019 Pro (32-Bit) – verhält es sich leider genauso.

Selbst im Verzeichnis C:\Windows\System32\ wird die DLL von Excel nicht gefunden, obwohl laut PATH-Befehl der Suchpfad existiert! Das ist schon eigenartig.
Dann bleibt mir nichts anderes übrig – wie bisher gehandhabt – meine DLL’s in C:\Windows\ zu versenken.

Danke für Deine Hilfe!
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 ( 9. Okt 2021 um 21:19 Uhr)
  Mit Zitat antworten Zitat
markus888

Registriert seit: 23. Dez 2018
46 Beiträge
 
#4

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 20:39
Wenn Du lediglich den Namen der Dll angibst, sprich ohne Pfadangabe, wird an folgenden Orten nach der Dll gesucht:

1. Verzeichnis deiner Exel-Datei..
2. In dem Systemverzeichnis [Windows-Verzeichnis]\System32
3. Im [Windows-Verzeichnis] (z.B. C:\Windows)
4. An den in der PATH Umgebungsvariablen angegebenen Verzeichnissen.

Ja, das kenne ich auch: Da nennt man Theorie...
Zu Punkt 1: Es wird in dem Order der exe gesucht, nicht in dem Ordner wo sich das Dokument befindet.
Punkt 2: Da wäre mal die Frage ob es sich um ein 64 oder 32 Bit Excel handelt. Bei 64 Bit Excel sucht er in System32, bei 32 Bit Excel in \SysWOW64.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 21:01
Hi Markus888,
s. oben #3:
"Excel 2016 Pro (32-Bit)" und "Office 2019 Pro (32-Bit)".
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 9. Okt 2021, 23:16
Zitat:
Zu Punkt 1: Es wird in dem Order der exe gesucht, nicht in dem Ordner wo sich das Dokument befindet.
Eine *.txt Datei wird mit einem Text Editor gestartet!
Eine *.xls\*.xlsx\*.xlms Datei ist eine Excel Datei und wird mit Excel gestartet.

VBA ist eine Programmiersprache mit der man Macros (innerhalb der/für) Excel Datei\en Programmieren kann.
Zitat:
Visual Basic for Applications ist eine Skriptsprache, die ursprünglich für die Steuerung von Abläufen der Microsoft-Office-Programmfamilie entwickelt wurde.
Sie wurde aus dem von Microsoft entwickelten BASIC-Dialekt Visual Basic abgeleitet.
Nun die Frage interessiert es eine Excel Datei ob sich eine Exe innerhalb seines Pfades befindet um diese Ausführen zu können? Nein!
Also wenn es sich hier um eine Excel Datei handelt die wie auch immer gestartet wird (letztendlich mit Excel) dann interessiert es diese Datei nicht
ob sich eine Exe in seinem ThisWorkbook.Path befindet.

Dementsprechend war meine Aussage berechtigt.
Es wird im Pfad der Excel Datei gesucht nicht im Pfad der EXE.
Man benötigt keine Exe um *.xlsx Dateien bzw. Macros aus dieser heraus auszuführen. (abgesehen von Excel natürlich)
Aber egal einige wissen es halt besser.

Zitat:
Ja, das kenne ich auch: Das nennt man Theorie...
Bei mir ist zwischen Theorie und Praxis – aus welchen Gründen auch immer – eine riesige Kluft vorhanden
Ja das kenne ich auch.
Wenn ich früher in VB6 Dll's finden wollte die nicht registriert werden mußte ich diese immer im Pfad der VB6.exe ablegen
damit sie vom Compiler gefunden wurden. Hat mich auch immer genervt.

PS:
Was du noch versuchen könntest setze die Umgebungsvariable selbst.
Danach könntest du dir den Pfad Windows ersparen. Vielleicht hilft es dir ja.

bsp:
Code:
'In ein Modul

Public Declare Function SetEnvironmentVariable Lib "kernel32.dll" Alias "SetEnvironmentVariableA" ( _
    ByVal lpName As String, _
    ByVal lpValue As String _
) As Long

Public Function RPP(ByVal fp As String) As String

    RPP = IIf(Mid$(fp, Len(fp), 1) <> "\", fp & "\", fp)

End Function

Public Function FileExist(ByVal Bestand As String) As Boolean

    If InStr(1, Bestand, ".") = 0 Then
        FileExist = False
        Exit Function
    End If

    On Error Resume Next
        Call FileLen(Bestand)
        FileExist = (err = 0)
    On Error GoTo 0

End Function

'....... end Modul

Dim MyLibPath As String

'Set Path to MyLib

    MyLibPath = "%Path%;" & ThisWorkbook.Path
    SetEnvironmentVariable "Path", MyLibPath

    'Überprüfe "MyLib.dll" ob sie existiert
    If Not FileExist(RPP(ThisWorkbook.Path) & "\MyLib.dll") Then
        MsgBox "MyLib.dll existiert nicht!", vbCritical, "MYLIB.DLL"
        End 'gleiche wie Halt unter Delphi
    End If

Geändert von venice2 (10. Okt 2021 um 04:23 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Excel VBA: Declare Function Libname als Variable – Wie geht das?

  Alt 10. Okt 2021, 21:20
Vielen Dank Emil für Deine tatkräftige Hilfe und guten Tipps!
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz