Access_VB : condition avec Instr dans Case

Résolu
Melycea -  
 Melycea -
Bonjour à toutes et à tous,

Dans une fonction vba sous access 97, j'utilise un Select Case où pour chaque Case, je traite "si la chaine de caractère contient le mot ... " . Pour cela, j'utilise la fonction Instr mais on dirait que lors de l'exécution, les conditions ne sont jamais prises en compte.

Un petit exemple pour illustrer :

chaine="a partir de CDJ 700N" 

Select Case chaine 
    Case InStr(1, chaine, "C700A") <> 0 Or InStr(1, chaine, "CDJ 700A") <> 0 
        SNs = Nz(DLookup("[champs1]", "Table", "[champs2] = '700A'"), "") 
    Case InStr(1, chaine, "C700B") <> 0 Or InStr(1, chaine, "CDJ 700B") <> 0 
        SNs = Nz(DLookup("[champs1]", "Table", "[champs2] = '700B'"), "") 
    Case InStr(1, chaine, "C700C") <> 0 Or InStr(1, chaine, "CDJ 700C") <> 0 _ 
    Or InStr(1, chaine, "C700C1") <> 0 Or InStr(1, chaine, "CDJ 700C2") <> 0 
        SNs = Nz(DLookup("[champs1]", "Table", "[champs2] = '700C'"), "") 
    Case InStr(1, chaine, "C700N") > 0 Or InStr(1, chaine, "CDJ 700N") <> 0 _ 
    Or InStr(1, chaine, "C850N") <> 0 Or InStr(1, chaine, "CDJ 850N") <> 0 
        SNs = Nz(DLookup("[champs1]", "Table", "[champs2] = '700N'"), "") 
    Case InStr(1, chaine, "C850N-G1000") <> 0 Or InStr(1, chaine, "CDJ 850N-G1000") <> 0 Or InStr(1, chaine, "C700G") <> 0 
        SNs = Nz(DLookup("[champs1]", "Table", "[champs2] = '700N-G1000'"), "") 
    Case Else 
        SNs = "" 
        Exit Function 
End Select


Et donc, systématiquement, le programme rentre dans le "case else" alors que dans cet exemple, je trouve bien InStr(1, chaine, "CDJ 700N")=13

D'où peut venir le problème???

7 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,
    Dans votre cas if faut utiliser les tests if then elseif ........

    Select case ne peut pas marcher, vous avez une chaine de caracteres que vous voulez comparer a une recherche de caracteres dans cette chaine.
    0
  2. Utilisateur anonyme
     
    Bonjour,

    En effet tu compare une chaine avec un boolean !

    Suggestion :

    Sub Test()
    
        Dim Chaine As String, SNs As Long
        Dim Resultat As Boolean
    
        Chaine = "a partir de CDJ 700N"
        Resultat = True
        
        Select Case Resultat
            Case (InStr(1, Chaine, "C700A") > 0), _
                 (InStr(1, Chaine, "CDJ 700A") > 0)
                SNs = 1
            Case (InStr(1, Chaine, "C700B") > 0), _
                 (InStr(1, Chaine, "CDJ 700B") > 0)
                SNs = 2
            Case (InStr(1, Chaine, "C700C") > 0), _
                 (InStr(1, Chaine, "CDJ 700C") > 0), _
                 (InStr(1, Chaine, "C700C1") > 0), _
                 (InStr(1, Chaine, "CDJ 700C2") > 0)
                SNs = 3
            Case (InStr(1, Chaine, "C700N") > 0), _
                 (InStr(1, Chaine, "CDJ 700N") > 0), _
                 (InStr(1, Chaine, "C850N") > 0), _
                 (InStr(1, Chaine, "CDJ 850N") > 0)
                SNs = 4
            Case (InStr(1, Chaine, "C850N-G1000") > 0), _
                 (InStr(1, Chaine, "CDJ 850N-G1000") > 0), _
                 (InStr(1, Chaine, "C700G") > 0)
                SNs = 5
            Case Else
                SNs = 0
                Exit Sub
        End Select
    
    End Sub' 
    


    Cdt

    Lupin
    0
  3. Melycea
     
    Merci beaucoup pour vos réponses.
    J'ai appliqué la méthode de Lupin et ça fonctionne déjà un peu mieux sauf que pour le même exemple que j'ai donné, le programme s'arète systématiquement sur le premier "case" et donc renvoie : SNs=1 au lieu de SNs=4. Idem pour chaine="pour 700", le programme ne va pas au "Case Else".

    Je comprend pas du tout d'où celà peut venir???
    0
  4. Utilisateur anonyme
     
    re:

    De mon côté, ça fonctionne bien ?

    Suit ton code en mode pas à pas et évalue tes variables.

    Je n'ai pas d'autres solution :-(

    Cdt

    Lupin
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Melycea
     
    Re,

    C'est justement ce que je viens de faire.
    Quand j'exécute pas à pas, je vois bien que pour chaine="C700N" j'ai InStr(1, Chaine, "C700A") =0,ce qui est normal! Mais pour autant le programme reste dans ce "case" et ne teste même pas les suivants.

    J'y comprend plus rien...?!
    0
  7. Utilisateur anonyme
     
    re:

    retranscrit ton code ici pour être sur que l'on a les mêmes sources,
    je vais le tester de mon côté ...

    et dis moi quelle version de Access tu utilise.

    Cdt

    Lupin
    0
  8. Melycea
     
    Voici mon code:

    Function assoCDJ(chaine As Variant, SNs As Variant)
    
    Dim db As Database, TVal As Recordset, TmodSn As Recordset, _
    ok As Boolean, i As Integer
    
    Set db = CurrentDb
    Set TVal = db.OpenRecordset("Validity", dbOpenDynaset)
    Set TmodSn = db.OpenRecordset("Modeles - S/Ns", dbOpenDynaset)
    
    TmodSn.MoveFirst
    Select Case ok
    
        Case (InStr(1, chaine, "C700A") > 0), (InStr(1, chaine, "CDJ 700A") > 0)
            SNs = "$" & Nz(DLookup("[S/Ns]", "Modeles - S/Ns", "[Modele] = '700A'"), "")
    
        Case (InStr(1, chaine, "C700B") > 0), (InStr(1, chaine, "CDJ 700B") > 0)
            SNs = "$" & Nz(DLookup("[S/Ns]", "Modeles - S/Ns", "[Modele] = '700B'"), "")
    
        Case (InStr(1, chaine, "C700C") > 0), (InStr(1, chaine, "CDJ 700C") > 0) _
        , (InStr(1, chaine, "C700C1") > 0), (InStr(1, chaine, "CDJ 700C2") > 0)
            SNs = "$" & Nz(DLookup("[S/Ns]", "Modeles - S/Ns", "[Modele] = '700C'"), "")
    
        Case (InStr(1, chaine, "C700N") > 0), (InStr(1, chaine, "CDJ 700N") > 0) _
        , (InStr(1, chaine, "C850N") > 0), (InStr(1, chaine, "CDJ 850N") > 0)
            SNs = "$" & Nz(DLookup("[S/Ns]", "Modeles - S/Ns", "[Modele] = '700N'"), "")
    
        Case (InStr(1, chaine, "C850N-G1000") > 0), (InStr(1, chaine, "CDJ 850N-
    G1000") > 0), (InStr(1, chaine, "C700G") <> 0)
            SNs = "$" & Nz(DLookup("[S/Ns]", "Modeles - S/Ns", "[Modele] = '700N-G1000'"), "")
    
        Case Else
            SNs = ""
            Exit Function
    
    End Select
            
    SNs = TmodSn![S/Ns]
            
    End Function


    Et ensuite, voici comment je teste cette fonction :

    Public Function test()
    
    Dim retour As String
    
    Call assoTBM("T700N", retour)
    
    Debug.Print retour
    End Function


    Merci bcp de votre aide !
    0
    1. Utilisateur anonyme
       
      re:

      Tu as tout simplement oublié d'initialiser la variable ok à True

      Lorsque tu dimensionne la variable :

      Dim ok As Boolean

      celle-ci prend la valeur False par défaut, donc ajoute une affection à True

      TmodSn.MoveFirst
      ok = True
      Select Case ok
      ...

      Cdt

      Lupin
      0
    2. Melycea
       
      Merci beaucoup, tout marche comme je le voulais maintenant!
      0