Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL in Excel VBA einbinden (https://www.delphipraxis.net/155597-delphi-dll-excel-vba-einbinden.html)

Sly1 31. Okt 2010 00:28


Delphi DLL in Excel VBA einbinden
 
Hallo zusammen,

Ich habe versucht eine Funktion für Excel (2003) aus Geschwindigkeitsgründen als DLL, (erstellt mit Delphi 7) auszulagern.
Die Funktion soll die Edit Distanz (Levensthein) zwischen zwei Strings (Pchars) berechnen.
Mit einem kleinen Testprogramm in Delphi funktioniert auch alles wunderbar.

Aber wenn ich diese dann mittels VBA in Excel einbinden, erscheint nur die Excelfehlermeldung (in der Zelle): #Wert!
Ich habe die DLL sowohl im Windowsverzeichnis system32 gehabt als auch im gleichen Verzeichnis wie das Excel Arbeitsblatt.

Registrieren lässt sich die DLL nicht da erscheint nur die Fehlermeldung "DLLRegister Server Eingangspunkt wurde nicht gefunden"

Um das Zusammenspiel mit Excel (2003) und der Funktion in der DLL zu vereinfachen,
habe ich (zwecks Test) erst mal mit einer einfacheren Funktion probiert, nämlich zwei Longint Zahlen addieren. Das Ergebnis ist aber dasselbe. (Funktioniert im Delphi Testprogram, aber nicht in Excel). Habe es auch schon mit Double probiert.

Hier der Delphi DLL Code mit der (vereinfachten) Funktion Addiere:

Delphi-Quellcode:
    library LevenDLL;

    uses
    ShareMem,
    SysUtils,
    Classes;

    {$R *.res}


    function Addiere( z1, z2: longint): longint; stdcall;
    begin
    Addiere := z1 + z2;
    end;

    exports Addiere;

    begin
    end.

Was mich weiter verwundert ist dass in Excel exakt die gleiche Fehlermeldung kommt, wenn ich die DLL(s) umbenenne also von Excel gar nicht gefunden werden kann.

In VBA unter Excel sieht der Code wie folgt aus:

Option Explicit
Declare Function Addiere Lib "D:\Markt\LevenDLL.dll" (ByVal z1 As Long, ByVal z2 As Long) As Long

und in der Excel zelle steht dann die Funktion =Addiere(I5;J5) eben mit dem Ergebnis: #Wert!

Nun habe ich fast einen Tag in Foren und in Google gesucht und sehr häufig das gleich Problem gefunden nur leider nicht die Lösung dazu.

Ich habe etwas von COM Dateien gelesen, (kann das das Problem sein)? muß ich hier anders compilieren in Delphi? fehlen mir Bibliotheken? oder was mach ich hier falsch?
Wer hat Erfahrung mit Delphi-DLLs für Excel und kann mir hier auf die Sprünge helfen?
Muß ich in Excel einen Verweis anmelden (geht nicht kommt Fehlermeldung).
So ein hartnäckiges Problem hatte ich schon lange nicht mehr, ist zum verzweifeln.


Vielen Dank im Voraus

Chemiker 31. Okt 2010 01:46

AW: Delphi DLL in Excel VBA einbinden
 
Hallo,

http://forum.delphi-treff.de/showthr...213#post214213

Bis bald Chemiker

Christian Seehase 31. Okt 2010 02:04

AW: Delphi DLL in Excel VBA einbinden
 
Moin Sly,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Bei mir funktioniert das problemlos.
Bist Du sicher, dass Du als Trennzeichen für die Zellangaben auch ein Semikolon angegeben hast?
Wenn nicht kommt die FM: #Wert!

BTW:
Für das Zuweisen des Rückgabewertes einer Funktion solltest Du Result verwenden und nicht den Namen der Funktion, da man Result auch auf der rechten Seite einer Zuweisung verwenden kann. Ich finde das auch lesbarer, und man hat keine Probleme eine Funktion umzubenennen.

Sly1 31. Okt 2010 05:06

AW: Delphi DLL in Excel VBA einbinden
 
Hallo Chemiker,

herzlichen Dank

das war des Rätsels Lösung.
Nun läuft auf meine Edit Distance mit Levensthein und Stringübergabe.

Grüße aus Südbayern von Sly1

Sly1 1. Nov 2010 20:38

AW: Delphi DLL in Excel VBA einbinden
 
Nochmals Hallo zusammen,

um hoffentlich noch mehr Geschwindigkeit aus der selbstgeschrieben VBA-Excelfunktion rauszuholen würde ich nun gerne statt nur auf eine Excelzelle, in der Delphi7 DDL, auf einen Bereich (Range) von Excel (2003) zugreifen. (Aber als Funktion die man einbinden kann. Ich finde einen ganzen Haufen im Netz zu OLE Automation, aber ich will ja keine weitere Instanz von Excel öffnen.)

Derzeit versuche ich es mit folgendem Testcode:
Delphi7:
Code:
function explore_range(const bereich : variant) : variant; stdcall;
begin
explore_range := 12.753;
end;

exports explore_range;
VBA:
Code:
Option Explicit
 Private Declare Function explore_range Lib "D:\Markt\LevenDLL" (ByRef bereich As Variant) As Variant

Function exp_range(aZelle1 As Range) As Variant
  exp_range = explore_range(aZelle1)
End Function
Nur wie greife ich auf den Inhalt des Bereiches von Excel zu der hoffentlich in der Variablen
bereich steht? bereich.????

Zweite Frage:
Ich kann zwar explore_range := 12.753 zurückgeben und es kommt auch in Excel an, aber wenn ich es mit einem String versuche kommt in Excel nur #Wert!

Bei explore_range := Pchar('hallo') meckert Delpi dass eine PAnsiStr nicht mit Variant kompatibel ist.

Mit freundliche Grüßen

Sly1

Sly1 1. Nov 2010 22:59

AW: Delphi DLL in Excel VBA einbinden
 
Hallo,

nun bin ich ein Stückchen weiter gekommen und habe festgestellt dass ich wohl doch über ComObj gehen muss.

Code:
function explore_range(const bereich : variant) : variant; stdcall;
begin
ExcelAPP := GetActiveOleObject('Excel.Application');
cell := ExcelAPP.Range['I1'];
Cellintf := IDispatch(cell); // cell as IDispatch;
explore_range := cell;
end;
Nun bleibt nur noch die Frage wie ich in Delphi an die Info des markierten Bereich von Excel komme z.B: L6:M10? vermutlich über eine Variant Variable, aber was finde ich dort denn dann vor?

Mit freundlichen Grüßen

Sylvester

toms 2. Nov 2010 06:49

AW: Delphi DLL in Excel VBA einbinden
 
Hallo, das sollte so funktionieren wie hier gezeigt wird:*http://www.delphipages.com/forum/sho...31&postcount=6

Christian Seehase 22. Aug 2016 08:59

AW: Delphi DLL in Excel VBA einbinden
 
Moin Zusammen,

da sich die Strukturen im Delphi-Treff-Forum etwas geändert haben, lautet der Link jetzt

http://forum.delphi-treff.de/index.php/Thread/29606


Allgemein:
http://forum.delphi-treff.de/showthread.php?<THREADID>
durch
http://forum.delphi-treff.de/index.php/Thread/<THREADID>
austauschen, wobei <THREADID> nur durch die Ziffern des
Links zu ersetzen sind.

Assarbad 7. Sep 2016 12:55

AW: Delphi DLL in Excel VBA einbinden
 
Zitat:

Zitat von Christian Seehase (Beitrag 1345383)

@Christian: Falls du einen Draht zum Delphi-Treff hast, kannste die ja mal wissen lassen, daß deren HTTP-Weiterleitung von http:// auf https:// fehlerhaft konfiguriert ist. Die von dir angegebene Adresse führt nämlich zu einem Servernamen forum.delphi-treff.deindex.php, bei der Umleitung auf das URL-Schema https://, was wohl ohne Frage falsch ist.

mkinzler 7. Sep 2016 13:16

AW: Delphi DLL in Excel VBA einbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Assarbad (Beitrag 1347055)
Zitat:

Zitat von Christian Seehase (Beitrag 1345383)

@Christian: Falls du einen Draht zum Delphi-Treff hast, kannste die ja mal wissen lassen, daß deren HTTP-Weiterleitung von http:// auf https:// fehlerhaft konfiguriert ist. Die von dir angegebene Adresse führt nämlich zu einem Servernamen forum.delphi-treff.deindex.php, bei der Umleitung auf das URL-Schema https://, was wohl ohne Frage falsch ist.

http://www.delphipraxis.net/members/13290-tbx.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 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