Améliorer ma macro de reconnaissance de texte

NicolasM

XLDnaute Nouveau
Bonjour,

Je suis un novice en VBA et j'ai essayé avec mes maigres connaissances de catégoriser une chaîne de caractères. Le fichier est en pièce jointe, et comprend deux colonnes :

  • colonne A : chaine de caractères comprenant le mot à identifier
  • colonne C : à remplir avec la catégorie

La liste des catégories doit être stockée dans le code VBA. J'ai 40 catégories différentes et environ 5 mots-clés par catégorie.

J'ai pour l'instant réussi avec deux macros différentes utilisant instr : (exemples avec deux catégories, 3 mots par catégorie) :

Macro 1 : les mots-clés servant à catégoriser sont séparés par "or" :

Code:
Sub macro1()

Range("A1").Select

Do While ActiveCell.Value <> ""

If InStr(1, ActiveCell, "tomate", 1) Or InStr(1, ActiveCell, "fruit", 1) Or InStr(1, ActiveCell, "poire", 1) Then
        ActiveCell.Offset(0, 2).Value = "Fruits"

ElseIf InStr(1, ActiveCell, "camion", 1) Or InStr(1, ActiveCell, "moto", 1) Or InStr(1, ActiveCell, "voiture", 1) Then
        ActiveCell.Offset(0, 2).Value = "Véhicule"
        
End If

ActiveCell.Offset(1, 0).Select

Loop

End Sub

Macro 2 : les mots-clés servant à catégoriser sont "stockés" dans une variable (en utilisant Array) :

Code:
Sub macro2()

Range("A1").Select
Fruits = Array("tomate", "poire", "fruit")
véhicule = Array("moto", "voiture", "camion")

Do While ActiveCell.Value <> ""
        okay1 = 0
        For i = LBound(Fruits) To UBound(Fruits)
            If InStr(1, ActiveCell, Fruits(i), 1) >= 1 Then
                okay1 = 1
            End If
        Next
        If okay1 = 1 Then ActiveCell.Offset(0, 2).Value = "Fruits"
ActiveCell.Offset(1, 0).Select
Loop

Range("A1").Select

Do While ActiveCell.Value <> ""
        okay2 = 0
        For i = LBound(véhicule) To UBound(véhicule)
            If InStr(1, ActiveCell, véhicule(i), 1) >= 1 Then
                okay2 = 1
            End If
        Next
        If okay2 = 1 Then ActiveCell.Offset(0, 2).Value = "Véhicule"
ActiveCell.Offset(1, 0).Select
Loop

End Sub

L'utilisation de Array me simplifie un peu la tâche car j'ai beaucoup de mots-clés, cependant je dois créer une boucle par catégorie + une variable différente à chaque fois (okay1, okay2).

Pouvez-vous svp m'aider à simplifier ce code (en utilisant par exemple une matrice ?) ? Je n'ai pas (encore :p ) les connaissances nécessaires pour le faire, mais serait ravi d'apprendre.

Merci beaucoup pour votre aide,
Nico
 

Pièces jointes

  • exemple.xlsx
    9.7 KB · Affichages: 60
  • exemple.xlsx
    9.7 KB · Affichages: 84
  • exemple.xlsx
    9.7 KB · Affichages: 78

Orodreth

XLDnaute Impliqué
Re : Améliorer ma macro de reconnaissance de texte

Bonjour,

A ta place, plutôt que des tableaux (compliqués, lourds, et pas forcément très lisibles), je partirais plutôt sur une gestion objet de ton problème.

Petit tutoriel du monde objet en vba:
Pierre Fauconnier sur DVP: Classes personnalises en VB(A)

Avec les objets, plutôt que des tableaux, tu peux utiliser des "Collections".
En gros, ce sont des listes d'objets, ton objet pouvant être défini à ta guise.
Ce lien n'existe plus
Tutoriel de microsoft sur la notion de "Collection" en VBA.

Si tu veux des exemples plus directs sur la notion d'objets, regarde mon code (classeur posté
https://www.excel-downloads.com/threads/resolu-vba-poo-collections-et-ihm.202386/ )

Ca devrait te donner des pistes sympas pour travailler ton code.

Si t'as des questions, hésite pas les mp aussi (me concernant en tout cas).

Cordialement,
Orodreth
 

NicolasM

XLDnaute Nouveau
Re : Améliorer ma macro de reconnaissance de texte

Hello Orodreth,

Merci pour les liens & conseils. La bibliographie est assez conséquente (j'en suis au III du cours de PF.), je te ferai un retour lorsque j'aurais tout lu :)

Si quelqu'un a une solution plus opérationnelle en attendant pour traiter ce problème en particulier, je suis preneur.

Nico
 

Discussions similaires

Réponses
25
Affichages
841

Statistiques des forums

Discussions
312 209
Messages
2 086 267
Membres
103 168
dernier inscrit
isidore33