[VBA-Access] Problème dans une boucle for
Fermé
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
-
28 août 2008 à 08:53
LiMpi Messages postés 32 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 29 août 2008 - 28 août 2008 à 15:21
LiMpi Messages postés 32 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 29 août 2008 - 28 août 2008 à 15:21
A voir également:
- [VBA-Access] Problème dans une boucle for
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Instagram for pc - Télécharger - Divers Communication
- Idm for mac - Télécharger - Téléchargement & Transfert
- Whatsapp for pc - Télécharger - Messagerie
- Vba attendre 1 seconde ✓ - Forum VB / VBA
18 réponses
hellomoto1
Messages postés
440
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
25 mars 2013
85
28 août 2008 à 09:01
28 août 2008 à 09:01
salut, j sui pas sur,mais j pense qu'il vous demande de declarer vos variables avant de proceder a l'affectation,en tous cas vous avez un erreur de type qq part
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 09:17
28 août 2008 à 09:17
La variable est déclarée plus haut :
Dim rstTest As DAO.Recordset
N'est-ce pas bon ?
Dim rstTest As DAO.Recordset
N'est-ce pas bon ?
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 09:27
28 août 2008 à 09:27
Salut,
Ne peux tu pas faire une boucle while à la place..?
Tu fais :
While rstTest.EOF <> True
..............
..............
..............
rst.MoveNext
Wend
Ainsi tu parcours ton recordset, ligne après ligne.
@+
Ne peux tu pas faire une boucle while à la place..?
Tu fais :
While rstTest.EOF <> True
..............
..............
..............
rst.MoveNext
Wend
Ainsi tu parcours ton recordset, ligne après ligne.
@+
hellomoto1
Messages postés
440
Date d'inscription
mardi 12 août 2008
Statut
Membre
Dernière intervention
25 mars 2013
85
28 août 2008 à 09:32
28 août 2008 à 09:32
tu fais d progarammation en vb,non?
si je me souvien bien,tu n'aurais pas besoin d'utiliser des variables ,.juste fais la connexion avec votre base ,par la suite deplacé le table a traiter dans votre form(feuille) sous forme des grilles ......... et a la fin tu utilise des fonction predifinis pour la navigation dans votre base,............................................donc tout est definit ,pas besoin d variable pour parcourir les recordset
.............................. . ......................................
bnechance
si je me souvien bien,tu n'aurais pas besoin d'utiliser des variables ,.juste fais la connexion avec votre base ,par la suite deplacé le table a traiter dans votre form(feuille) sous forme des grilles ......... et a la fin tu utilise des fonction predifinis pour la navigation dans votre base,............................................donc tout est definit ,pas besoin d variable pour parcourir les recordset
.............................. . ......................................
bnechance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 10:25
28 août 2008 à 10:25
Salut BassHero816, HelloMoto1.
Dit moi BassHero, ta fonction parcourt-elle la tableau horizontalement ou verticalement ? Dans mon cas ce serait verticalement. Hors après la première occurence il ne trouve plus rien dans la boucle grace a ta méthode :/
Quand a HelloMoto, je ne passe pas par une feuille excel, si c'est ca que tu veux dire ... ?
en tout cas, merci :)
Dit moi BassHero, ta fonction parcourt-elle la tableau horizontalement ou verticalement ? Dans mon cas ce serait verticalement. Hors après la première occurence il ne trouve plus rien dans la boucle grace a ta méthode :/
Quand a HelloMoto, je ne passe pas par une feuille excel, si c'est ca que tu veux dire ... ?
en tout cas, merci :)
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 10:40
28 août 2008 à 10:40
Cette fonction parcourt le tableau verticalement, chaque ligne contient un enregistrement de chaque champ.
Personnellement, c'est ce que j'utilise à chaque fois.
Par contre, je suis incapable de te dire comment parcourir tous les enregistrements, champ par champ.
@+
Personnellement, c'est ce que j'utilise à chaque fois.
Par contre, je suis incapable de te dire comment parcourir tous les enregistrements, champ par champ.
@+
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 11:01
28 août 2008 à 11:01
La resultat de ma requête se présente sous cette forme :
http://img528.imageshack.us/img528/7757/exempleag9.jpg
:(
http://img528.imageshack.us/img528/7757/exempleag9.jpg
:(
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 11:10
28 août 2008 à 11:10
Oui, et bien dans ce cas ce que je t'ai donné va parcourir tes IIdAsset de 1 jusqu'à 40. Tu n'as plus qu'à marquer l'opération que tu souhaites effectuer sur chaque IIdAsset dans la boucle While, juste avant le rsTest.MoveNext, qui te permet de passer à l'IIdAsset suivant.
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 11:13
28 août 2008 à 11:13
C'est bien ce que j'ai fait, pourtant j'ai la runtime error 9 :/
(Et l'erreur se produit sur une requête d'insertion, ca n'a peut-être pas à voir avec la boucle en fait ... Mais je penses car j'avais eu la même erreur sur la boucle while que j'avais faite avant de passer au for )
Je te donnes le code, au cas où !
(Et l'erreur se produit sur une requête d'insertion, ca n'a peut-être pas à voir avec la boucle en fait ... Mais je penses car j'avais eu la même erreur sur la boucle while que j'avais faite avant de passer au for )
Je te donnes le code, au cas où !
While rstTest.EOF <> True ''' Pour chaque entrée existante strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & rstTest(0) & "" Set rstTest2 = dbTestForm.OpenRecordset(strSQL2) ''' On sélectionne les données qui nous intéressent If Not IsEmpty("rstTest2") Then ''' Si L'entrée n'est pas vide Tag = rstTest2(1) ''' Alors la variable tag prend la valeur se sAssetTag sous la forme Marque~Type~Modèle~Numéro de série.INI Test = Split("" & Tag & "", "~") ''' ou encore Marque~Type~Numéro de série.INI, Ensuite on sépare ces valeurs Limite = UBound(Test) ''' On compte le nombres de variable (3 ou 4) If Limite = 3 Then ''' Si il y en a 4 (0,1,2 et 3) SN = Split("" & Test(3) & "", ".") ''' On enlève le .INI après le numéro de série DoCmd.SetWarnings False '''On enlève les alertes access pour pas avoir "voulez vous ajouter une ligne dans la table tblPC" a chaque enregistrement (et avec 700 enregistrement c'est bien chiant ^^) strSQL4 = "Select sValue FROM tblSystem WHERE sItem = '_LoginIDRight' AND lIDAsset = " & rstTest(0) & "" Set rstTest4 = dbTestForm.OpenRecordset(strSQL4) strSQL5 = "Select sValue FROM tblSystem WHERE sItem = 'Full Name' AND lIDAsset = " & rstTest(0) & "" Set rstTest5 = dbTestForm.OpenRecordset(strSQL5) strSQL6 = "Select sValue FROM tblSystem WHERE sItem = '_ComputerName'AND lIDAsset = " & rstTest(0) & "" Set rstTest6 = dbTestForm.OpenRecordset(strSQL6) strSQL7 = "Select sValue FROM tblSystem WHERE sItem = 'IP Address' AND lIDAsset = " & rstTest(0) & "" Set rstTest7 = dbTestForm.OpenRecordset(strSQL7) strSQL8 = "Select sValue FROM tblSystem WHERE sItem = 'OS Name' AND lIDAsset = " & rstTest(0) & "" Set rstTest8 = dbTestForm.OpenRecordset(strSQL8) strSQL9 = "Select sValue FROM tblSystem WHERE sItem = 'OS Version' AND lIDAsset = " & rstTest(0) & "" Set rstTest9 = dbTestForm.OpenRecordset(strSQL9) strSQL10 = "Select sValue FROM tblSystem WHERE sItem = 'Service Pack' AND lIDAsset = " & rstTest(0) & "" Set rstTest10 = dbTestForm.OpenRecordset(strSQL10) strSQL11 = "Select sValue FROM tblSystem WHERE sItem = 'Total RAM' AND lIDAsset = " & rstTest(0) & "" Set rstTest11 = dbTestForm.OpenRecordset(strSQL11) ANTIPOSTROPHE = Split("" & rstTest11(0) & "", "'") DoCmd.RunSQL ("INSERT INTO tblPC(IDAsset, Shortname, Marque, Type, Modele, Serial_Number, Laptop_Desktop, Computer_Name, Full_Name, IP, Localisation, total_RAM, OS_Name, OS_Version, Service_Pack) VALUES('" & rstTest(0) & "', '" & rstTest2(2) & "', '" & Test(0) & "', '" & Test(1) & "', '" & Test(2) & "', '" & SN(0) & "', 'D', '" & rstTest6(0) & "', '" & rstTest5(0) & "', '" & rstTest7(0) & "', 'SRC', '" & ANTIPOSTROPHE(0) & ANTIPOSTROPHE(1) & "', '" & rstTest8(0) & "', '" & rstTest9(0) & "', '" & rstTest10(0) & "');") ''' Ensuite on insère toutes les données DoCmd.SetWarnings True ''' Et on réactive les alertes Access Final = Test(0) Final2 = Test(1) Final3 = Test(2) Final4 = Test(3) Debug.Print Final ''' On affiche ici les résultats, juste histoire d'être sur Debug.Print Final2 Debug.Print Final3 Debug.Print Final4 Else ''' Si il y en a 3 (0,1 et 2) SN = Split("" & Test(2) & "", ".") ''' On enlève encore le .INI (même principe hein) DoCmd.SetWarnings False strSQL3 = "INSERT INTO tblPC(IDAsset, Shortname, Marque, Type, Serial_Number) Values('" & rstTest2(0) & "', '" & rstTest2(2) & "', '" & Test(0) & "', '" & Test(1) & "', '" & SN(0) & "')" DoCmd.RunSQL strSQL3 '''On insère DoCmd.SetWarnings True Final = Test(0) '''On teste Final2 = Test(1) Final3 = Test(2) Debug.Print Final Debug.Print Final2 Debug.Print Final3 End If ''' Fin du If Limite = 3 pour vérifier le nombre de valeurs End If ''' Fin du If Not IsEmpty("rstTest2") Pour vérifier si il y avait qqc a faire rstTest.MoveNext Wend
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 11:18
28 août 2008 à 11:18
Normalement cette méthode fonctionne. Regarde si tu n'as pas fait une erreur sur une aurte requête (d'insertion).
Ou affiche moi un bout de ton code pour que je voies.
Ou affiche moi un bout de ton code pour que je voies.
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 11:19
28 août 2008 à 11:19
C'est fait au dessus, si tu veux le reste (y'a pas grand chose a part 2 requêtes SQL et les déclarations).
Par contre, tu m'excusera pour les noms de variables qui sont, je sais, pas claire du tout !
Je suis en train de modifier ca je te redonne le code modifié après
Par contre, tu m'excusera pour les noms de variables qui sont, je sais, pas claire du tout !
Je suis en train de modifier ca je te redonne le code modifié après
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 11:27
28 août 2008 à 11:27
Visiblement, il manque un ";" à la fin de ta requête d'insertion strSQL3, juste avant l'apostrophe. Je ne sais pas si c'est une erreur de copier-coller ou si c'est ce qui cause ton erreur. Dis moi...
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 11:41
28 août 2008 à 11:41
Si tu as du courage :)
Voilà tout le code !
J'ai modifié les noms des variables, pour que ce soit plus clair :
Ah aussi, ne tient pas compte du Else, il n'est pas à jour :p
J'ai indiqué la ligne d'erreur ...
J'ai rajouté le ; aussi !
Merci :)
Voilà tout le code !
J'ai modifié les noms des variables, pour que ce soit plus clair :
Ah aussi, ne tient pas compte du Else, il n'est pas à jour :p
Sub Instertion_split() Dim rstIDAsset As Recordset ''' Va récupérer les ID de tblAsset Dim rstDataAsset As Recordset ''' Va récupérer les données de tblAsset Dim rstRight As Recordset ''' Dim rstName As Recordset ''' R D Dim rstComputerName As Recordset ''' E D O Dim rstIP As Recordset ''' C E N Dim rstOSName As Recordset ''' U S N Dim rstOSVers As Recordset ''' P E Dim rstSP As Recordset ''' E Dim rstRAM As Recordset ''' S Dim dbTestForm As Database ''' nom de la db Dim strSQL_ID As String ''' Va récupérer les ID de tblAsset Dim strSQL_DataAsset As String ''' Va récupérer les données de tblAsset Dim strSQL_Insert As String ''' Va inclure les données dans tblPC Dim strSQL_Right As String ''' Va récupérer les droits dans tblSystem Dim strSQL_Name As String ''' Va récupérer les noms dans tblSystem Dim strSQL_ComputerName As String ''' Va récupérer les computername dans tblSystem Dim strSQL_IP As String ''' Va récupérer les IP Adress dans tblSystem Dim strSQL_OSName As String ''' Va récupérer les OS Name dans tblSystem Dim strSQL_OSVers As String ''' Va récupérer les OS Version dans tblSystem Dim strSQL_SP As String ''' Va récupérer les versions Service Pack dans tblSystem Dim strSQL_RAM As String ''' Va récupérer les rams total du pc dans tblSystem Dim SN As Variant ''' Récupère le numéro de série sans le .INI Dim Tag As String ''' Récupère le sAssetTag non splitté Dim Final As String ''' Réupère la Marque Dim Final2 As String ''' Récupère le Type ou le Modèle Dim Final3 As String ''' Récupère le Modèle ou le numéro de série Dim Final4 As String ''' Récupère le numéro de série Dim Limite As Integer ''' Sert à la condition pour savoir si il y a 3 ou 4 valeurs différentes après les split() ! Set dbTestForm = CurrentDb ''' Sélection de la base de donnée courante strSQL = "SELECT lIDAsset FROM tblAsset" ''' On sélectionne les ID de la table Set rstIDAsset = dbTestForm.OpenRecordset(strSQL) ''' On mets le résultats dans un recordset CurrentDb.Execute "DELETE * FROM tblPC;" ''' Ensuite, on supprime tout de la table actuelle While rstIDAsset.EOF <> True ''' Pour chaque entrée existante strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & rstIDAsset(0) & "" Set rstDataAsset = dbTestForm.OpenRecordset(strSQL2) ''' On sélectionne les données qui nous intéressent If Not IsEmpty("rstDataAsset") Then ''' Si L'entrée n'est pas vide Tag = rstDataAsset(1) ''' Alors la variable tag prend la valeur se sAssetTag sous la forme Marque~Type~Modèle~Numéro de série.INI Test = Split("" & Tag & "", "~") ''' ou encore Marque~Type~Numéro de série.INI, Ensuite on sépare ces valeurs Limite = UBound(Test) ''' On compte le nombres de variable (3 ou 4) If Limite = 3 Then ''' Si il y en a 4 (0,1,2 et 3) SN = Split("" & Test(3) & "", ".") ''' On enlève le .INI après le numéro de série DoCmd.SetWarnings False '''On enlève les alertes access pour pas avoir "voulez vous ajouter une ligne dans la table tblPC" a chaque enregistrement (et avec 700 enregistrement c'est bien chiant ^^) strSQL_Right = "Select sValue FROM tblSystem WHERE sItem = '_LoginIDRight' AND lIDAsset = " & rstIDAsset(0) & "" Set rstRight = dbTestForm.OpenRecordset(strSQL_Right) strSQL_Name = "Select sValue FROM tblSystem WHERE sItem = 'Full Name' AND lIDAsset = " & rstIDAsset(0) & "" Set rstName = dbTestForm.OpenRecordset(strSQL_Name) strSQL_ComputerName = "Select sValue FROM tblSystem WHERE sItem = '_ComputerName'AND lIDAsset = " & rstIDAsset(0) & "" Set rstComputerName = dbTestForm.OpenRecordset(strSQL_ComputerName) strSQL_IP = "Select sValue FROM tblSystem WHERE sItem = 'IP Address' AND lIDAsset = " & rstIDAsset(0) & "" Set rstIP = dbTestForm.OpenRecordset(strSQL_IP) strSQL_OSName = "Select sValue FROM tblSystem WHERE sItem = 'OS Name' AND lIDAsset = " & rstIDAsset(0) & "" Set rstOSName = dbTestForm.OpenRecordset(strSQL_OSName) strSQL_OSVers = "Select sValue FROM tblSystem WHERE sItem = 'OS Version' AND lIDAsset = " & rstIDAsset(0) & "" Set rstOSVers = dbTestForm.OpenRecordset(strSQL_OSVers) strSQL_SP = "Select sValue FROM tblSystem WHERE sItem = 'Service Pack' AND lIDAsset = " & rstIDAsset(0) & "" Set rstSP = dbTestForm.OpenRecordset(strSQL_SP) strSQL_RAM = "Select sValue FROM tblSystem WHERE sItem = 'Total RAM' AND lIDAsset = " & rstIDAsset(0) & "" Set rstRAM = dbTestForm.OpenRecordset(strSQL_RAM) ANTIPOSTROPHE = Split("" & rstRAM(0) & "", "'") /!\ ERREUR ICI /!\ DoCmd.RunSQL ("INSERT INTO tblPC(IDAsset, Shortname, Marque, Type, Modele, Serial_Number, Laptop_Desktop, Computer_Name, Full_Name, IP, Localisation, total_RAM, OS_Name, OS_Version, Service_Pack) VALUES('" & rstIDAsset(0) & "', '" & rstDataAsset(2) & "', '" & rstDataAsset(0) & "', '" & rstDataAsset(1) & "', '" & rstDataAsset(2) & "', '" & SN(0) & "', 'D', '" & rstComputerName(0) & "', '" & rstName(0) & "', '" & rstIP(0) & "', 'SRC', '" & ANTIPOSTROPHE(0) & ANTIPOSTROPHE(1) & "', '" & rstOSName(0) & "', '" & rstOSVers(0) & "', '" & rstSP(0) & "');") ''' Ensuite on insère toutes les données /!\ DoCmd.SetWarnings True ''' Et on réactive les alertes Access Final = Test(0) Final2 = Test(1) Final3 = Test(2) Final4 = Test(3) Debug.Print Final ''' On affiche ici les résultats, juste histoire d'être sur Debug.Print Final2 Debug.Print Final3 Debug.Print Final4 Else ''' Si il y en a 3 (0,1 et 2) SN = Split("" & Test(2) & "", ".") ''' On enlève encore le .INI (même principe hein) DoCmd.SetWarnings False strSQL3 = "INSERT INTO tblPC(IDAsset, Shortname, Marque, Type, Serial_Number) Values('" & rstIDAsset(0) & "', '" & rstDataAsset(2) & "', '" & Test(0) & "', '" & Test(1) & "', '" & SN(0) & "');" DoCmd.RunSQL strSQL3 '''On insère DoCmd.SetWarnings True Final = Test(0) '''On teste Final2 = Test(1) Final3 = Test(2) Debug.Print Final Debug.Print Final2 Debug.Print Final3 End If ''' Fin du If Limite = 3 pour vérifier le nombre de valeurs End If ''' Fin du If Not IsEmpty("rstDataAsset") Pour vérifier si il y avait qqc a faire rstIDAsset.MoveNext Wend ''' Fin de la boucle for, on passe a la prochaine entrée End Sub
J'ai indiqué la ligne d'erreur ...
J'ai rajouté le ; aussi !
Merci :)
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 11:47
28 août 2008 à 11:47
Je ne trouve pas... Quel est le type d'erreur..?
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 13:14
28 août 2008 à 13:14
Me revoilà, excuse moi :)
l'erreur : Runtime Error '9' : Subscript out of range
l'erreur : Runtime Error '9' : Subscript out of range
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 13:35
28 août 2008 à 13:35
Ah j'ai trouvé ! si je retire la ligne juste au dessus,
ANTIPOSTROPHE = Split("" & rstRAM(0) & "", "'")
Ca marche ...
Maintenant je l'ai remise et ca marche toujours ...
Mais j'ai un autre problème (simple)
Lors d'un instertion, quelqu'un à un nom avec un apostrophe dedans :
(Ex : Machin d'truc)
Et ca fait foirer toute ma requête :(
N'aurais-tu pas une solution ?
ANTIPOSTROPHE = Split("" & rstRAM(0) & "", "'")
Ca marche ...
Maintenant je l'ai remise et ca marche toujours ...
Mais j'ai un autre problème (simple)
Lors d'un instertion, quelqu'un à un nom avec un apostrophe dedans :
(Ex : Machin d'truc)
Et ca fait foirer toute ma requête :(
N'aurais-tu pas une solution ?
basshero816
Messages postés
115
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2010
6
28 août 2008 à 14:11
28 août 2008 à 14:11
J'ai déja eu ce problème, mais je ne me souviens plus comment je l'ai contourné.
Essaie d'entourer ta variable d'autres cotes, ou de l'entourer avec des guillemets, ou des trucs de ce genre là.
Sinon il existe la fonction replace. Tu fais :
INSERT INTO ma_table VALUES ( ' & replace (nom_de_ma_variable, " ' ", " ") & ' .......) WHERE .... ;
Je ne te garantis pas le résultat, mais il est toujours bon d'essayer.
@+
Essaie d'entourer ta variable d'autres cotes, ou de l'entourer avec des guillemets, ou des trucs de ce genre là.
Sinon il existe la fonction replace. Tu fais :
INSERT INTO ma_table VALUES ( ' & replace (nom_de_ma_variable, " ' ", " ") & ' .......) WHERE .... ;
Je ne te garantis pas le résultat, mais il est toujours bon d'essayer.
@+
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
28 août 2008 à 15:21
28 août 2008 à 15:21
Haw, non ca ne marche pas :(
J'ai tout essayé pourtant !
J'ai tout essayé pourtant !