MS Access-VBA-Schleife über die Liste
Ich denke, das sollte einfach sein, aber ich kann nicht den richtigen Weg finden, es zu tun. Ich habe ein paar Beispiele der situation, die ich bin versucht zu lösen, also werde ich beschreiben. Ich denke, dass Sie wahrscheinlich behandelt werden können mit der gleichen Lösung, aber wenn nicht, lass es mich wissen. Ich versuche, eine Schleife durch eine Liste von Werten, und führen Sie eine SQL-Abfrage für jeden. In einer situation, die Werte sind text, und in anderen, sind Sie nicht aufeinander folgenden ganzen zahlen.
Bearbeitet, um hinzufügen: ich habe gesagt, dass die Liste der Werte ist dynamisch, es kommt aus der Liste von ID-Werten in einem Kombinationsfeld gewählten. Jetzt sind diese Wesen werden als durch Komma getrennte Liste in meine variable mit dem Namen item_in_my_text_list und item_in_my_ID_list unten.
Etwas wie dieses:
item_in_my_text_list = "User-defined, mean, upper-bound"
For Each item_in_my_text_list(i)
'run a query where i is part of the condition
'I want to run the same query first the user-defined metric, then for the mean, then for the upper-bound
'SQL should be "select metric, age, value into scenario where metric = 'user-defined'"
SQL= "Select metric, age, value into scenario WHERE metric = [i]
DoCmd.SetWarnings False
DoCmd.RunSQL SQL
DoCmd.SetWarnings True
SQL = ""
rs.MoveNext
Loop
Die andere situation betrifft eine nicht-sequenzielle numerische Liste von ID-Werten:
item_in_my_ID_list = "7, 9, 15, 88"
For Each item_in_my_ID_list(i)
'run a query where i is part of the condition
'I want to run the same query first for 7, then for 9, then 15, and so on
SQL= "Update thistable set x = y where ID = " & [i]
DoCmd.SetWarnings False
DoCmd.RunSQL SQL
DoCmd.SetWarnings True
SQL = ""
rs.MoveNext
Loop
Was ist die richtige syntax für den Aufbau der Schleife? Wenn ich versuche, Split, es scheint, wie es gibt mir die Anzahl der Elemente in der Liste, so dass, wenn ich versuche, verwenden Sie [i] als Teil der Abfrage-Bedingung, die ich bekomme, 1, 2, 3 (je nach Anzahl der Elemente in der Liste), sondern als "Benutzer-definiert" oder die richtige ID-Wert.
Bearbeitet, um hinzufügen meine Lösung. Der Vorschlag von @mehow gab mir was ich brauchte, um diese Arbeit zu machen.
Set db = CurrentDb
'Delete records for algorithms that aren't selected
Dim DeleteSQL As String
DeleteSQL = "Delete from Scenario WHERE ID not in (" & Me.ListSelect & ")"
db.Execute DeleteSQL, dbFailOnError
DeleteSQL = ""
'for each of the IDs selected, copy the whole scenario
Dim i As Long
For i = 0 To UBound(Split(Me.ListSelect, ","))
'find the records from the scenario table, and copy them for the "upper bound"
SQL = "insert into scenario (a, b, c)"
SQL = SQL & " SELECT a, b, c
SQL = SQL & " FROM Scenario "
SQL = SQL & " WHERE Scenario.Id= " & Trim(Split(Me.ListSelect, ",")(i))
db.Execute SQL, dbFailOnError
SQL = ""
'reset user-defined values for both mean and upper bound
Dim allMetrics As String
allMetrics = "Central tendency, Upper bounding"
Dim thisMetric As Long
For thisMetric = 0 To UBound(Split(allMetrics, ","))
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Parameter FROM AllParameters WHERE Id= " & Trim(Split(Me.ListSelect, ",")(i)))
Dim DefaultSQL As String
If Not (rs.EOF And rs.BOF) Then
Do Until rs.EOF = True
DefaultSQL = "UPDATE defaults LEFT JOIN scenario ON defaults.Age = Scenario.Age SET Scenario." & rs("Parameter") & " = [defaults].[Value] "
DefaultSQL = DefaultSQL & " WHERE defaults.ID =" & Trim(Split(Me.ListSelect, ",")(i))
DefaultSQL = DefaultSQL & " And defaults.metric = '" & Trim(Split(allMetrics, ",")(thisMetric)) & "'"
db.Execute DefaultSQL, dbFailOnError
DefaultSQL = ""
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
Next
Next
- Bitte verwenden Sie nicht SetWarnings und RunSQL finden Sie unter stackoverflow.com/questions/11213892/...
- danke für den link. Ich bin froh, dass der bessere Ansatz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass die unten ist die syntax, die Sie suchen können, um
For Each i In VBA.Split(item_in_my_ID_list, ",")
ist eine Möglichkeit.i
ist ein string-Typ.Müssen Sie möglicherweise verwenden
VBA.Trim(i)
gerecht zu werden Leerzeichen zwischen den Kommas.Die Sie benötigen, um ein array zu verwenden und dann die Schleife durch Sie.
str= Array("User-defined", "mean", "upper-bound")