AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Delphi DLL in Excel VBA einbinden

Offene Frage von "toms"
Ein Thema von Sly1 · begonnen am 31. Okt 2010 · letzter Beitrag vom 2. Nov 2010
Antwort Antwort
Sly1

Registriert seit: 31. Okt 2010
4 Beiträge
 
#1

Delphi DLL in Excel VBA einbinden

  Alt 31. Okt 2010, 01:28
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

Geändert von mkinzler (31. Okt 2010 um 19:57 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.678 Beiträge
 
Delphi XE6 Professional
 
#2

AW: Delphi DLL in Excel VBA einbinden

  Alt 31. Okt 2010, 02:46
Hallo,

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

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.218 Beiträge
 
Delphi 7 Professional
 
#3

AW: Delphi DLL in Excel VBA einbinden

  Alt 31. Okt 2010, 02:04
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Sly1

Registriert seit: 31. Okt 2010
4 Beiträge
 
#4

AW: Delphi DLL in Excel VBA einbinden

  Alt 31. Okt 2010, 06:06
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
  Mit Zitat antworten Zitat
Sly1

Registriert seit: 31. Okt 2010
4 Beiträge
 
#5

AW: Delphi DLL in Excel VBA einbinden

  Alt 1. Nov 2010, 21:38
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
  Mit Zitat antworten Zitat
Sly1

Registriert seit: 31. Okt 2010
4 Beiträge
 
#6

AW: Delphi DLL in Excel VBA einbinden

  Alt 1. Nov 2010, 23:59
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

AW: Delphi DLL in Excel VBA einbinden

  Alt 2. Nov 2010, 07:49
Hallo, das sollte so funktionieren wie hier gezeigt wird:*http://www.delphipages.com/forum/sho...31&postcount=6
Thomas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf