Access_VB : condition avec Instr dans Case
Résolu
Melycea
-
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 :
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???
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
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.
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.
Bonjour,
En effet tu compare une chaine avec un boolean !
Suggestion :
Cdt
Lupin
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
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???
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???
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
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
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...?!
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...?!
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
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
Voici mon code:
Et ensuite, voici comment je teste cette fonction :
Merci bcp de votre aide !
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 !