Rechercher : dans
Par :

[VBA] tester l'existence d'une variable

Dernière réponse le 28 aoû 2008 à 15:27:02 LiMpi, le 26 aoû 2008 à 11:30:27 
 Signaler ce message aux modérateurs

Bonjour,

J'ai une table qui contient une colonne donc les champs contiennent eux-même plusieurs valeurs séparés par des "~"

Exemple :
Marque~Type~Modèle~Numéro de série

J'ai donc séparé les valeurs grace à Split(), et lorsque j'ai voulu inséré les différentes données dans une nouvelle table, j'ai eu un problème.

J'avais en effet des champs qui ne contenaient que
Marque~Type~Numéro de série

J'ai donc voulu faire une condition pour savoir si le champ contenait 3 ou 4 valeurs différentes et les insérer selon.

voilà ma condition :

If Test(3) <> "" Then
Debug.Print " 4 valeurs "
Else
Debug.Print " 3 valeurs "
End If

Ca marche bien pour les champs à 4 valeurs, mais lorsqu'il arrive sur un champ a 3 valeurs, j'ai une "Runtime Error 9 : Subscript out of range"

En effet, dans les champs a 3 valeurs, Test(3) n'existe pas. Il ne peux donc pa sla repérer.

Existe-t-il une fonction qui peux vérifier si la variable Test(3) existe ? du genre Isset en PHP ?
Ou un autre moyen d'arriver au même résultat ? :p

Merci !

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « [VBA] tester l'existence d'une variable » dans :
[Shell] Tester une variable numérique Voir Tester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Les variables avec Perl VoirConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois...

1

knuckles, le 26 aoû 2008 à 12:03:37

T'as essayé
If test(3) Is Nothing ou Is Null au lien de <>"" ??

Répondre à knuckles

2

LiMpi, le 26 aoû 2008 à 13:03:32

Runtime error 424 : Object Required. :/

Le debugger m'indique la ligne du If test(3) Is Nothing ou If test(3) is Null !

Répondre à LiMpi

3

Lupin.A, le 26 aoû 2008 à 13:40:36

Bonjour,

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

Répondre à Lupin.A

4

LiMpi, le 26 aoû 2008 à 15:12:30

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 !

Répondre à LiMpi

5

Lupin.A, le 26 aoû 2008 à 15:35:13

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

Répondre à Lupin.A

6

LiMpi, le 26 aoû 2008 à 15:59:39

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 !

Répondre à LiMpi

7

LiMpi, le 26 aoû 2008 à 15:59:39

Désolé, double post. :/

Répondre à LiMpi

8

Lupin.A, le 26 aoû 2008 à 16:12:02

Re :

quel instruction utilise tu ?

... Je sélectionne les valeurs qui m'intéressent avec l'id i suivant ...

Lupin

Répondre à Lupin.A

9

LiMpi, le 26 aoû 2008 à 16:13:24

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

Répondre à LiMpi

10

Lupin.A, le 26 aoû 2008 à 16:59:28

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

Répondre à Lupin.A

11

LiMpi, le 27 aoû 2008 à 09:36:48

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

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 !

Répondre à LiMpi

12

Lupin.A, le 28 aoû 2008 à 14:29:14

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

Répondre à Lupin.A

13

 LiMpi, le 28 aoû 2008 à 15:27:02

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

Répondre à LiMpi
Collection CommentÇaMarche.net