VBA : ma boucle For...Next s'exécute trop vite ?!!
7 réponses
Tonio
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une
table à partir des valeurs d'un tableau.
Une boucle For...Next parcourt tout le tableau et, à chaque itération,
exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2)
reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _
& CInt(tab1(0, i)) & "," _
& CInt(tab1(1, i)) & ",""" _
& Now & """,""" _
& "1" & """,""" _
& "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général
30 lignes.
MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO
dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque
itération de la boucle, cela fonctionne !
Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le
temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Brubru
Bonjour, tu peux mettre une autre boucle à l'intérieur de la première pour le faire compter en attendant ce qui donnerait : ************************************ For i = LBound(tab1, 2) To UBound(tab1, 2)
j'ai fait compter j jusqu'à 1000 au pif (enfin au sentiment) voir à ajuster.... -- BruBru "Tonio" a écrit dans le message de news:
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une table à partir des valeurs d'un tableau. Une boucle For...Next parcourt tout le tableau et, à chaque itération, exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2) reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _ & CInt(tab1(0, i)) & "," _ & CInt(tab1(1, i)) & ",""" _ & Now & """,""" _ & "1" & """,""" _ & "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général
30 lignes. MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque
itération de la boucle, cela fonctionne ! Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le
temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)
Bonjour,
tu peux mettre une autre boucle à l'intérieur de la première pour le faire
compter en attendant ce qui donnerait :
************************************
For i = LBound(tab1, 2) To UBound(tab1, 2)
j'ai fait compter j jusqu'à 1000 au pif (enfin au sentiment) voir à
ajuster....
--
BruBru
"Tonio" <Tonio@discussions.microsoft.com> a écrit dans le message de
news:FE6B5684-CCBE-4A73-BF84-76C8A66A4D93@microsoft.com...
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une
table à partir des valeurs d'un tableau.
Une boucle For...Next parcourt tout le tableau et, à chaque itération,
exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2)
reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _
& CInt(tab1(0, i)) & "," _
& CInt(tab1(1, i)) & ",""" _
& Now & """,""" _
& "1" & """,""" _
& "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en
général
30 lignes.
MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO
dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de
chaque
itération de la boucle, cela fonctionne !
Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas
le
temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème
:)
Bonjour, tu peux mettre une autre boucle à l'intérieur de la première pour le faire compter en attendant ce qui donnerait : ************************************ For i = LBound(tab1, 2) To UBound(tab1, 2)
j'ai fait compter j jusqu'à 1000 au pif (enfin au sentiment) voir à ajuster.... -- BruBru "Tonio" a écrit dans le message de news:
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une table à partir des valeurs d'un tableau. Une boucle For...Next parcourt tout le tableau et, à chaque itération, exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2) reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _ & CInt(tab1(0, i)) & "," _ & CInt(tab1(1, i)) & ",""" _ & Now & """,""" _ & "1" & """,""" _ & "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général
30 lignes. MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque
itération de la boucle, cela fonctionne ! Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le
temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)
3stone
Salut,
"Brubru" | tu peux mettre une autre boucle à l'intérieur de la première pour le faire | compter en attendant ce qui donnerait : [...] | > CurrentDb.Execute (reqSQL) | for j = 1 to 1000 | next j | > Next i
Quelle horreur ;-)
A la rigeur, un DoEvents...
Tonio: Pour ce genre de manoeuvre, tu as tout intérêt à ouvrir un recordset et à ajouter les "lignes" par un .add et un .update au lieu d'une série de CurrentDB.execute...
"Brubru"
| tu peux mettre une autre boucle à l'intérieur de la première pour le faire
| compter en attendant ce qui donnerait :
[...]
| > CurrentDb.Execute (reqSQL)
| for j = 1 to 1000
| next j
| > Next i
Quelle horreur ;-)
A la rigeur, un DoEvents...
Tonio:
Pour ce genre de manoeuvre, tu as tout intérêt à ouvrir un recordset
et à ajouter les "lignes" par un .add et un .update
au lieu d'une série de CurrentDB.execute...
"Brubru" | tu peux mettre une autre boucle à l'intérieur de la première pour le faire | compter en attendant ce qui donnerait : [...] | > CurrentDb.Execute (reqSQL) | for j = 1 to 1000 | next j | > Next i
Quelle horreur ;-)
A la rigeur, un DoEvents...
Tonio: Pour ce genre de manoeuvre, tu as tout intérêt à ouvrir un recordset et à ajouter les "lignes" par un .add et un .update au lieu d'une série de CurrentDB.execute...
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Tonio
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant
MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset
Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table
For i = LBound(tableau, 2) To UBound(tableau, 2)
With rst
.AddNew
!var1 = 1
!var2 = tableau(0, i)
!var3 = tableau(1, i)
!var4 = Now
!var5 = "1"
!var6 = "Auteur"
.Update
End With
Next i
' Fermeture du recordset
rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds
As Long)
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Pierre CFI [mvp]
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
-- Pierre CFI MVP Microsoft Access Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer Access http://users.skynet.be/mpfa/ Excel http://www.excelabo.net
"Tonio" a écrit dans le message de news:
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
"Tonio" <Tonio@discussions.microsoft.com> a écrit dans le message de news: AAF9D953-1C4E-4799-9B66-98B177D22ACA@microsoft.com...
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant
MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset
Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table
For i = LBound(tableau, 2) To UBound(tableau, 2)
With rst
.AddNew
!var1 = 1
!var2 = tableau(0, i)
!var3 = tableau(1, i)
!var4 = Now
!var5 = "1"
!var6 = "Auteur"
.Update
End With
Next i
' Fermeture du recordset
rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds
As Long)
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
-- Pierre CFI MVP Microsoft Access Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer Access http://users.skynet.be/mpfa/ Excel http://www.excelabo.net
"Tonio" a écrit dans le message de news:
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Tonio
Oups, effectivement, je n'avais pas lu jusqu'au bout, je pensais que le texte au-dessous de "Tonio:" était le quote d'un de mes messages précédents. ^_^
Merci 3stone !
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
-- Pierre CFI MVP Microsoft Access Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer Access http://users.skynet.be/mpfa/ Excel http://www.excelabo.net
"Tonio" a écrit dans le message de news:
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Oups, effectivement, je n'avais pas lu jusqu'au bout, je pensais que le texte
au-dessous de "Tonio:" était le quote d'un de mes messages précédents. ^_^
Merci 3stone !
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
"Tonio" <Tonio@discussions.microsoft.com> a écrit dans le message de news: AAF9D953-1C4E-4799-9B66-98B177D22ACA@microsoft.com...
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant
MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset
Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table
For i = LBound(tableau, 2) To UBound(tableau, 2)
With rst
.AddNew
!var1 = 1
!var2 = tableau(0, i)
!var3 = tableau(1, i)
!var4 = Now
!var5 = "1"
!var6 = "Auteur"
.Update
End With
Next i
' Fermeture du recordset
rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds
As Long)
Oups, effectivement, je n'avais pas lu jusqu'au bout, je pensais que le texte au-dessous de "Tonio:" était le quote d'un de mes messages précédents. ^_^
Merci 3stone !
oui, c'est ce que 3stone avait suggéré me semble-t-il :o)
-- Pierre CFI MVP Microsoft Access Mail : http://cerbermail.com/?z0SN8cN53B
Site pour bien commencer Access http://users.skynet.be/mpfa/ Excel http://www.excelabo.net
"Tonio" a écrit dans le message de news:
Merci pour vos réponses,
Mais j'ai résolu le problème plus 'proprement'. ;-)
Au lieu d'une instruction Execute, j'ai créé un recordset représentant MaTable, auquel j'ajoute des enregistrements :
Dim rst As DAO.Recordset
' Ouverture du Recordset Set rst = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
' Pour chaque ligne du tableau, création d'une ligne dans la table For i = LBound(tableau, 2) To UBound(tableau, 2) With rst .AddNew !var1 = 1 !var2 = tableau(0, i) !var3 = tableau(1, i) !var4 = Now !var5 = "1" !var6 = "Auteur" .Update End With Next i
' Fermeture du recordset rst.Close
Et ça marche parfaitement !
Merci encore pour votre rapidité.
Bonjour
Dans un module nommé 'général'
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dans ta fonction
sleep(1000) ' =pause d'une seconde
Cordialement
Michel BERTRAND
Buddy
Salut
ta première approche était correcte, il faudrait essayer ceci
Dim vMin As Long, vMax As Long, i As Long, vSQL As String
vMin = LBound(tab1, 2) vMax = UBound(tab1, 2)
For i = vMin To vMax Step 1 vSQL = "INSERT INTO MaTable (Champ1, Champ2, ... , ChampN) " & _ " VALUES (1, " & CInt(tab1(0, i)) & ", " & CInt(tab1(1, i)) & _ ", " & Now() & ", 1, 'Auteur');" DoCmd.RunSQL vSQL Next i
Je te conseillerais de ne renseigner que les champs qui seront effectivement mis à jour, ne mentionne pas ceux pour lesquels aucune valeur ne sera insérée.
Ouala Bye Buddy
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une table à partir des valeurs d'un tableau. Une boucle For...Next parcourt tout le tableau et, à chaque itération, exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2) reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _ & CInt(tab1(0, i)) & "," _ & CInt(tab1(1, i)) & ",""" _ & Now & """,""" _ & "1" & """,""" _ & "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général 30 lignes. MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque itération de la boucle, cela fonctionne ! Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)
Salut
ta première approche était correcte, il faudrait essayer ceci
Dim vMin As Long, vMax As Long, i As Long, vSQL As String
vMin = LBound(tab1, 2)
vMax = UBound(tab1, 2)
For i = vMin To vMax Step 1
vSQL = "INSERT INTO MaTable (Champ1, Champ2, ... , ChampN) " & _
" VALUES (1, " & CInt(tab1(0, i)) & ", " & CInt(tab1(1, i)) & _
", " & Now() & ", 1, 'Auteur');"
DoCmd.RunSQL vSQL
Next i
Je te conseillerais de ne renseigner que les champs qui seront
effectivement mis à jour, ne mentionne pas ceux pour lesquels aucune
valeur ne sera insérée.
Ouala
Bye
Buddy
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une
table à partir des valeurs d'un tableau.
Une boucle For...Next parcourt tout le tableau et, à chaque itération,
exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2)
reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _
& CInt(tab1(0, i)) & "," _
& CInt(tab1(1, i)) & ",""" _
& Now & """,""" _
& "1" & """,""" _
& "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général
30 lignes.
MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO
dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque
itération de la boucle, cela fonctionne !
Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le
temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)
ta première approche était correcte, il faudrait essayer ceci
Dim vMin As Long, vMax As Long, i As Long, vSQL As String
vMin = LBound(tab1, 2) vMax = UBound(tab1, 2)
For i = vMin To vMax Step 1 vSQL = "INSERT INTO MaTable (Champ1, Champ2, ... , ChampN) " & _ " VALUES (1, " & CInt(tab1(0, i)) & ", " & CInt(tab1(1, i)) & _ ", " & Now() & ", 1, 'Auteur');" DoCmd.RunSQL vSQL Next i
Je te conseillerais de ne renseigner que les champs qui seront effectivement mis à jour, ne mentionne pas ceux pour lesquels aucune valeur ne sera insérée.
Ouala Bye Buddy
Bonjour, j'utilise Access 2003 et j'ai un problème concernant VBA.
J'ai écrit un programme qui permet d'insérer des enregistrements dans une table à partir des valeurs d'un tableau. Une boucle For...Next parcourt tout le tableau et, à chaque itération, exécute une instruction INSERT INTO sur la table à alimenter.
Mon code est le suivant :
For i = LBound(tab1, 2) To UBound(tab1, 2) reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _ & CInt(tab1(0, i)) & "," _ & CInt(tab1(1, i)) & ",""" _ & Now & """,""" _ & "1" & """,""" _ & "Auteur" & """)"
CurrentDb.Execute (reqSQL)
Next i
tab1 est le tableau en question et il a 2 dimensions. Il contient en général 30 lignes. MaTable est la table à alimenter.
Dans le meilleurs des mondes, le programme devrait exécuter 30 INSERT INTO dans MaTable.
Mais en réalité, il ne m'insère que 1 ou 2 enregistrements.
Le pire, c'est que si je laisse un peu de temps entre l'exécution de chaque itération de la boucle, cela fonctionne ! Il semblerait que le code se déroule un peu trop vite et qu'il n'ait "pas le temps" de mettre à jour la table.
Qui peut m'aider ?
Merci à tous ceux qui auront la gentillesse de se pencher sur mon problème :)