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 30. Apr 2019, 15:33
Zitat:
Ich habe sie so abgewandelt
Wie ich schon sagte es bleibt dir überlassen wie du das später auslegen willst.

Aber gut wenn es jetzt funktioniert.
Mein Lösungsansatz war nur als Denkanstoß gedacht.

Zitat:
' Hat denn VBA keine Funktion wie Pascal's Min?? --> Bis := Min(a_Anz, Anzahl)
Min ist eine Excel Funktion oder?
Code:
WorksheetFunction.Min(20, 501, 561, 45, 78)
Wenn du das nicht willst dann mache dir selber was wenn du denkst es ist von nöten.
LBound = MIN
UBound = MAX

Code:
Private Function Min(ParamArray values() As Variant) As Variant
Dim i As Integer
Dim min_value As Variant

    min_value = values(LBound(values))
    For i = LBound(values) + 1 To UBound(values)
        If min_value > values(i) Then min_value = values(i)
    Next

    Min = min_value
End Function

Private Function Max(ParamArray values() As Variant) As Variant
Dim i As Integer
Dim max_value As Variant

    max_value = values(LBound(values))
    For i = LBound(values) + 1 To UBound(values)
        If max_value < values(i) Then max_value = values(i)
    Next

    Max = max_value
End Function

' Teste Min, Max
Private Sub cmdGo_Click()
    txtMin.Text = Format$(Min( _
        CInt("2873"), _
        CInt("4398"), _
        CInt("7846"), _
        CInt("1876"), _
        CInt("4792"), _
        CInt("3982"), _
        CInt("4863"), _
        CInt("9382")))
   
    txtMax.Text = Format$(Max( _
        CInt("2873"), _
        CInt("4398"), _
        CInt("7846"), _
        CInt("1876"), _
        CInt("4792"), _
        CInt("3982"), _
        CInt("4863"), _
        CInt("9382")))
End Sub
Code:
Const Delimiter = 124
Etwas unsauber weil du hier Delimiter ohne Angabe als Variant definierst.. ist aber Byte!
Wenn dann so!
Code:
Const Delimiter As Byte = 124
Siehe die Definition von PAnsiChar_To_Excel(bla bla.. Delimiter As Byte
Code:
Dim i As Long
Dim n_Anz As Long
Dim Bis As Long
zu
Code:
Dim i As Integer
Dim n_Anz As Integer
Dim Bis As Integer
Ein 32Bit DatenTyp ist für einfache for.. Next schleifen nicht nötig.
Zitat:
Die beiden Lösungen sind zum Ausprobieren im beiliegenden Excel-File ToExcel_Test_2.xlsm vorhanden
Habe Office wieder deinstalliert da ich es eigentlich nicht brauche und es nur eine Test Version war.

PS:
VBA ist kein Delphi daher wäre es besser du verwendest die Format Funktion des Forum
Code:
Dim x As Integer
Dim i As Integer
nicht
Delphi-Quellcode:
var
  x:Integer;
  i:Integer;
dann liest es sich besser.

gruss

Geändert von EWeiss ( 9. Jul 2019 um 09:32 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 30. Apr 2019, 17:08
Danke, die Format-Funktion für den sonstigen Code habe ich erst jetzt gefunden...

Gruß, Andreas
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 10. Mai 2019, 12:40
Sorry das ich das nochmal vor krame..
Habe das vorhin nochmal gelesen und festgestellt das deine abfrage auf
Code:
  If flist > "" Then
viele zu spät kommt..

Was machst du wenn
Code:
If flist = ""
ist?

Dann wird das Array alist() nicht initialisiert und die nächste Abfrage lässt deine Anwendung abstürzen.
Code:
alist = Split(flist, "|")
n_Anz = UBound(alist) - LBound(alist) + 1
mache es direkt nach der Initialisierung von flist.

Code:
Public Function GetDelphiStringVektor(Anzahl As Long) As Variant

 Dim flist As String
 Dim LngP As Long
 Dim alist() As String

 Const Delimiter As Byte = 124

 Dim StrVektor() As String
 Dim i As Long
 Dim n_Anz As Long
 Dim Bis As Long

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

    flist = VBStrFromAnsiPtr(LngP)
    If flist > "" Then
        alist = Split(flist, "|")

        n_Anz = UBound(alist) - LBound(alist) + 1

        Bis = Anzahl
        If n_Anz < Anzahl Then Bis = n_Anz

        ReDim StrVektor(n_Anz, 0 To 0) ' SpaltenVektor
 
        For i = LBound(alist) To Bis - 1
            StrVektor(i, 0) = alist(i)
        Next

        GetDelphiStringVektor = StrVektor
    else
        GetDelphiStringVektor = ""
    End If

End Function
gruss
  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 10. Mai 2019, 17:12
@EWeiss

Hab herzlichen Dank für die Verbesserungen!
Gruß
Andreas
  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 05:44 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 by Thomas Breitkreuz