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