Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA : ma boucle For...Next s'exécute trop vite ?!!

7 réponses
Avatar
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 :)

7 réponses

Avatar
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)
reqSQL = "INSERT INTO MaTable VALUES (" & 1 & "," _
& CInt(tab1(0, i)) & "," _
& CInt(tab1(1, i)) & ",""" _
& Now & """,""" _
& "1" & """,""" _
& "Auteur" & """)"

CurrentDb.Execute (reqSQL)
for j = 1 to 1000

next j
Next i
******************************************

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
:)


Avatar
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...


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
MB
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
Avatar
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





Avatar
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







Avatar
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












Avatar
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 :)