Hallo,
aus einer ListView lese ich mehrere Werte aus und speichere sie in einem Array.
Diesen Array übergebe ich an eine Funktion die einen String zusammenbaut.
Der String soll zum Schluss eine SQL Abfrage werden.
strKommission = " WHERE C.Kommission IN('" & arrKommission(1) & "'"
Wie schaffe ich es, auch wenn mehrere Werte in arrKommission sind, diese
dynamisch an den String strKommission anzufügen?
Es kann auch mal vorkommen, dass es 20 oder 30 Werte sind.
Wie der Code momentan ist, greife ich nur auf den ersten Array Wert zu und setze ihn in den String ein.
Viele Grüße
Jimmy
hallo
mit dem befehl join könnte es gehen
strKommission = " WHERE C.Kommission IN('" & join(arrKommission(), "';'" & "'"
Private Sub AAATest()
Dim strKommission As String
Dim arr() As String
Dim i As Integer
Dim j As Integer
ReDim arr(25)
For i = 65 To 90
arr(j) = Chr(i)
j = j + 1
Next i
strKommission = " WHERE C.Kommission IN " & SQLString_Array(arr)
MsgBox strKommission
End Sub
Public Function SQLString_Array(ByVal arrInput As Variant) As String
Dim i As Integer
Dim strSQL As String
For i = LBound(arrInput) To UBound(arrInput) - 1
strSQL = strSQL & "'" & arrInput(i) & "', "
Next i
SQLString_Array = "(" & Left(strSQL, Len(strSQL) - 2) & ")"
End Function
"aus einer ListView lese ich mehrere Werte aus und speichere sie in einem Array."
warum erstellst Du ein Array, wenn Du einen String brauchst, oder wird das Array noch wo anders eingesetzt?
Vielen Dank schonmal für das gewaltige Feedback.
;)
Ja den Array lese ich nur aus, weil ich diesen an einen String anfügen will.
Und das zwar dynamisch der Array hat immer eine unterschiedliche Größe.
Grüße Jimmy
Hallo nochmal,
eine Kleinigkeit hätte ich noch.
Ich habe desweiteren Listviews mit Checkboxen.
Er durchläuft nun diese und speichert alle angehackten in einem Array.
Die SQLString_Array Funktion gibt mir nun folgendes aus.
('...','...','...','','','','','','','')
Wie schaffe ich es, dass im String nur noch die Hochkomma stehen die ein Zeichen enthalten?
schöne Grüße
Jimmy
Du übergibst an die Funktion ein Array, das leere Einträge hat und solche, wo "..." drin steht.
Hier gehört bei Auslesen der Listviews noch ein Check auf ungültige Werte dazu. Nachdem die Größe eines Arrays fix ist und Du beim Initialisieren im Code noch nicht wissen kannst, wie viele Einträge er später haben wird, mußt Du ihn anschließend noch "zuschneiden".
Das geht so:
Dim arr() as string
Redim arr(100)
arr(0) = "A"
arr(1) = "B"
arr(2) = "C"
Redim preserve arr(3)
Das "PRESERVE" verändert die Größe und läßt gleichzeitig die Einträge stehen. Du mußt nur beim Durchlaufen der Listviews Dir in einer Variable merken, wo der letzte Eintrag steht bzw. wie lang das Array später wirklich sein soll und dann redim preserve machen. Beachte, daß der Array-Index immer bei 0 beginnt und redim immer die Anzahl der Inhalte hat. Sprich ein Array mit 10 Einträgen wird von 0 bis 9 durchlaufen, aber mit redim(10) abgekürzt.
Wobei...
Ein Array mit 3 Elementen mit dem Index 2 deklariert wird ::)
Redim preserve arr(2) kann 3 Elemente aufnehmen, 0, 1 und 2
Ausnahme:
Im Deklarationsteil wurde die Basis verändert, z.B. Option Base 1 um 1-Basierte Arrays zu haben.
Dann hat ein mit dem Index 2 deklarierte Arrays auch wirklich nur 2 Werte. 8)
Gruß Andreas
Zitat von: Hondo am Mai 28, 2015, 14:03:10
Redim preserve arr(2) kann 3 Elemente aufnehmen, 0, 1 und 2
Ja, stimmt. :-)
Ok hab das Thema abgeschlossen.
Vielen Dank.
Folgendermaßen sieht die Function nun aus.
Public Function ListArray(ByVal listView As listView) As Variant
Dim iCount As Integer
Dim items() As String
Dim anzahl
ReDim items(50)
anzahl = 0
With listView
For iCount = 1 To .ListItems.Count
If .ListItems(iCount).Checked Then
items(iCount) = .ListItems.Item(iCount).Text
anzahl = anzahl + 1
End If
Next iCount
End With
ReDim Preserve items(anzahl)
ListArray = items
End Function
Gruß
Jimmy
Das sieht schon sehr sauber aus.
Jetzt bin ich aber nicht ganz sicher, ob
For iCount = 1 To .ListItems.Count
nicht doch
For iCount = 0 To .ListItems.Count - 1
heissen muß?
Kannst Du ausprobieren, wenn er den ersten Listeneintrag nie bringt, müßtest Du bei 0 anfangen.
Ich meine, da kriegst Du Lücken, wenn Du mit items(iCount) statt items(anzahl) in das Array schreibst.
With listView
For iCount = 0 To .ListItems.Count -1
If .ListItems(iCount).Checked Then
items(anzahl) = .ListItems.Item(iCount).Text
anzahl = anzahl + 1
End If
Next iCount
End With
Und schau das Array nach dem redim preserve im Debugging Überwachungsmodus an, ob die letzte Zeile leer ist, wegen dem letztem inkrementieren von anzahl.
Mit der Initialgröße von 50 beim Array würde bei einer Liste mit mehr als angekreuzten 50 Einträgen ein Laufzeitfehler kommen.
Hallo,
ja muss definitiv For iCount = 0 To .ListItems.Count -1 heißen,
weil sonst lbound(items) auf ein Element zeigt das nicht vorhanden ist bzw. mit vbNullString als Inhalt.
Weist du definitiv ob es nicht mehr als 50 Listeneinträge gibt?
Es sollte wohl so aussehen:
anzahl = 0
With listView
Redim items(.ListItems.Count-1)
For iCount = 0 To .ListItems.Count-1
Andreas