Excel : problème de recherche sur un terme approximatif

Sined9612 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   -
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   Statut Modérateur Dernière intervention   2 761
 
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 14512 Date d'inscription   Statut Membre Dernière intervention   2 746
 
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   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   2 761
 
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 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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   Statut Modérateur Dernière intervention   2 761
 
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 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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   Statut Modérateur Dernière intervention   2 761
 
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