Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion aus DLL in Excel verwenden (https://www.delphipraxis.net/98388-funktion-aus-dll-excel-verwenden.html)

Jens Schumann 26. Aug 2007 15:59


Funktion aus DLL in Excel verwenden
 
Hallo,
ich habe schon oft Werte in eine Excelzelle geschrieben oder gelesen.
Jetzt habe ich folgende Frage: Ist möglich in einer Excelzelle
eine Funktion aus einer DLL zu verwenden. In der Form von
Code:
A1=TPM$Value(Parameter...)
Die Funktion TPM$Value steht in einer DLL,
die in Excel als AddIn registriert ist.
Oder muss hier ein Makro zwischenschalten?

marabu 26. Aug 2007 16:43

Re: Funktion aus DLL in Excel verwenden
 
Hallo Jens,

wenn ich mich richtig erinnere, dann findest du in der Excel Online Help eine Referenz zu VBA (nicht Excel VBA), aus der du die Syntax für DECLARE EXTERNAL FUNCTION ersehen kannst. In der Richtung würde ich bohren.

Freundliche Grüße

Jens Schumann 26. Aug 2007 18:46

Re: Funktion aus DLL in Excel verwenden
 
Zitat:

Zitat von marabu
wenn ich mich richtig erinnere, dann findest du in der Excel Online Help eine Referenz zu VBA (nicht Excel VBA), aus der du die Syntax für DECLARE EXTERNAL FUNCTION ersehen kannst. In der Richtung würde ich bohren.

Ich habe gebohrt. Wahrscheinlich aber immer noch zu dünn .

Ich habe mit D5 eine DLL gebastelt, die eine Funktion exportiert, die
eine zufällige Zahl zurück liefert.

In Excel bekomme ich das Dinf nicht eingebunden.
Code:
' Public Declare Function GETVALUE Lib "D:\Delphi5\Test\Excel\Werte_aus_DLL\exdll.dll" () As Integer
' Public Declare Function GETVALUE Lib "exdll.dll" () As Integer
Public Declare Function GETVALUE Lib "exdll" () As Integer
Die drei Varianten führen nicht zum Ziel.

In die Zelle auf dem Arbeitsblatt schreibe ich: =GetValue. Excel liefert
aber nur #NAME anstatt eine Zahl :gruebel:

marabu 26. Aug 2007 19:18

Re: Funktion aus DLL in Excel verwenden
 
Testen kann ich frühestens Dienstag, da ich auf der Maschine vor mir kein MS Office installiert habe.

Inzwischen könntest du deine externe Funktion mit =Call(...) aufrufen - vorausgesetzt du hast CALL() nicht wegkonfiguriert.

Freundliche Grüße

PS: Hast du den Excel SDK installiert? Dir reicht vielleicht schon die Online Hilfe klick
Welche Version von Excel verwendest du eigentlich?

Elvis 26. Aug 2007 19:45

Re: Funktion aus DLL in Excel verwenden
 
In Drecks-VB ist ein long ein 32Bit Integer.
Wie sieht die Signatur deiner Delphi-Funktion aus?

Jens Schumann 27. Aug 2007 08:10

Re: Funktion aus DLL in Excel verwenden
 
Hallo,
ich nutze Excel 2002.
Dies ist die DLL
Delphi-Quellcode:
library exdll;
uses
  SysUtils,
  Classes,
  functions in 'functions.pas';

{$R *.RES}

exports

   GetValue;
 
begin
end.

unit functions;

interface

function GetValue : Integer; stdcall;

implementation

function GetValue : Integer; stdcall;
begin
  Result:=Random(10)+1;
end;

end.
Die DLL liegt im Verzeichnis der Exceldatei.

Jetzt habe ich mal probiert eine API Funktion zu importieren
Code:
Public Declare Function GETVALUE Lib "exdll" () As Long
Public Declare Function GetCurrentThreadID Lib "kernel32" () As Long

Function TestValue() As Long
TestValue = 5
End Function
Bei =GetValue() und = GetCurrentThreadID () wird jetzt #WERT in dei Zelle geschrieben.
Wenn in der Zelle =TestValue() steht erscheint wie gewünscht die 5.

Jens Schumann 3. Sep 2007 10:21

Re: Funktion aus DLL in Excel verwenden
 
Hallo,
das das Thema für mich immer noch aktuell ist und trotz aller Bemühungen noch keine
Lösung gefunden habe möchte ich meine Frage mal puschen.

Jens Schumann 3. Sep 2007 10:28

Re: Funktion aus DLL in Excel verwenden
 
Hallo,
es ist mit jetzt aber ziemlich peinlich. Gerade eben noch gepuscht und anschließend die Lösung gefunden.

Lösung: Die DLL muss im ..\system32 Verzeichnis liegen :wall:

juergen schmidt 8. Sep 2007 16:49

Re: Funktion aus DLL in Excel verwenden
 
Hallo Jens,

grüble auch über diesem Problem einer sauberen Funktionsübergabe.

vielleicht kannst Du mir mal einen Auszug über dein Projekt senden. (.dpr, .dll etc.)

Wäre dankbar - da es bei mir auch beim Versuch nach deinem Beitrag nicht
funktioniert.

Gruss Jürgen

Jens Schumann 9. Sep 2007 17:22

Re: Funktion aus DLL in Excel verwenden
 
Hallo Jürgen,
nach dem ich die DLL ins system32 geschoben habe läuft es einwandfrei.

Dies sind die Funktionen, die die DLL exportiert
Delphi-Quellcode:
function TPMValue1(Year, Partner, Entity, Posnr, Bwa : PChar) : Double; stdcall;
function TPMValue2(Year,Partner, Entity, Posnr : PChar) : Double; stdcall;
function TPMValue3(Year, Entity , Posnr : PChar) : Double; stdcall;
function TPMValue4(Year, Entity, Posnr, Bwa : PChar) : Double; stdcall;
Die Paramer sind ausschließlich Strings

In Excel werden die Funktionen wie folgt importiert.
Code:
Public Declare Function TPMValue1 Lib "tpmdirect" (ByVal Year As String, ByVal Partner As String, ByVal Entity As String, ByVal Posnr As String, ByVal Bwa As String) As Double
Public Declare Function TPMValue2 Lib "tpmdirect" (ByVal Year As String, ByVal Partner As String, ByVal Entity As String, ByVal Posnr As String) As Double
Public Declare Function TPMValue3 Lib "tpmdirect" (ByVal Year As String, ByVal Entity As String, ByVal Posnr As String) As Double
Public Declare Function TPMValue4 Lib "tpmdirect" (ByVal Year As String, ByVal Entity As String, ByVal Posnr As String, ByVal Bwa As String) As Double

Function TPM_Value1(ByVal Year As String, ByVal Partner As String, ByVal Entity As String, ByVal Posnr As String, ByVal Bwa As String) As Double
  TPM_Value1 = TPMValue1(Year, Partner, Entity, Posnr, Bwa)
End Function

Function TPM_Value2(ByVal Year As String, ByVal Partner As String, ByVal Entity As String, ByVal Posnr As String) As Double
  TPM_Value2 = TPMValue2(Year, Partner, Entity, Posnr)
End Function

Function TPM_Value3(ByVal Year As String, ByVal Entity As String, ByVal Posnr As String) As Double
  TPM_Value3 = TPMValue3(Year, Entity, Posnr)
End Function


Function TPM_Value4(ByVal Year As String, ByVal Entity As String, ByVal Posnr As String, ByVal Bwa As String) As Double
  TPM_Value4 = TPMValue4(Year, Entity, Posnr, Bwa)
End Function
Da ich die importierten Funktionen nicht direkt in der Zelle verwenden kann (weiss nicht warum) habe ich mir eine VBA Wrapper-Funktion geschrieben. Geht wie geschmiert.

Was mir jetzt noch fehlt ist die Übergabe eines Strings aus der DLL ins Excel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz