Comparer des chaînes de caractères en VBA

Résolu/Fermé
Hurborg - 14 janv. 2014 à 10:42
 Hurborg - 14 janv. 2014 à 17:05
Bonjour à tous,

N'étant pas un as de la programmation VBA sur Excel 2010 (je dispose également de Windows 8 sur mon PC), j'ai besoin de votre aide fructueuse.

Ce que je cherche à faire est simple dans les mots mais pour le programmer je rencontre quelques soucis.

Soit trois colonnes I , J et K d'une feuille Excel.
- I est "Opérations"
- J est "Exemple"
- K est "Affectation"

Dans la colonne I (appelée "Opérations", j'ai une liste de caractères telles que:
- Paiement par carte
- Virement en votre faveur
- Retrait au distributeur
- Prélèvement
- Virement émis

Dans la colonne Exemple, je n'ai qu'une cellule qui contient la liste de caractères ci-dessous:
Pole Emploi Pays Loire 133640037
Virement En Votre Faveur
13 851 68056722 02012014
13364003778


Ce que je souhaite faire en VBA est le programme suivant:

Excel regarde la valeur de la cellule unique de la colonne "Exemple" puis la compare avec les 5 cellules de la colonne "Opérations". Si une des 5 valeurs de cette dernière colonne est contenue dans la cellule unique de la colonne "Exemple", alors Excel vient inscrire dans la colonne "Affectation", à la même hauteur de la cellule unique de la colonne J, la chaîne de caractères contenue.

Autrement dit si dans la chaîne de caractères suivante:
Pole Emploi Pays Loire 133640037
Virement En Votre Faveur
13 851 68056722 02012014
13364003778

est présent la chaîne de caractère "Virement en votre faveur" alors dans la colonne "Affection" s'inscrit "Virement en votre faveur"

Voici le code que j'utilise mais qui ne fonctionne pas d'où l'objet de ma démarche ;-):


Dim q As Integer
Dim AdressText As String
Dim AdresseTexteChercher As String
q = 0

Cells.Find("Exemple").Select
ActiveCell.Range("a1").Offset(1, 0).Activate
ActiveCell.Select
AdressText = ActiveCell.Value

For i = 1 To 5
q = q + 1
Cells.Find("Opérations").Select
ActiveCell.Range("a1").Offset(q, 0).Activate
AdresseTexteChercher = ActiveCell.Value

If AdressText Like AdresseTexteChercher Then

Cells.Find ("Affectation")
ActiveCell.Range("a1").Offset(1, 0).Activate
ActiveCell.FormulaR1C1 = AdresseTexteChercher
End If

Next i

End Sub

Symptômes:

Excel ne m'indique aucune erreur de programmation, mais le code qui me semblait correct ne me permets pas de réaliser ce que j'essaie de faire.
C'est à partir du "If" et du "Like" que ça merdouille ^^!

Je vous laisse ci-joint mon fichier sur lequel je travaille.

Merci infiniment, si vous avez des questions n'hésitez pas ;-)

http://cjoint.com/?DAokMQEoqnj

5 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 janv. 2014 à 11:40
Bonjour,

un peu plus simple:

Sub RechercheChaîneCaractères()
Dim p As Integer
Dim q As Integer
Dim AdressText As String
Dim AdresseTexteChercher As String

With Worksheets("Sources")
'passage en majuscule phrase
AdressText = UCase(.Range("J3"))
For i = 3 To 7
'passage en majuscule texte a chercher
AdresseTexteChercher = UCase(.Range("I" & i))
'test si dans phrase
If InStr(1, AdressText, AdresseTexteChercher) Then
'ecriture
.Range("K3") = AdresseTexteChercher
End If
Next i
End With

End Sub
0
Ohhh Punaise!!

D'une part merci pour ta réponse :D

C'est plus simple pour toi mais j'ai pas du tout compris le code; y a moyen que tu explicites ton code ou pas?
Pourquoi tu passes en majuscule en fait? C'est surtout ca qui me pose problème ^^

Je t'en serai reconnaissant
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 janv. 2014 à 11:56
Re,

sauf si vous y tenez, recherche entetes de colonnes pas utiles

bloc With --- end with: si autre feuille active, vous ecrirez pas au bon endroit

passage en majuscules pour eviter les differences d'ecriture (miniscules, majuscules)

instr(): permet de trouver la position d'un caractere ou chaine dans un mot ou une phrase
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
14 janv. 2014 à 12:16
Bonjour à tous,

ou si les 2 chaines doivent être strictement égales :
If IAdressText = AdresseTexteChercher Then
On ne sait jamais, des termes comme "Prélèvement" peuvent éventuellement être présents dans des libellés plus long...
Ajouter Ucase() sur les 2 chaines si il peut y avoir une différence de case.

eric
0
Merci Eriiic pour ta réponse,

Les termes sont toujours écrits de la même manière en fait donc ca me gênera pas. Mais si c'est le cas je dois utiliser Ucase en fait?

J'ai bien tout compris ^^?

Et sinon j'ai pas compris non plus pourquoi on utilisais la syntaxe suivante:

 .Range("K3") = AdresseTexteChercher

Pourquoi le "." devant le range?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
14 janv. 2014 à 12:56
Si tu as un doute sur les majuscules/minuscules qui pourraient être différentes tu transformes les chaines en majuscule avec Ucase() pour les rendre équivalentes.
Si tu ne sais pas tu le mets d'office comme l'a fait f894009.

eric
0
Je suis dégoutté parce que la méthode de f894009 fonctionne à merveille mais je n'arrive pas à l'adapter à mon projet.

Ne comprenant pas pourquoi on utilise la méthode With, je ne souhaite pas la représenter dans mon programme. C'est pourquoi je souhaite continuer avec la base de code que je vous ai fourni.

J'ai donc fait quelques modifications en fonction de ce que vous m'aviez proposé tel que:

Dim q As Integer
Dim AdressText As String
Dim AdresseTexteChercher As String
q = 0

Cells.Find("Exemple").Select
ActiveCell.Range("a1").Offset(1, 0).Activate
ActiveCell.Select
AdresseTexte1 = ActiveCell.Address(0, 0)
TexteReference = UCase(Range(AdresseTexte1))

For i = 1 To 5
q = q + 1
Cells.Find("Opérations").Select
ActiveCell.Range("a1").Offset(q, 0).Activate
AdresseTexte2 = ActiveCell.Address(0, 0)
TexteChercher = UCase(Range(AdresseTexte2))

If InStr(1, TexteReference, TexteChercher) Then
Cells.Find ("Affectation")
ActiveCell.Range("a1").Offset(1, 0).Activate
Range("K3") = TexteChercher

Next i

End Sub

Mais me voilà encore bloquer, je ne comprends pas pourquoi la valeur de la variable "TexteChercher" ne s'inscrit pas dans la cellule K3!

Est ce que quelqu'un peut m'éclairer et me dire pourquoi cela ne fonctionne t-il pas?

Je sens que je ne suis pas loin....

Merci beaucoup
0

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

Posez votre question
Je voulais vous dire un très grand merci car j'ai réussi avec succès à faire ce que je voulais avec le code suivant (pour les intéresser, donc sans le With):

Dim p As Integer
Dim q As Integer
Dim TexteReference As String
Dim TexteCherche As String
p = 0
q = 0

For j = 1 To 2
p = p + 1
Cells.Find("Exemple").Select
ActiveCell.Range("a1").Offset(p, 0).Activate
ActiveCell.Select
AdresseTexte1 = ActiveCell.Address(0, 0)
TexteReference = Range(AdresseTexte1)

For i = 1 To 5
'NombreDeLignesColonneOpérations
q = q + 1
Cells.Find("Opérations").Select
ActiveCell.Range("a1").Offset(q, 0).Activate
AdresseTexte2 = ActiveCell.Address(0, 0)
TexteChercher = Range(AdresseTexte2)

Cells.Find("Affectation").Select
ActiveCell.Range("a1").Offset(p, 0).Activate
Temps = InStr(1, TexteReference, TexteChercher, vbTextCompare)

If Temps <> 0 Then
ActiveCell.Value = TexteChercher
End If

Next i
q = 0
Next j

End Sub

Encore merci beaucoup pour votre aide :D

Bonne fin de journée à tous
0