![]() |
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 |
AW: Delphi DLL in Excel VBA einbinden
|
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. |
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 |
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:
VBA:
function explore_range(const bereich : variant) : variant; stdcall;
begin explore_range := 12.753; end; exports explore_range;
Code:
Nur wie greife ich auf den Inhalt des Bereiches von Excel zu der hoffentlich in der Variablen
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 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 |
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:
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?
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; Mit freundlichen Grüßen Sylvester |
AW: Delphi DLL in Excel VBA einbinden
Hallo, das sollte so funktionieren wie hier gezeigt wird:*
![]() |
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 ![]() 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. |
AW: Delphi DLL in Excel VBA einbinden
Zitat:
![]() |
AW: Delphi DLL in Excel VBA einbinden
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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