IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Utiliser la valeur d'une variable string


Sujet :

Access

  1. #1
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut Utiliser la valeur d'une variable string
    Bonjour @ tous,
    Je me pose la question suivante, peut-être quelqu'un d'entre vous en a déjà la réponse :

    Disons que dans un formulaire j'ai deux zones de texte : 'Champ1' et 'Champ2'.

    Soit le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim Test as String
     
    Test= Champ1.Name & "=" & Champ2.Name
    Je souhaiterais que le contenu de ma variable 'Test' Soit interprétée dans une conditionnelle. ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If Test then
       Msgbox "Egal"
    Else
       Msgbox "Pas égal"
    End If
    Me suis-je bien expliqué et est-ce possible ? Merci de votre contribution.

  2. #2
    Membre expérimenté
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Par défaut
    salut

    regarde ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if me.champ1=me.champ2 then
         Msgbox "Egal"
    Else
       Msgbox "Pas égal"
    End If

    A+

  3. #3
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut
    Salut,
    Non ce serait trop facile ...

    En fait le choix de ma conditionnelle n'est pas figé...
    Pour exemple ayez en tête la recherche multicritère de Caféïne. Une variable récupère la string du recordset en fonction des critères de selection. La ce serait la même chose sauf qu'au final j'utiliserai cette variable pour définir les critères de ma conditionnelle.

    Merci d'avance.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    te fatigue surtout pas à ce jeu
    champ1.name renvoie "champ1"
    champ2.name renvoie "champ2"

    Test= Champ1.Name & "=" & Champ2.Name va donc renvoyer

    "champ1=champ2"

    ce qui est bien du texte

    if test va donner des résultats curieux...


    if champ1=champ2 then devrait suffire
    si tu as besoin de conserver test
    cela devient test=champ1=champ2
    if test then

  5. #5
    Membre expérimenté
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Par défaut exemple
    tu peux donner un exemple stp

    A+

  6. #6
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut
    Random,
    En effet 'if' renverra un booléen. Mais sachant que dans d'autre langages on peut considérer le contenu de la variable, je me demandais si cela était faisable sur vba.

  7. #7
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut
    Messieurs,
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    Private Sub CmdChk_Click()
        On Error GoTo CmdChk_Err
     
        Dim MyRec As Recordset
        Dim MyRecV As Recordset
        Dim MyRec2 As Recordset
     
     
     
        Set MyRec = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRET;")
        If MyRec.RecordCount > 0 Then
            MyRec.MoveFirst
            While Not MyRec.EOF
                MyRec.Delete
                MyRec.MoveNext
            Wend
        End If
     
        Set MyRec = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRE;")
        Set MyRecV = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRE2;")
        Set MyRec2 = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRET;")
     
        MyRecV.MoveFirst
        MyRec.MoveFirst
        MyRec.MoveNext
     
        While Not MyRec.EOF
            If MyRec.Fields(3) = MyRecV.Fields(3) And MyRec.Fields(13) <> MyRecV.Fields(13) Then
                'MyRecV.Fields(3) And MyRec.Fields(2) = MyRecV.Fields(2) And MyRec.Fields(4) = MyRecV.Fields(4) And MyRec.Fields(5) = MyRecV.Fields(5) And MyRec.Fields(6) = MyRecV.Fields(6) And MyRec.Fields(7) = MyRecV.Fields(7) And MyRec.Fields(8) = MyRecV.Fields(8) And MyRec.Fields(9) = MyRecV.Fields(9) And MyRec.Fields(14) <> MyRecV.Fields(14) Then
                With MyRec2
                    .AddNew
                    .Fields(1) = MyRec.Fields(1)
                    .Fields(2) = MyRec.Fields(2)
                    .Fields(3) = MyRec.Fields(3)
                    .Fields(4) = MyRec.Fields(4)
                    .Fields(5) = MyRec.Fields(5)
                    .Fields(6) = MyRec.Fields(6)
                    .Fields(7) = MyRec.Fields(7)
                    .Fields(8) = MyRec.Fields(8)
                    .Fields(9) = MyRec.Fields(9)
                    .Fields(10) = MyRec.Fields(10)
                    .Fields(11) = MyRec.Fields(11)
                    .Fields(12) = MyRec.Fields(12)
                    .Fields(13) = MyRec.Fields(13)
                    .Fields(14) = MyRec.Fields(14)
                    .Fields(15) = MyRec.Fields(15)
                    .Fields(16) = MyRec.Fields(16)
                    .Fields(17) = MyRec.Fields(17)
                    .Update
                End With
            End If
     
            MyRecV.MoveNext
            MyRec.MoveNext
        Wend
        MyRec.Close
        MyRecV.Close
     
     
        Exit Sub
    CmdChk_Err:
        Select Case Err.Number
     
            Case Else
                MsgBox Err.Number & " : " & Err.Description
        End Select
    Explications :
    1) J'ai deux tables doublons : EXEMPLAIRE et EXEMPLAIRE2.
    Au départ je me place sur la deuxième ligne de EXEMPLAIRE et la première de EXEMPLAIRE2
    je fais une recherce pour chaque ligne de EXEMPLAIRE par rapport à la ligne précédente (donc celle de EXEMPLAIRE2) selon les critères défini lors de la clause 'if'.
    Seulement, si je veux changer ces critères je dois à chaque fois modifier directement le code.

    Avec un formulaire contenu des cases à cocher représentant les colones de ma table EXEMPLAIRE je peut stocher dans une variable (En l'ocurrence 'Test') les critères de ma conditionnelle; du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    if me.nomdelacheckbox1.selected then
       test=test & "myrec.fields(1)=myrec2.fields(1)"
    end if
     
    if me.nomdelachekbox2.selected then
       test=test & "myrec.fields(2)=myrec2.fields(2)
    end if
    ....
    ....
    if me.nomdelachekboxN.selected then
       test=test & " and myrec.fields(N)=myrec2.fields(N)
    end if
     
    if Test then 'c-a-d  if myrec.fields(2)=myrec2.fields(2) ... and myrec.fields(n)=myrec2.fields(n) then
       ...
       ...
    end if

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    .Fields(1) = MyRec.Fields(1)

    for boucle=1 to 17
    .Fields(1) = MyRec.Fields(1)
    next boucle

  9. #9
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut
    Non justement car certaines fois je chercherai l'égalité sur les champs 1,3,5 par exemple, une autre fois sur les les champs 2,6,7... D'ou le besoin de pouvoir générer une variable contenant les critères du if. Seulement comment l'interpréter??? J'ai bien peur que cela ne soit possible en vba...

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut vador972,

    Tu considères ton enregistrement comme un assemblage de champs numérotés, c'est un bon début. Quand tu coches ta case, cela correspond à un test de comparaison entre tes champs.
    Case 1 => Rst1.Champ(3) = Rst2.Champs(3)
    Case 2 => Rst1.Champ(7) = Rst2.Champs(7)

    Cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Function Test(ByRef pRecord1 As Record, ByRef pRecord2 As Record, ByVal pIndex1 As Byte, ByVal pIndex2 As Byte, ByVal pComp As String) As Boolean
    Test = Eval((pRecord1.Fields(pIndex1) & pComp & pRecord2.Fields(pIndex2)))
    End Function
    Tu continues à tester tant que Test reste vrai. Dès qu'il est faux, tu sais que tu ne feras pas l'action finale.

    Voilà ce que j'aurais fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     Private Sub CmdChk_Click()
        On Error GoTo CmdChk_Err
     
        Dim MyRec As Recordset
        Dim MyRecV As Recordset
        Dim MyRec2 As Recordset    
        Dim vTestGlobal As Boolean, i As Byte
     
        DoCmd.RunSql "DELETE EXEMPLAIRET FROM EXEMPLAIRET"
     
        Set MyRec = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRE;")
        Set MyRecV = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRE2;")
        Set MyRec2 = CurrentDb.OpenRecordset("SELECT * FROM EXEMPLAIRET;")
     
        MyRecV.MoveFirst
        MyRec.MoveFirst
        MyRec.MoveNext
     
        vTestGlobal = True
        While Not MyRec.EOF
            If Case1 Then vTestGlobal = Test(MyRec.Record, MyRecV.Record, 3, 3, "=")
            If Case 2 Then If vTestGlobal Then vTestGlobal = Test(MyRec.Record, MyRecV.Record, 13, 13, "<>")
            ...
            ...
            If vTestGlobal Then
                With MyRec2
                    .AddNew
                    For i = 1 To 17
                        .Fields(i) = MyRec.Fields(i)
                    Next
                    .Update
                End With
            End If
     
            MyRecV.MoveNext
            MyRec.MoveNext
        Wend
        MyRec.Close
        MyRecV.Close
     
        Exit Sub
    CmdChk_Err:
        Select Case Err.Number
     
            Case Else
                MsgBox Err.Number & " : " & Err.Description
        End Select
    Bon j'ai pas testé mais cela devrait gazer.
    Bye

  11. #11
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    Salut vador972,

    Excuses moi si je reprend la discussion depuis le début.
    Tu veux absolument que Test renvoie une valeur booléenne.
    vador972 a écrit:
    En effet 'if' renverra un booléen.
    Mais la déclaration de la variable Test est String! Car un String ne renvoie que du String!
    random a écrit:
    Test= Champ1.Name & "=" & Champ2.Name va donc renvoyer

    "champ1=champ2"

    ce qui est bien du texte
    Et ça c'est clair et il n'y rien à dire.
    Si ton objectif est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If Test then
       Msgbox "Egal"
    Else
       Msgbox "Pas égal"
    End If
    alors tu vas devoir changer la déclaration de Test en ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Test As Boolean
    Test=(Champ1.Name=Champ2.Name)
    Mais sérieusement, pourquoi deux contrôles d'un formulaire auraient-ils le même nom (qu'Access n'acceptera jamais d'ailleurs)? Ton intention ne serait-il pas de vouloir écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Champ1=Champ2
    ou
    Champ1.Value=Champ2.Value
    pour tester le contenu de ces contrôles?

  12. #12
    Membre éclairé Avatar de vador972
    Profil pro
    Inscrit en
    Août 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 71
    Par défaut
    Bonjour @ tous,
    Tout d'abord merci pour vos nombreuses conttributions.
    Après lecture je pense que je vais tester la solution 'ByRef' qui me semble à l'évidence la plus logique.
    Je suis tiens au courant dès que j'aurai effectué ces test. Cela débouchera peut-être sur un nouveau tutoriel qui sait

    Merci @ tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/08/2012, 16h09
  2. Réponses: 9
    Dernier message: 06/06/2011, 14h39
  3. Réponses: 4
    Dernier message: 11/10/2010, 00h06
  4. Filtrer en utilisant la valeur d'une variable
    Par Deciprog dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/04/2010, 19h38
  5. [EVAL] utiliser la valeur d'une variable à partir de son nom
    Par Julien Dufour dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/04/2008, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo