Excel : problème de recherche sur un terme approximatif

Sined9612 Messages postés 5 Statut Membre -  
pijaku Messages postés 13513 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

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Dans ta cellule Cell, il y a un ou plusieurs mots? Sont-ils tous séparés par un espace?
    0
  2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  3. Sined9612 Messages postés 5 Statut Membre
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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