Détecter clef

maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010 - 17 févr. 2007 à 18:41
maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010 - 17 févr. 2007 à 19:20
bonjour,
j'aimerai savoir comment faire pour faire fonctionner cette ligne :
If InStr("début de mon texte", "début de mon texte et fin de celui ci") = 1 Then MsgBox "oui"
qui cherche "début de mon texte" dans "début de mon texte et fin de celui ci" mais il faudrait qu'il y ai plusieur valeurs comme "début de mon texte" sans faire plusieur lignes comme
If InStr("la voiture", "est bleu la voiture") = 1 Then MsgBox "oui"
If InStr("manger", "il faut beaucoup manger") = 1 Then MsgBox "oui"
If InStr("attention", "attention à vous") = 1 Then MsgBox "oui"
donc j'ai une liste de phrases dans un fichier texte avec en séparateur ##
la voiture##1
manger##2
attention#3
il faudrait donc que à la place de msgbox "oui" si il trouve l'une de ces clefs qu'il affiche le numéro précis par exemple manger 2 et attention 3

info : j'ai mis des mots comme "la voiture" "manger" et "attention" pour faire simple car pour mon projet sa sera des adresses internet

merci d'avance

123

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 févr. 2007 à 18:48
Salut
Comme expliqué dans l'aide de la fonction Instr, Instr ne renvoie pas 0 ou 1, mais 0 ou l'emplacement où il trouve ton mot.
Il suffit donc de détecter > 0 et non = 1
Sous VB6, pour séparer des chaines grace à un caractère spécial comme tes ##, il est simple d'utiliser la fonction Split qui transforme ta chaine initial en un tableau de chaines découpées, sans les ##.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 févr. 2007 à 18:54
Re
Si tu veux détecter plusieurs mots dans une même chaine, il faut créer une boucle, genre For-Next ou Do-Loop.
Pour que la boucle puisse indexer les mots à chercher, il faudra les stocker dans un tableau de type chaine, genre
Dim aMots(10) As String
Je ne vais pas te faire ton code, ce serait un mauvais service à te rendre.
Relis l'aide des fonctions que je viens de citer et regarde parmi les sources du site, ce sont des fonctions très fréquemment utilisées.
Si tu n'as pas l'aide (pirate !), va sur le site de Microsoft  (anglais)  http://msdn.microsoft.com/library/default.asp?url=/library/en-us
0
maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010
17 févr. 2007 à 18:54
es t'il possible de faire ce que je souhaite avec le code de jrivet ? si oui je vois pas trop en fait comme je le dit souvent je suis un débutant ;)

Option Explicit 

Private C_Concordance As New Collection 

Private Sub Form_Load() 
Dim NumFile As Integer 
Dim Ligne As String 
Dim Split_Ligne() As String 

    NumFile =  FreeFile 

    Open "C:\Test.txt" For Input As NumFile 
        While Not  EOF (NumFile) 
            'On lit ligne par ligne le fichier de correspondance
            Line Input #NumFile, Ligne 
            'On "casse" la ligne suivant le séparateur ","
            ' => toi tu peux mettre "##@##" si tu veux
            Split_Ligne =  Split(Ligne, ",") 
            'On ajoute à notre collection l'élément a droite du séparateur
            'avec en Clé l'élément de gauche
            Call C_Concordance.Add( Trim (Split_Ligne(1)), Trim(Split_Ligne(0))) 
        Wend 
    Close NumFile 

    'Juste pour la présentation
    Me.Width  = 6915 
    Text1.Width =  6045 
    Text2.Width = 6045 
    Text1.Text = "j'adore les courgettes c'est très tomate en revanche les poivrons c'est poireau" 
End Sub 

Private Sub Text1_KeyPress(KeyAscii As Integer) 
    'Si l'utilisateur appuie sur la touche entree du textbox1
    If KeyAscii = vbKeyReturn Then Text2.Text = ReplacePhrase(Text1.Text) 
End Sub 

Private Function ReplacePhrase(ByVal Phrase As String) As String 
Dim Mots() As String 
Dim i As Integer 
    'On récupère tout les mots de la phrase
    Mots = Split(Phrase) 
    'Pour chaque motes de la phrase on le remplace
    'éventuellement par le mots souhaités
    For i =  LBound (Mots) To UBound(Mots) 
        ReplacePhrase  = ReplacePhrase & GetConcordance(Mots(i)) & " " 
    Next 
End Function 

Private Function GetConcordance(ByVal StrVal As String) As String 
On Error GoTo HandleError 
    'petite fonction permettant de récupérer
    'dans la collection l'élément correspondant a une clé
    GetConcordance = C_Concordance(StrVal) 
Exit Function 
HandleError: 
    'Si la clé est absente => erreur d'execution donc
    'la fonction retourne le mot d'entrée
    GetConcordance = StrVal 
End Function

123
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 févr. 2007 à 19:03
Ok, je comprends mieux ce que tu cherches.
En fait, il te suffit d'utiliser la fonction Split pour séparer le mot et le chiffre (attention, Split ne fonctionne qu'avec des String)
En faisant un
Dim aTableau() As String
aTableau = Split(sMaChaine, "##")
tu obtiendras :
"attention" dans aTableau(0)
et
"3" dans aTableau(1)
Il te suffira ensuite de stocker ces infos dans une structure te permettant de faire le lien entre les mots et les chiffres, et la Collection est le mieux adapté puisqu'elle permet de faire des recherches d'item par leur nom (et pas uniquement par leurs index comme dans les tableaux)

Regarde donc comment fonctionne les Collections et tu comprendras vite comment les remplir et les utiliser.
0

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

Posez votre question
maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010
17 févr. 2007 à 19:08
Dim aTableau() As String
aTableau = Split(sMaChaine, "##")
me sort une erreur "type incompatible" :s


123
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 févr. 2007 à 19:11
J'insiste !

avec un fichier ayant pour structure :

"item1","blabla"
""toto","titi"
"machin","chouette"

On n'a pas besoin de séparateur ni de tout ce qui est en rougle ici :

Open "C:\Test.txt" For Input As NumFile 
        While Not EOF(NumFile) 
            'On lit ligne par ligne le fichier de correspondance
            Line Input #NumFile, Ligne 
            'On "casse" la ligne suivant le séparateur ","
            '=> toi tu peux mettre "##@##" si tu veux
            Split_Ligne = Split(Ligne, ",") 
            'On ajoute à notre collection l'élément a droite du séparateur
            'avec en Clé l'élément de gauche
            Call C_Concordance.Add(Trim(Split_Ligne(1)), Trim(Split_Ligne(0))) 
        Wend 
    Close NumFile 

qui se remplace par

    Open "C:\Test.txt" For Input As NumFile 
        While Not EOF(NumFile) 
            Input #NumFile, blabla, blibli 
           Call C_Concordance.Add (Trim(blabla), Trim(blibli) 
        Wend 
    Close NumFile 

Je l'ai déjà exposé dans une autre discussion de xavier...
0
maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010
17 févr. 2007 à 19:20
je comprend bien ce que tu veut dire jfmarques mais le problème c'est comment faire quand on controle rien vu que le textbox avec le contenu peut changer toute les 2 secondes par exemple donc je le met dans un timer (ton code) mais sa me sort rien du tout enfin si une erreur comme quoi que KeyAscii n'est pas déclaré donc  problème :s c'est ok le tableau avec le contenu du fichier txt est créer le contenu est mis dans les chaines en l'occurence 3 chaines

la voiture##1
manger##2
attention#3

comment faire maintenant avec mon timer pour vérifier que "la voiture" "manger" ou bien "attention" est bien dans le textbox ? sachant que la ligne change tout le temps

je pense que il me reste plus que sa comment intérrogation car si j'ai bien compris il faut
1 charger
2 décomposer en chaine avec séparateur
3 je sais pas faire vérifier toute les seconde que le textbox = chaine 1-2 ou 3 ou alors aucune des chaines

j'espère mêtre exprimé correctement

d'avance merci pour votre aide précieuse

123
0
Rejoignez-nous