Einzelnen Beitrag anzeigen

Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#8

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 27. Apr 2019, 19:36
Hallo zusammen,

zunächst danke für die Diskussion und die wertvollen Beiträge!
Meine Frage wurde allerdings ganz schön mißverstanden: Ich dachte, die drei Demo-Dateien würden mein Ansinnen erklären. Aber ich sehe im Nachhinein, ich hätte mich klarer ausdrücken sollen.

Na ja zu testen ist da nix..
Wäre vielleicht sinnvoll wenn du auch den VBA Quelltext hochladen würdest.
Danach könnte ich mir das mal anschauen.
Es war doch alles dabei... Aber danke für Deine tolle Lösung!

Ich erstelle technische-wissenschaftliche Berechnungen in Delphi, die ich als Funktion über eine DLL in Excel einbinde. Meine „Programme“ sind daher keine eigenständigen Programme mit eigener Oberfläche, sondern laufen als „Bestandteil“ von Excel. Der Benutzer gibt seine Eingangsdaten in Excel ein, schickt die Funktion ab, und die Ergebnisse der Berechnungen erscheinen in der von ihm gewählten Platz in der Excel-Tabelle.

Das funktioniert mit Zahlenwerten seit langem sehr gut. Ab und zu müsste ich neben den berechneten Zahlenkolonnen (in Excel: „Matrix“ genannt) auch mal Texte mit ausgeben: z. B. Variablen-Bezeichnungen, oder die Ergebnisse oder Zwischenwerte mit einer hohen Genauigkeit (z.B. 100 Ziffern) als Text. Und dazu übertrage ich diese Texte von der DLL an Excel VBA und leite sie von dort in die Tabelle.

Meine oben vorgestellte Lösung funktioniert recht gut, allerdings kann ich ausschließlich AnsiStrings transferieren, obwohl Excels BSTR-Strings eigentlich WideStrings sind, wie auch Peter Below richtig festgestellt hat. Warum andere String-Typen nicht funktionieren, konnte ich bisher nicht herausfinden. Aber ich muss nicht alles verstehen…

Ich wollte lediglich die Schleife

Zitat:

For i = 1 To Anzahl
Vektor(i, 1) = NULStr
AnsiString_To_Excel Vektor(i, 1), i - 1 ' !!! -1: Delphi: NULL-basiert!
Next
in Delphi übertragen, um den Aufruf der DLL-Procedure „AnsiString_To_Excel“ nur ein einziges Mal machen zu müssen.

Aber inzwischen habe ich nach weiteren Tests eingesehen, daß mein Ansatz eine Schnapsidee war, und daß es en bloc am ganzen Vektor nicht geht, weil meine Routine nur die von Excel bereitgestellte Kopie des Strings patcht, und das Original String-Array ganz woanders im Speicher liegt, wo ich die Strings auch nicht mit Pointer-Akrobatik verändern kann.

Noch einmal danke für Eure Hilfe!

Gruß

Andreas
  Mit Zitat antworten Zitat