AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AnsiStringArray aus DLL an Excel-VBA

Ein Thema von Andreas13 · begonnen am 25. Apr 2019 · letzter Beitrag vom 10. Mai 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 26. Apr 2019, 13:02
Hallo,
muss bei Split nicht ';' rein?
Jo habe es getippt.. Schreibfehler aber das Sample funktioniert schon richtig.
Musst halt nur mal laden

Kommt halt drauf an was ich übergebe
PAnsiChar_To_Excel ohne Delimiter dann ";" ansonsten halt das was übergeben wird.

Habe es korrigiert.

bsp:
Code:
LngP = PAnsiChar_To_Excel(124) '"|"
Zitat:
aber ich glaube, dein Ansatz ist falsch
Also meiner bestimmt nicht.

gruss

Geändert von EWeiss (26. Apr 2019 um 13:29 Uhr)
  Mit Zitat antworten Zitat
Andreas13

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

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
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 28. Apr 2019, 06:15
Zitat:
Es war doch alles dabei... Aber danke für Deine tolle Lösung!
Ja die Daten für Exel VBA nicht für VB

Na egal läuft unter VB und sollte es auch unter VBA tun.
Zitat:
Q. What is Visual Basic for Applications?

A. Microsoft Visual Basic for Applications (VBA) is an embeddable programming environment designed to enable developers to build custom solutions using the full power of Microsoft Visual Basic.
Developers using applications that host VBA can automate and extend the application functionality, shortening the development cycle of custom business solutions.
Sollte also funktionieren.
Zitat:
obwohl Excels BSTR-Strings eigentlich WideStrings sind, wie auch Peter Below richtig festgestellt hat.
Ich mache ja letztendlich nichts anderes nur über einen kleinen Umweg..
Code:
StrConv(bStr, vbUnicode)
kommt den WideString am nächsten.
Zitat:
wo ich die Strings auch nicht mit Pointer-Akrobatik verändern kann.
Byte, Long, string sollte auch "Exel VBA" verstehen.

gruss

Geändert von EWeiss (28. Apr 2019 um 06:28 Uhr)
  Mit Zitat antworten Zitat
Andreas13

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

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 29. Apr 2019, 12:37
@EWeiss

Hallo,

danke für Deine Hinweise. Ich habe versucht Deinen VBA-Code in Excel's VBA umzusetzen, bin allerdings gescheitert...
Ich bin halt kein VBA-Programmierer. Meine rudimentären VBA-Kenntnisse dienen nur dazu, die VBA-Schnittstelle zwischen Excel und Delphi zu realisieren. Mit Deinem objektorientierten VBA-Ansatz kenne ich mich leider nicht aus.
Könntest Du bitte den Code in der beiliegenden Datei ToExcel_Test_1.xlsm bei Gelegenheit evtl. so anpassen, daß es "dort" in Excel läuft?

Vielen Dank!

Gruß aus Nürnberg
Andreas
Angehängte Dateien
Dateityp: zip ToExcel_Test_1.zip (17,4 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 29. Apr 2019, 16:27
Zitat:
Könntest Du bitte den Code in der beiliegenden Datei ToExcel_Test_1.xlsm bei Gelegenheit evtl. so anpassen, daß es "dort" in Excel läuft?
Würde dir da gerne helfen habe aber kein VBA Exel. (Office) installiert.

gruss

Geändert von EWeiss (29. Apr 2019 um 19:37 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 29. Apr 2019, 18:54
Was ich dir aber sagen kann das mein Modul so unter Excel 64Bit nicht läuft. (Keine Ahnung was du installiert hast)
Es fehlt PtrSafe in allen Declarationen.
Dann muss die DLL von Delphi auch in 64Bit vorliegen.
Zur Kompatibilität der Daten Typen

Code:
Option Explicit

Private Declare PtrSafe Function PAnsiChar_To_Excel Lib "Delphi_String_for_Excel_Test.dll" ( _
    Optional ByVal Delimiter As Byte = 59 _
) As LongPtr

Private Declare PtrSafe Function lstrlen Lib "kernel32" Alias "lstrlenA" ( _
    ByVal lpString As Long _
) As LongPtr

Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal length As LongPtr_
)
So sollte es aussehen.
Eventuell kommst du ja jetzt weiter.

Für die ListBox\ListenFeld könntest du dir ja ein Array erstellen ( bzw. haben wir schon alist() ) und das anstelle dessen verwenden wenn du keine UserForm verwenden möchtest.
Oder du schickst die werte von alist() direkt in deine Excel Tabelle.

https://analysistabs.com/vba-code/ex...rform/listbox/
https://www.guru99.com/creating-your...-in-excel.html

PS:
Anstelle des Button kannst du dir in Excel ein Macro erstellen was auf die cmdGet_Click() verweist und den Code dort ausführen.

gruss

Geändert von EWeiss (30. Apr 2019 um 18:26 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 30. Apr 2019, 00:09
Habe mal Excel 32Bit installiert aber keine Ahnung ob es das ist was du willst..
Ich werde da nicht so recht schlau draus.

Klick auf Button GetIt füllt die Cells in Excel
Klick auf Button CleanUp löscht die Einträge.

Ohne Form und ausgeführt in Excel!

Code:
Option Explicit

'                                              Pfad aktualisieren:
Private Declare Function PAnsiChar_To_Excel Lib "D:\Test\Delphi_String_for_Excel_Test" ( _
    Optional ByVal Delimiter As Byte = 59 _
) As Long

Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" ( _
    ByVal lpString As Long _
) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal length As Long _
)

Private Function VBStrFromAnsiPtr(ByVal lpStr As Long) As String

Dim bStr() As Byte
Dim cChars As Long

    On Error Resume Next
        ' Get the number of characters in the buffer
        cChars = lstrlen(lpStr)
        If cChars Then
            ' Resize the byte array
            ReDim bStr(0 To cChars - 1) As Byte
            ' Grab the ANSI buffer
            Call CopyMemory(bStr(0), ByVal lpStr, cChars)
        End If
        ' Now convert to a VB Unicode string
        VBStrFromAnsiPtr = StrConv(bStr, vbUnicode)

End Function

Private Sub CleanUp()

    Range("B1:B4").Delete XlDeleteShiftDirection.xlShiftUp

End Sub

Private Sub GetIt()

Dim flist    As String
Dim LngP     As Long
Dim alist()  As String
Dim Delimiter As Byte
Dim arTesting As Variant

    Delimiter = 124

    LngP = PAnsiChar_To_Excel(Delimiter) ' >>> "|"

    flist = VBStrFromAnsiPtr(LngP)
    alist = Split(flist, "|")

    If flist > "" Then
        arTesting = Application.WorksheetFunction.Transpose(alist)
        Range("B1:B4").Value = arTesting
    End If

End Sub
Wie du das nun schlussendlich regelst über Button oder sonst wie entscheide es selbst..
Aber der Wunsch die Strings in einem Schub nach Excel zu transponieren sollte dem entsprechen.
Delphi > VBA > Excel

Ich hoffe du kommst mit dem Rest selber klar.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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