MS Access VBA boucle par le biais de la liste
Je pense que cela devrait être simple, mais je ne peux pas trouver la bonne façon de le faire. J'ai quelques exemples de la situation, je suis en train de résoudre, donc je vais décrire à la fois. Je pense qu'ils peuvent être traités avec la même solution, mais si non, laissez-moi savoir. Je suis en train de faire une boucle par une liste de valeurs, et d'exécuter une requête SQL pour chacun. Dans une situation donnée, les valeurs sont de type texte, et dans l'autre, ils sont non-séquentielle des entiers.
Édité à ajouter: j'aurais dit que la liste de valeurs est dynamique, il est à venir à partir de la liste de valeurs d'ID sélectionné dans une liste déroulante. Maintenant, ceux-ci sont stockés comme une liste délimitée par des virgules dans ma variable nommée item_in_my_text_list et item_in_my_ID_list ci-dessous.
Quelque chose comme ceci:
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
L'autre situation implique un non-numérique séquentiel liste de valeurs d'ID:
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
Quelle est la bonne syntaxe pour la mise en place de la boucle? Lorsque j'essaie d'utiliser Split, il me semble qu'il me donne le nombre d'éléments dans la liste, donc, lorsque j'essaie d'utiliser [i] dans le cadre de la condition de requête, j'obtiens, 1, 2, 3 (en fonction du nombre d'éléments dans la liste), plutôt que d'être "défini par l'utilisateur" ou la bonne valeur de l'ID.
Édité pour ajouter ma solution. La suggestion de @mehow m'a donné ce dont j'avais besoin pour faire ce travail.
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
- S'il vous plaît ne pas utiliser Avertissements et RunSQL, voir stackoverflow.com/questions/11213892/...
- merci pour le lien. Je suis content d'avoir une meilleure approche.
Vous devez vous connecter pour publier un commentaire.
Je pense que le dessous est la syntaxe que vous cherchez peut-être pour
For Each i In VBA.Split(item_in_my_ID_list, ",")
en est une.i
est un type de chaîne.Vous pourriez avoir à utiliser
VBA.Trim(i)
pour répondre à des espaces entre les virgules.Vous avez besoin d'utiliser un tableau et ensuite une boucle à travers elle.
str= Array("User-defined", "mean", "upper-bound")