[Resolu] Echappement des caracteres speciaux

Echappement des caracteres speciaux [Resolu] - VB/VBA/VBS - Programmation

Marsh Posté le 17-08-2005 à 17:50:15    

Bonjour,
Je cherche commment echapper les caracteres speciaux lors d'une recherche avec la methode Find.
Pourquoi ? Car j'ai une liste de noms et certains contiennent des '*' or pour excel, il s'agit d'un caractere special qui signifie n'importe quoi.
 
Exemple:
la case A1 contient "thomas lar" et la case A2 contient "thomas*"
Et je cherche a recuperer la ligne ou se situe "thomas*" ...
 
Or avec un Range("A1:A2" ).Find(what:="thomas*" ), il va me renvoyer la cellule A1 au lieu de A2 car il va interpretrer ma demande comme etant tout ce qui commence par "thomas".
 
Je pensais qu'il existait une sorte de caratere d'echappement (comment sur d'autre system..), mais je n'ai pas trouve.
 
Donc si quelqu'un a une solution, je suis preneur ;)


Message édité par guendalf le 18-08-2005 à 11:05:31

---------------
Guendalf
Reply

Marsh Posté le 17-08-2005 à 17:50:15   

Reply

Marsh Posté le 17-08-2005 à 18:47:01    

Salut guendalf,
 
j'ai eu un cas à peu près pareil. Ma sollution :
 

Code :
  1. Sub cherc()
  2.      Dim a, b
  3.      a = 1
  4.      For a = 1 To 10
  5.           If Cells(a, 1).Text = "thomas*" Then b = a: GoTo 1
  6.      Next a
  7. 1    If b = "" Then MsgBox ("aucune occurrence" ) Else MsgBox ("ligne : " & b)
  8. End Sub


C'est fastidieux, c'est pas find qui est utilisé mais jusqu'à présent j'ai pas eu la chance de tomber sur une autre sollution.
 
Je suis aussi prenneuse si un mieux existe  ;)  

Reply

Marsh Posté le 17-08-2005 à 20:16:58    

watashi a écrit :

Salut guendalf,
 
j'ai eu un cas à peu près pareil. Ma sollution :
 

Code :
  1. Sub cherc()
  2.      Dim a, b
  3.      a = 1
  4.      For a = 1 To 10
  5.           If Cells(a, 1).Text = "thomas*" Then b = a: GoTo 1
  6.      Next a
  7. 1    If b = "" Then MsgBox ("aucune occurrence" ) Else MsgBox ("ligne : " & b)
  8. End Sub


C'est fastidieux, c'est pas find qui est utilisé mais jusqu'à présent j'ai pas eu la chance de tomber sur une autre sollution.
 
Je suis aussi prenneuse si un mieux existe  ;)


 
Ah! Goto!!!! Beurk!!!!!!!!!!! lol ;)
 
Mais tu m'as donne une idee ;)
Il suffit d'utiliser Find toujours, mais en verifiant si la case qu'il nous retourne contient le bon texte. Sinon on continue la recherche.
 
Voici un exemple qui permet de trouver la case contenant "dog*" dans la liste de mot "A1:A10"
 

Code :
  1. Public Sub RechercheExacte()
  2. Dim c As Range
  3. Dim search_word As String
  4. Dim next_line As Integer
  5. search_word = "dog*"
  6. With ActiveWorkbook.Worksheets(1)
  7.     Set c = .Range("A1:A10" ).Find(what:=search_word, LookIn:=xlValues)
  8.     If Not c Is Nothing Then
  9.         If c.Value <> search_word Then
  10.             Do
  11.             next_line = c.Row + 1
  12.             Set c = .Range("A" & next_line & ":A10" ).Find(what:=search_word, LookIn:=xlValues)
  13.             Loop While Not c Is Nothing And next_line <= 10 And c.Value <> search_word
  14.         End If
  15.         If c.Value = search_word Then
  16.             MsgBox "Found in " & c.Address, vbInformation
  17.         Else
  18.             MsgBox "Not found.", vbInformation
  19.         End If
  20.     Else
  21.         MsgBox "Not found", vbInformation
  22.     End If
  23. End With
  24. End Sub


 
P.S: J'aurai pu utiliser FindNext dans le bout de code precedent, mais j'ai remarque que le resultat etait incorrect avec FindNext si j'avais un appel de fonction entre le premier Find et le FindNext... et je n'ai pas encore compris pk ce n'etait pas possible (d'ou mon vieux hack pourri pour rechercher l'element suivant en reduisant la taille du Range). Mais je vous accorde qu'ici, n'ayant aucun appel de fonction, FindNext aurait tres bien fonctionne. (Au moins j'ai pu poser ma question sur FindNext qui me tarode depuis un ptit bout de tps maintenant...)
 
Bonne soiree a ceux qui ont pris le tps de tout lire ;)


---------------
Guendalf
Reply

Marsh Posté le 18-08-2005 à 09:26:52    

[quotemsg=1178268,3,279265]
Ah! Goto!!!! Beurk!!!!!!!!!!! lol ;)
[quotemsg]
 
lollllll c'est vrai que c'est pas beau ;)  
 

Reply

Marsh Posté le 18-08-2005 à 11:01:44    

WaTaShi> Goto ne devrait jamais etre utilise, c'est quasiment impossible de maintenir un code contenant des sauts un peu partout. On peut (quasiment) tout le temps s'en passer a moins de faire de l'asm.
 
bon je viens de voir que le code que j'ai mis precedemment, sans utiliser findnext est faux (il ne marche pas dans le cas ou l'on cherche un "thomas*", qu'il y a bien des "thomas" dans le texte mais pas de "thomas*" )
 
Donc voici quelque chose qui marche (et tant pis pour mon soucis avec findnext, qui de toute facon est hors sujet ici)
 

Code :
  1. ' permet de rechercher le contenu exacte d'une chaine,
  2. ' en traitant les caracteres speciaux au meme titre que les autres
  3. Public Sub RechercheExacte()
  4. Dim c As Range
  5. Dim search_word As String, firstAddress As String
  6. search_word = "thomas*"
  7. With ActiveWorkbook.Worksheets(1).Range("A1:A12" )
  8.     Set c = .Find(what:=search_word, LookIn:=xlValues)
  9.     If Not c Is Nothing Then
  10.         If c.Value <> search_word Then
  11.             firstAddress = c.Address
  12.             Do
  13.             Set c = .FindNext(c)
  14.             Loop While firstAddress <> c.Address And c.Value <> search_word
  15.         End If
  16.         If c.Value = search_word Then
  17.             MsgBox "Found in " & c.Address
  18.         Else
  19.             MsgBox "Not found"
  20.         End If
  21.     Else
  22.         MsgBox "Not found"
  23.     End If
  24. End With
  25. End Sub


Message édité par guendalf le 18-08-2005 à 11:26:16

---------------
Guendalf
Reply

Marsh Posté le 18-08-2005 à 14:03:02    

Pour les goto c'est vrai que c'est parfois un peu risqué mais je me suis pas encore penche sur les autres boucles que for... et encore même pas les for each.
Va falloir que je m'y mette en voyant tes codes c'est évident. Va falloir que je me penche sur la synthaxe ;)
merci pour le conseil :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed