Access_VB : condition avec Instr dans Case

Résolu/Fermé
Melycea - Modifié par Melycea le 9/05/2012 à 15:23
 Melycea - 14 mai 2012 à 10:01
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

f894009 Messages postés 17268 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 29 mars 2025 1 713
9 mai 2012 à 17:12
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
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
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
Utilisateur anonyme
10 mai 2012 à 13:50
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
Utilisateur anonyme
11 mai 2012 à 13:24
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
Merci beaucoup, tout marche comme je le voulais maintenant!
0