[VBA] tester l'existence d'une variable
Résolu/Fermé
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
-
26 août 2008 à 11:30
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:27
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:27
A voir également:
- [VBA] tester l'existence d'une variable
- Flash drive tester - Télécharger - Divers Utilitaires
- Tester son pc - Guide
- Tester composant pc - Guide
- Tester signal wifi gratuit - Guide
13 réponses
Utilisateur anonyme
26 août 2008 à 13:40
26 août 2008 à 13:40
Bonjour,
Suggestion :
Lupin
Suggestion :
Sub Essai() Dim strMots As String, strMessage Dim Boite As Variant Dim Limite As Integer, Boucle As Integer strMots = "Table~Chaise~Banc" Boite = Split(strMots, "~") Limite = UBound(Boite) 'MsgBox Limite For Boucle = 0 To Limite strMessage = strMessage & vbLf & _ "Boucle : " & Boucle & _ " : " & Boite(Boucle) Next MsgBox strMessage End Sub '
Lupin
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
26 août 2008 à 13:03
26 août 2008 à 13:03
Runtime error 424 : Object Required. :/
Le debugger m'indique la ligne du If test(3) Is Nothing ou If test(3) is Null !
Le debugger m'indique la ligne du If test(3) Is Nothing ou If test(3) is Null !
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
26 août 2008 à 15:12
26 août 2008 à 15:12
Salut A.Lupin :)
Merci, grace à toi j'ai pu résourde mon problème en faisant de cette façon :
If Limite = 3 Then
...
Else
...
End If
Cependant, le mêm problème est revnu mais pour un autre champ.
Je fais, pour pouvoir insérer chaque entrée dans une nouvelle table, cette boucle.
While (i <= rstTest("nbr_Entrees"))
La variable i part de 1, et fais toutes les entrées jusqu'a ce qu'il n'y en ai plus (que le nombre d'entrées est atteint).
Cependant, dans ma bdd, Certains champs ont été supprimés. Donc lorsque je passe de 409 à 411, il cherche le 410 et une erreur s'affiche : "Runtime Error 3021 : No current record".
Je cherche donc à nouveau a vérifier que la variable existe (pour l'ID 410, elle n'existera pas puisqu'il n'y a aucune données à mettre dedans).
Merci !
Merci, grace à toi j'ai pu résourde mon problème en faisant de cette façon :
If Limite = 3 Then
...
Else
...
End If
Cependant, le mêm problème est revnu mais pour un autre champ.
Je fais, pour pouvoir insérer chaque entrée dans une nouvelle table, cette boucle.
While (i <= rstTest("nbr_Entrees"))
La variable i part de 1, et fais toutes les entrées jusqu'a ce qu'il n'y en ai plus (que le nombre d'entrées est atteint).
Cependant, dans ma bdd, Certains champs ont été supprimés. Donc lorsque je passe de 409 à 411, il cherche le 410 et une erreur s'affiche : "Runtime Error 3021 : No current record".
Je cherche donc à nouveau a vérifier que la variable existe (pour l'ID 410, elle n'existera pas puisqu'il n'y a aucune données à mettre dedans).
Merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
26 août 2008 à 15:35
26 août 2008 à 15:35
re :
il te faut tester le record avec l'instruction :
If ( IsEmpty(recorset(i)) ) Then
dans ton texte :
While (i <= rstTest("nbr_Entrees"))
je ne peux identifier l'objet record indexé par le i ...
Lupin
il te faut tester le record avec l'instruction :
If ( IsEmpty(recorset(i)) ) Then
dans ton texte :
While (i <= rstTest("nbr_Entrees"))
je ne peux identifier l'objet record indexé par le i ...
Lupin
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
26 août 2008 à 15:59
26 août 2008 à 15:59
Ups,
En fait j'ai fait un COUNT des entrées de la base de donnée.
Puis j'ai initialisé i avec comme valeur 1, et après chaque boucle, i s'incrémente de i.
i représente aussi l'ID dans l'insertion des valeurs. Ma requête SQL ressemblera à ca :
strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & ""
en gros l'éxecution du code s'effectue comme ceci :
Je sélectionne les valeurs qui m'intéresse avec l'id i
Je les découpe grace à Split(), je les trie et je les insère
j'incrémente i de 1
Je sélectionne les valeurs qui m'intéressent avec l'id i suivant
etc ...
Et la condition
While (i <= rstTest("nbr_Entrees"))
sert à éviter la boucle infinie. Ainsi i ne dépassera jamais le nombre d'entrée !
Aussi, tu as confondu le i et le 1 :)
rstTest(1) => La deuxième entrée du recordset rstTest !
En fait j'ai fait un COUNT des entrées de la base de donnée.
Puis j'ai initialisé i avec comme valeur 1, et après chaque boucle, i s'incrémente de i.
i représente aussi l'ID dans l'insertion des valeurs. Ma requête SQL ressemblera à ca :
strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & ""
en gros l'éxecution du code s'effectue comme ceci :
Je sélectionne les valeurs qui m'intéresse avec l'id i
Je les découpe grace à Split(), je les trie et je les insère
j'incrémente i de 1
Je sélectionne les valeurs qui m'intéressent avec l'id i suivant
etc ...
Et la condition
While (i <= rstTest("nbr_Entrees"))
sert à éviter la boucle infinie. Ainsi i ne dépassera jamais le nombre d'entrée !
Aussi, tu as confondu le i et le 1 :)
rstTest(1) => La deuxième entrée du recordset rstTest !
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
26 août 2008 à 15:59
26 août 2008 à 15:59
Désolé, double post. :/
Utilisateur anonyme
26 août 2008 à 16:12
26 août 2008 à 16:12
re :
quel instruction utilise tu ?
... Je sélectionne les valeurs qui m'intéressent avec l'id i suivant ...
Lupin
quel instruction utilise tu ?
... Je sélectionne les valeurs qui m'intéressent avec l'id i suivant ...
Lupin
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
26 août 2008 à 16:13
26 août 2008 à 16:13
Toujours la même requête SQL : strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & ""
Mais comme l'ID à été incrémenté de 1 avant la fin de la boucle, ca me sélectionne le champ suivant :p
Mais comme l'ID à été incrémenté de 1 avant la fin de la boucle, ca me sélectionne le champ suivant :p
Utilisateur anonyme
26 août 2008 à 16:59
26 août 2008 à 16:59
re :
là je suis un peu largué, je ne vois pas bien tout le programme ???
Peut=être que :
strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & ""
If Not IsEmpty("SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & "") Then
...
Lupin
là je suis un peu largué, je ne vois pas bien tout le programme ???
Peut=être que :
strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & ""
If Not IsEmpty("SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & "") Then
...
Lupin
LiMpi
Messages postés
32
Date d'inscription
jeudi 14 août 2008
Statut
Membre
Dernière intervention
29 août 2008
3
27 août 2008 à 09:36
27 août 2008 à 09:36
Bon finalement j'ai trouvé une autre solution, qui est censée marcher mais qui marche pas :p
Donc tu peux lire le code pour comprendre, mais mon problème se trouve en bas de ce message ce n'ets donc plus nécessaire de lire :p
Je te passe toutes les Dim !
voilà le code ;)
Vla, excuse moi pour l'incrémentation pourrie mais je vient de la faire spécialement pour toi :)
Sinon,
Maintenant à la place d'utiliser i, j'ai trouvé plus simple :
strSQL = "SELECT lIDAsset FROM tblAsset" ''' On sélectionne les ID de la table
Set rstTest = dbTestForm.OpenRecordset(strSQL) ''' On mets le résultats dans un recordset
Donc là j'ai récupérer tout les ID
ensuite la boucle devient un For :
For Each lIDAsset In rstTest
Execute
Next
Comme ca plus de problèmes d'ID inexistant !
Par contre ma boucle For foire, "runtime Error 3251 : Operation is not supported for this type of object"
:/
Merci !
Donc tu peux lire le code pour comprendre, mais mon problème se trouve en bas de ce message ce n'ets donc plus nécessaire de lire :p
Je te passe toutes les Dim !
voilà le code ;)
Set dbTestForm = CurrentDb strSQL = "SELECT COUNT(*) as plop FROM tblAsset" Set rstTest = dbTestForm.OpenRecordset(strSQL) CurrentDb.Execute "DELETE * FROM tblPC;" i = 1 While (i <= rstTest("Plop")) strSQL2 = "SELECT lIDAsset, sAssetTag, sLoginID FROM tblAsset WHERE lIDAsset = " & i & "" Set rstTest2 = dbTestForm.OpenRecordset(strSQL2) If IsEmpty("rstTest2") Then Stop Else Tag = rstTest2(1) Test = Split("" & Tag & "", "~") Limite = UBound(Test) If Limite = 3 Then SN = Split("" & Test(3) & "", ".") DoCmd.SetWarnings False strSQL3 = "INSERT INTO tblPC(IDAsset, Shortname, Marque, Type, Modele, Serial_Number) Values('" & rstTest2(0) & "', '" & rstTest2(2) & "', '" & Test(0) & "', '" & Test(1) & "', '" & Test(2) & "', '" & SN(0) & "')" DoCmd.RunSQL strSQL3 DoCmd.SetWarnings True Final = Test(0) Final2 = Test(1) Final3 = Test(2) Final4 = Test(3) Debug.Print Final Debug.Print Final2 Debug.Print Final3 Debug.Print Final4 i = i + 1 Else SN = Split("" & Test(2) & "", ".") 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 DoCmd.SetWarnings True Final = Test(0) Final2 = Test(1) Final3 = Test(2) Debug.Print Final Debug.Print Final2 Debug.Print Final3 i = i + 1 End If End If Wend End Sub
Vla, excuse moi pour l'incrémentation pourrie mais je vient de la faire spécialement pour toi :)
Sinon,
Maintenant à la place d'utiliser i, j'ai trouvé plus simple :
strSQL = "SELECT lIDAsset FROM tblAsset" ''' On sélectionne les ID de la table
Set rstTest = dbTestForm.OpenRecordset(strSQL) ''' On mets le résultats dans un recordset
Donc là j'ai récupérer tout les ID
ensuite la boucle devient un For :
For Each lIDAsset In rstTest
Execute
Next
Comme ca plus de problèmes d'ID inexistant !
Par contre ma boucle For foire, "runtime Error 3251 : Operation is not supported for this type of object"
:/
Merci !
Utilisateur anonyme
28 août 2008 à 14:29
28 août 2008 à 14:29
re :
Je ne suis pas expert dans ce type de manipulation, déjà d'avoir créé un enregistrement (recordset)
tu améliore de beaucoup la fonctionnalité et la convivialité de ton programme.
Dans la boucle :
For Each lIDAsset In rstTest
Execute
Next
As-tu essayé :
For Each lIDAsset In rstTest
..lIDAsset.Execute
Next
Lupin
Je ne suis pas expert dans ce type de manipulation, déjà d'avoir créé un enregistrement (recordset)
tu améliore de beaucoup la fonctionnalité et la convivialité de ton programme.
Dans la boucle :
For Each lIDAsset In rstTest
Execute
Next
As-tu essayé :
For Each lIDAsset In rstTest
..lIDAsset.Execute
Next
Lupin
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:27
28 août 2008 à 15:27
Salut !
J'ai résolu mon problème, la suite est là
http://www.commentcamarche.net/forum/affich 8122736 vba access probleme dans une boucle for?dernier#dernier
Maintenant j'insère des valeur dans ma table, dont le nom d'une personne qui contient une apostrophe.
Je ne sais pas comment éviter que cette apostrophe arrête toute ma requête :(
J'ai résolu mon problème, la suite est là
http://www.commentcamarche.net/forum/affich 8122736 vba access probleme dans une boucle for?dernier#dernier
Maintenant j'insère des valeur dans ma table, dont le nom d'une personne qui contient une apostrophe.
Je ne sais pas comment éviter que cette apostrophe arrête toute ma requête :(