DLL aufruf aus Excel-Makro

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DLL aufruf aus Excel-Makro

Beitrag von Kiffi »

Martin66119 hat geschrieben:die Fehlermeldung Datei nicht gefunden: D:\PB\ExcelDll\MyFuction.dll
fehlt da ein 'n'?

Grüße ... Kiffi
a²+b²=mc²
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: DLL aufruf aus Excel-Makro

Beitrag von - chris - »

Ich habe das in Excel in einem Modul:

Code: Alles auswählen


Private Declare PtrSafe Sub MyFunction Lib "D:\ExcelDLL\MyFunction.dll" ()

Sub ExcelDLL_MyFunction()
  Call MyFunction
End Sub

Ausführen:
Entwicklertools -> Makros -> Makro "ExcelDLL_MyFunction" -> Ausführen
Zuletzt geändert von - chris - am 22.02.2014 14:30, insgesamt 1-mal geändert.
PB v5.72 x86/x64
Windows 10 Pro 64bit
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: DLL aufruf aus Excel-Makro

Beitrag von - chris - »

Alles mit 32Bit und Excel 2002 in ein Modul:

Code: Alles auswählen


Private Declare Sub MyFunction Lib "D:\ExcelDLL\MyFunction.dll" ()

Sub ExcelDLL_MyFunction()
  Call MyFunction
End Sub

Ausführen:
Extras -> Makro -> Makros - Makro "ExcelDLL_MyFunction" -> Ausführen
PB v5.72 x86/x64
Windows 10 Pro 64bit
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: DLL aufruf aus Excel-Makro

Beitrag von Martin66119 »

Danke nochmals! Aber aus irgendeinem Grund klppt es nicht.

In Excel habe ich deinen Code:

Code: Alles auswählen

Private Declare Sub MyFunction Lib "D:\ExcelDLL\MyFunction.dll" ()

Sub ExcelDLL_MyFunction()
  Call MyFunction
End Sub

Wenn ich nun in Excel "ausführen" beträtige bekomme ich immer die Fehlermedlung Datei nicht gefunden
und im Debugger ist dann call myFunction markiert.

In PB habe ich folgenden entCode. Den ich als Dll-Compiliert habe. Die entstandene Dll hat den Namen
ExcelDll_MyFunction.dll Dann ist noch die Datei ExcelDll_MyFunction.lib und ExcelDll_MyFunction.exp beim compilieren erstellt worden. Sowohl die Excel als auch die dll sind im sellben Verzeichnis.

Code: Alles auswählen

ProcedureDLL MyFunction()
  MessageRequester("Hallo", "Dies ist eine PureBasic DLL !", 0)
    Input$ = InputRequester("Titel", "Bitte machen Sie Ihre Eingabe:", "Ich bin die Standardeingabe.")

  If Input$ > ""
    a$ = "Sie haben folgendes in den Requester geschrieben:" + Chr(10)  ; Chr(10) wird nur für
    a$ + Input$                                                   ; den Zeilenumbruch benötigt
  Else  
    a$ = "Der Requester wurde abgebrochen oder es wurde nichts eingegeben."
  EndIf
  MessageRequester("Information", a$, 0)
  EndProcedure
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: DLL aufruf aus Excel-Makro

Beitrag von Falko »

Du schreibst hier .... Private Declare Sub MyFunction Lib "D:\ExcelDLL\MyFunction.dll" ()

Und dazu hast du geschrieben, das eine Datei mit dem Namen ExcelDLL_MyFunction.dll compiliert worden sei:

Dann sollte im ExcelMacro auch dieser Name drin stehen, oder?

Es sei denn, du hast dich hier mit dem Unterstich und den Backslash versehen ;

Gruß,
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: DLL aufruf aus Excel-Makro

Beitrag von - chris - »

Und dann schreibst du hier:

"Sowohl die Excel als auch die dll sind im sellben Verzeichnis."

Private Declare Sub MyFunction Lib "D:\ExcelDLL\MyFunction.dll" ()

Hier muß sich die DLL im Verzeichnis "D:\ExcelDLL" befinden, die Excel-Datei muß nicht im selben Verzeichnis sein.
PB v5.72 x86/x64
Windows 10 Pro 64bit
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: DLL aufruf aus Excel-Makro

Beitrag von Martin66119 »

Danke für die Hilfe! Hat nun geklappt:

Code: Alles auswählen

; Excel Makro
Private Declare Sub MyFunction Lib "D:\PB\ExcelDLL\ExcelDLL_MyFunction.dll" ()

Sub ExcelDLL_MyFunction()
  Call MyFunction
End Sub

Code: Alles auswählen

; PB Code für dll; Name der dll; ExcelDll_MyFunction

ProcedureDLL MyFunction()
  MessageRequester("Hallo", "Dies ist eine PureBasic DLL !", 0)
    Input$ = InputRequester("Titel", "Bitte machen Sie Ihre Eingabe:", "Ich bin die Standardeingabe.")

  If Input$ > ""
    a$ = "Sie haben folgendes in den Requester geschrieben:" + Chr(10)  ; Chr(10) wird nur für
    a$ + Input$                                                   ; den Zeilenumbruch benötigt
  Else  
    a$ = "Der Requester wurde abgebrochen oder es wurde nichts eingegeben."
  EndIf
  MessageRequester("Information", a$, 0)

  EndProcedure
  
Vielen vielen Danl für eure Hilfe
Martin
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: DLL aufruf aus Excel-Makro

Beitrag von Martin66119 »

Hallo und einen schönen Sonntag,

vielen Dank nochmals für eure Hilfe. Eine Dll aus Excel zu starten hat nun mit folgendem Code geklappt.

Excel-Code:

Code: Alles auswählen

Private Declare Sub MyFunction Lib "E:\PB\ExcelDLL\ExcelDLL_MyFunction.dll" ()

Sub ExcelDLL_MyFunction()
  Call MyFunction
End Sub
PB-Code:

Code: Alles auswählen

ProcedureDLL MyFunction()
NewList Datei1.s()
NewList Datei1_1.s()
NewMap Datei2.s()

If OpenWindow(0, 0, 0, 1200, 650, "PureBasic Window", #PB_Window_Maximize | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    If CreateMenu(0, WindowID(0))  ; hier beginnt das Erstellen des Menüs...
      MenuTitle("Project")
        MenuItem(1, "Open")
        MenuBar()                  ; hier wird der Abgrenzungsbalken eingefügt
        MenuItem(4, "Close")
    EndIf
  
  StandardFile$ = "*\"   ; anfänglichen Pfad + Dateiname festlegen
  Pattern$ = "Text (*.txt)|*.txt;*.csv|Text (*.csv)|*.pb|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  Filename1$ = OpenFileRequester("Bitte erste Datei zum Vergleich auswählen", StandardFile$, Pattern$, Pattern)
  
 ReadFile(1,FileName1$)
 While Eof(1)=0
   Zeile.s=ReadString(1)          
   AddElement(Datei1())
   Datei1() = Zeile.s
 Wend
 CloseFile(1)
           
  StandardFile$ = "*\"   ; anfänglichen Pfad + Dateiname festlegen
  Pattern$ = "Text (*.txt)|*.txt;*.csv|Text (*.csv)|*.pb|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  Filename2$ = OpenFileRequester("Bitte zweite Datei zum Vergleich auswählen", StandardFile$, Pattern$, Pattern)

 ReadFile(1,FileName2$)
 While Eof(1)=0
   Zeile.s=ReadString(1)          
   AddMapElement(Datei2(),Zeile)
   Datei2() = Zeile.s
Wend
CloseFile(1)             
    
ResetList(Datei1())           
ResetMap(Datei2())

StartTime = ElapsedMilliseconds()   
While NextElement(Datei1())  
   Ergebnis = FindMapElement(Datei2(),Datei1()) 
   If Ergebnis = 0   
      AddElement(Datei1_1())
      Datei1_1() = Datei1()
   Else
     DeleteMapElement(Datei2(), Datei1())
     EndIf
 Wend
 Time =ElapsedMilliseconds() - StartTime 
           
 ResetList(Datei1_1())
 ResetMap(Datei2())
            
 If CreateFile(0, "Text1.csv")         
   While NextElement(Datei1_1()) 
      WriteStringN(0, Datei1_1())         
   Wend
   CloseFile(0)                       
 Else
    MessageRequester("Information","Konnte Datei nicht erstellen!")
 EndIf

If CreateFile(0, "Text2.csv")         
  While NextMapElement(Datei2()) 
    WriteStringN(0, Datei2())        
  Wend
  CloseFile(0)                      
Else
  MessageRequester("Information","Konnte Datei nicht erstellen!")
EndIf  

SendMessage_(GadgetID(2),#EM_SHOWSCROLLBAR, #SB_VERT, 1)   
SendMessage_(GadgetID(2),#EM_SHOWSCROLLBAR, #SB_HORZ, 1)  
SendMessage_(GadgetID(3),#EM_SHOWSCROLLBAR, #SB_VERT, 1)   
SendMessage_(GadgetID(3),#EM_SHOWSCROLLBAR, #SB_HORZ, 1) 

EditorGadget(2, 10, 0, 1120, 340,#PB_Editor_ReadOnly)
EditorGadget(3, 10, 350, 1120, 580,#PB_Editor_ReadOnly)
TextGadget(5, 1180,40, 100,25, "Auswertezeit:")
StringGadget(4,1180, 60, 50,25,Str(Time))

;Anzahl_Datei1_1 = ListSize(Datei1_1())
;Anzahl_Datei2 = MapSize(Datei2())

ResetList(Datei1_1()) 
ResetMap(Datei2())

DateiName1$ =GetFilePart(FileName1$)
AddGadgetItem(2, 1, DateiName1$)

DateiName2$ =GetFilePart(FileName2$)
AddGadgetItem(3, 1, DateiName2$)

a = 1
While NextElement(Datei1_1())
   a = a +1
   AddGadgetItem(2, a, Datei1_1())
 Wend
  
While NextMapElement(Datei2())
   a = a +1
   AddGadgetItem(3, a, Datei2())
Wend 

Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1

    EndIf

  Until Quit = 1
  
EndIf

;End   ; All the opened windows are closed automatically by PureBasic

EndProcedure
Wenn ich nun am Ende des PB-Code End drinlasse, kommt die Fehlermeldung "Ende darf in einer DLL nicht verwendet werden". Wenn ich das End dann weglasse klappt es soweit. Aus dem ExcelMakro kann ich die Dll starten. Nur wenn ich dann im Fenster auf das X zum schießen drücke passiert nichts. Das Fenster verkleinern und vergrößern geht. Was muss ich machen, damit beim klicken auf das X das Programm beendet wird.

Schonmal Danke
Martin

PS: Mein Programm ist sicherlich ein Horror!!!!

Edit by NicTheQuick: Code-Tags korrigiert
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: DLL aufruf aus Excel-Makro

Beitrag von NicTheQuick »

Wie wäre es mit 'CloseWindow()'?
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: DLL aufruf aus Excel-Makro

Beitrag von Martin66119 »

Vielen Dank!!!

Nun gehts
Antworten