Excel : problème de recherche sur un terme approximatif

Fermé
Sined9612 Messages postés 5 Date d'inscription lundi 22 septembre 2014 Statut Membre Dernière intervention 23 septembre 2014 - Modifié par pijaku le 23/09/2014 à 15:14
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 26 sept. 2014 à 07:54
Bonjour,

Je cherche à mettre en majuscule certains mots d'une plage de données.
J'ai réussi à faire, mais j'ai un petit souci au niveau de l'écriture :

Le code est le suivant :
Pour chaque cellule de la plage de cellules traitées
 Var = Cell.Value
 Var = Replace(Var, "poisson", UCase("poisson"))
 var =replace(var,"viande",Ucase("viande"))
 cell.value=var


J'ai pris l'exemple où tous les termes poisson et viande de ma plage de cellules seront mis automatiquement en majuscules.
Mon problème est que si une cellule contient poissons, ma macro l'ignorera.
Y a t'il possibilité dans ma macro de gérer les pluriels où les accents dans ma fonction replace.

Merci de votre réponse
Cordialement
A voir également:

3 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
23 sept. 2014 à 15:14
Bonjour,

Dans ta cellule Cell, il y a un ou plusieurs mots? Sont-ils tous séparés par un espace?
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
23 sept. 2014 à 15:16
Bonjour

La seule possibilté est me semble-t-il de lister tous les cas possibles

Le faire dans une colonne dans une autre feuille (par ex colonne A feuille2) en faisant précéder les pluriels : mettre par exemple en A1 poissons puis en A2 poisson, en A3 chèvres, en A4 chèvre , en A5 chevres, en A6 chevre etc

remplacer dans la macro les 2 lignes avec Replace par celles ci :

For n = 1 To 10 ' pour 10 possibilités, à adapter
Var = Replace(Var, Sheets("Feuil2").Range("A" & n), UCase(Sheets("Feuil2").Range("A" & n)))
Next


Pour intégrer de nouveaux mots il suffit de modifier la liste en feuille 2 (et éventuellement de rallonger la boucle For)

Cdlmnt
0
Sined9612 Messages postés 5 Date d'inscription lundi 22 septembre 2014 Statut Membre Dernière intervention 23 septembre 2014
23 sept. 2014 à 16:07
il y a plusieurs mots par cellule et ils sont séparés par un pipe, car c'est une extraction d'un logiciel externe.
Merci en tout cas de vos retours

Cdlt
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
25 sept. 2014 à 16:44
Bonjour,

J'avais oublié ce sujet...
Alors pourquoi faire simple lorsque l'on peut faire compliqué :

Sub test()
Dim i As Integer, j As Integer, Nb As Integer, ContenuCorrige As String

For i = 1 To 4 'lignes de 1 à 4
  Nb = CInt(Len(Cells(i, 1).Value) - Len(Replace(Cells(i, 1), "|", "")))
  ContenuCorrige = ""
  For j = 0 To Nb
    ContenuCorrige = ContenuCorrige & MaFonction(CStr(Split(Cells(i, 1).Value, " |")(j))) & " |"
  Next j
  Cells(i, 2) = Left(ContenuCorrige, Len(ContenuCorrige) - 2)
Next i
End Sub

Function MaFonction(Mot As String) As String
Select Case True
    Case Mot Like "*viande*"
        MaFonction = UCase(Mot)
    Case Mot Like "*ch*vre*"
        MaFonction = UCase(Mot)
    Case Mot Like "*poisson*"
        MaFonction = UCase(Mot)
    Case Else
        MaFonction = Mot
End Select
End Function
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
Modifié par eriiic le 25/09/2014 à 19:42
Bonjour à tous,

Juste un petit détail pijaku.
Peut-être Case Mot Like "*ch?vre*" au cas où...

Et tant que j'y suis j'aurais mis le split dans une variable au début de la boucle pour éviter d'avoir à le faire x fois. En plus on récupère l'index de fin de boucle avec le ubound().
Ca fait toujours ça de travail en moins sur les chaines si jamais c'est un très grand tableau.
Sub test()
    Dim i As Integer, j As Integer, Nb As Integer
    Dim tablMots
    For i = 1 To 4    'lignes de 1 à 4
        tablMots = Split(Cells(i, 1).Value, "|")
        For j = 0 To UBound(tablMots)
            tablMots(j) = MaFonction(tablMots(j))
        Next j
        Cells(i, 2) = Join(tablMots, "|")
    Next i
End Sub

Function MaFonction(ByVal Mot As String) As String
    Select Case True
    Case Mot Like "*viande*"
        MaFonction = UCase(Mot)
    Case Mot Like "*ch?vre*"
        MaFonction = UCase(Mot)
    Case Mot Like "*poisson*"
        MaFonction = UCase(Mot)
    Case Else
        MaFonction = Mot
    End Select
End Function


C'est juste pour m'occuper un peu parce qu'il n'y a pas grand chose sur le forum. Je ne veux pas passer pour le chiant... ;-)
eric
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
25 sept. 2014 à 19:51
Salut Eriiic,
Tu as entièrement raison.
ch*vre est probablement source d'erreur (chanvre par exemple serait accepté), ch?vre* l'est beaucoup moins...
Idem pour le Split avant boucle...

En revenant sur ce sujet, je me pose une question... Donc je te la pose...
N'y a t'il pas moyen de limiter le nombre de caractères lorsqu'on utilise le caractère *?
Dans le cas qui nous intéresse,
ch?vre*
autorise chevrettes par exemple. (je sais l'exemple n'est pas top)... Ne peut on pas empêcher cela en restreignant à une seule lettre supplémentaire, sans en faire toute une fonction supplémentaire?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
25 sept. 2014 à 20:27
Pour un seul caractère le joker c'est ?
Après pour plus de possibilité c'est les regex, mais plus abscon... J'suis encore un peu étanche à ces trucs ;-)

eric
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
26 sept. 2014 à 07:54
Salut,

C'est un peu dans l'esprit des regex que je pensais pouvoir trouver une solution...
Dans le style : "ch?vr*{1, 2}" ou seraient donc acceptées tous les mots correspondants avec 1 ou 2 lettres après "vr"...
Mais bon, on ne peut pas gagner à tous les coups.
C'est donc foutu sans regex...

Bonne journée à toi.

ps : n'hésite pas à passer sur tous mes sujets, tu y seras toujours le bienvenu. Deux têtes valent mieux qu'une.
0