Comparer des chaînes de caractères en VBA
Résolu
Hurborg
-
Hurborg -
Hurborg -
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 ;-):
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
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
A voir également:
- Vba comparer deux string
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Nombre de jours entre deux dates excel - Guide
- Deux whatsapp sur un téléphone - Guide
- Un ecouteur sur deux marche ✓ - Forum Audio
5 réponses
Bonjour,
un peu plus simple:
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
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
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
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
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
Bonjour à tous,
ou si les 2 chaines doivent être strictement égales :
Ajouter Ucase() sur les 2 chaines si il peut y avoir une différence de case.
eric
ou si les 2 chaines doivent être strictement égales :
If IAdressText = AdresseTexteChercher ThenOn 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
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:
Pourquoi le "." devant le range?
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?
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:
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
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
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):
Encore merci beaucoup pour votre aide :D
Bonne fin de journée à tous
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