Seite 2 von 3

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 14:12
von Kiffi
Martin66119 hat geschrieben:die Fehlermeldung Datei nicht gefunden: D:\PB\ExcelDll\MyFuction.dll
fehlt da ein 'n'?

Grüße ... Kiffi

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 14:14
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 14:28
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 20:17
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 20:31
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 20:38
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.

Re: DLL aufruf aus Excel-Makro

Verfasst: 22.02.2014 21:23
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 06.04.2014 13:49
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

Re: DLL aufruf aus Excel-Makro

Verfasst: 06.04.2014 13:59
von NicTheQuick
Wie wäre es mit 'CloseWindow()'?

Re: DLL aufruf aus Excel-Makro

Verfasst: 06.04.2014 14:40
von Martin66119
Vielen Dank!!!

Nun gehts