Access_VB : condition avec Instr dans Case

Résolu
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. 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 !
    1. 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
    2. Merci beaucoup, tout marche comme je le voulais maintenant!
  2. 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
    1. 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...?!
      1. 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
        1. 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???
          1. 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
            1. 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.