Macro - Recherche via mot clé

Bonjour,

Voilà je viens vers vous car j’ai un petit problème concernant la recherche de mots via une macro.

En fait je colle tout mon texte dans la cellule A1 de la 2ème feuille (la mise en page est normale car cela vient de fichiers calculs) et le but serait de retrouver le matériau et la température afin de venir les inscrire dans les cellules respectives de la feuille 1.

J’ai repéré des mots clés comme « °C » (voir cellule A19) pour la température (c’est fou n’est-ce pas XD) et « material : » (voir cellule A29) du coup serait-il possible de faire en sorte que la macro cherche ses mots clés et vienne donc par magie recopier dans les cellules de la feuille 1 les valeurs suivantes :

• 64 pour la température

• 7010 T7451 pour le matériau

La macro devrait pouvoir ainsi marcher pour tout autre texte de n’importe quelle longueur qui possède ses mêmes mots clés évidemment.

En effectuant des recherches j’ai vu qu’il est possible d’utiliser find par exemple j’ai regardé dans l’aide d’excel et sur ce forum mais ayant des connaissances limités dans ce domaine je ne comprends pas toujours le code utilisé:/

Je vous remercie pour le temps que vous souhaiterai y consacrer ^^

75extraction.xlsm (9.64 Ko)

Bonsoir,

Si la présentation est toujours semblable, on peut bâtir quelque chose... Sinon, il faut avoir une idée des variantes possibles.

Cordialement.

Bonsoir,

Je sais que la structure du texte dans la feuille 3 est déplorable mais je n'y peux rien c'est comme ça que c'est copier et la structure sera toujours celle-ci car le texte vient d'un PDF et la conversion en Excel n'est pas possible.

Du coup si ce n'est pas possible avec une structuration comme celle-ci je vais devoir le traiter autrement ou abandonner cette idée.

Ce que je demande c'est si les mentions qu'on trouve sont stables, en particulier ciblons :

Temperature, écrit ainsi (avec majuscule initiale et sans caractère accentué)

material : (en minuscules, suivi de espace et deux-points)

Oui tout à fait, c'est écrit ainsi pour tous les autres cas

Je te propose une procédure sous forme de fonction personnalisée.

Un fonction personnalisée s'utilise de la même façon que les fonctions intégrées d'Excel.

Function EXTRACMATTEMP(plg As Range, mt As String)
    Dim c As Range, MaT$, TM, i%
    Application.Volatile False
    If LCase(mt) = "m" Then
        MaT = "*material :"
    ElseIf LCase(mt) = "t" Then
        MaT = "Temperature*"
    Else
        Exit Function
    End If
    For Each c In plg
        If c.Value Like MaT Then
            If LCase(mt) = "m" Then
                EXTRACMATTEMP = Replace(c.Offset(1), ".", "")
            ElseIf LCase(mt) = "t" Then
                TM = Split(c.Value)
                For i = UBound(TM) To 0 Step -1
                    If IsNumeric(Mid(TM(i), 1, 1)) Then
                        EXTRACMATTEMP = Val(TM(i))
                        Exit For
                    End If
                Next i
            End If
            Exit For
        End If
    Next c
End Function

La fonction fait les deux recherches, on lui fournit la plage dans laquelle chercher en 1er argument, et en 2e argument on indique "m" si on cherche le matériau, ou "t" si on cherche la température.

Il m'a semblé inutile que la fonction se recalcule lors des recalculs (elle se calcule donc uniquement lorsqu'on la lance)...

Cordialement.

Bonsoir,

Merci beaucoup c'est parfait ^^

Par contre j'ai quelques questions au sujet de ton code, j'ai essayé de trouver les réponses sur le forum ou sur internet mais je n'ai pas trouvé :/

1) Je n'ai pas très bien compris cette ligne pour l'utilisation de l'offset je sais que ça va remplacer les points par "" donc par rien

EXTRACMATTEMP = Replace(c.Offset(1), ".", "")

2) Si j'ai bien compris on va stocker dans un tableau via split et comme on cherche la température qui est un chiffre ca va nous le ressortir et extraire la partie que l'on souhaite via Mid mais je ne vois pas à quoi peut servir ce qui est après Mid notamment pourquoi 1,1

If IsNumeric([b]Mid(TM(i), 1, 1[/b])) Then
   EXTRACMATTEMP = Val(TM(i))
   Exit For
End If

3) Les petites étoiles (*) servent à savoir si il faut chercher avant ou après le mot sélectionné ?

MaT = "*material :"

4) Les % et $ c'est pour respectivement integer et string ? je suppose que c'est un raccourci pour le code

5) Admettons que certains documents que je vais copier dans le fichier excel aient une autre structure comme par exemple Material : Nom du materiau sachant qu'avant ils étaient sur 2 lignes distinctes (comme dans l'exemple que tu as traité) ou qu'il faille chercher d'autres mentions je suppose qu'il doit être possible de rajouter ses choix via des Elseif à la suite de la première partie du code comme ci-dessous non ?

If LCase(mt) = "m" Then
        MaT = "*material :"
    ElseIf LCase(mt) = "t" Then
        MaT = "Temperature*"
    ElseIf Rajouter autre mot recherché
    Else
        Exit Function
    End If

Cordialement

Bonsoir,

1) Le nom du matériau se termine par un point (marquant une fin de phrase même si elle se trouve éclatée sur plusieurs lignes).

On l'enlève donc. Si toutefois il n'y était pas, on n'enlèvera rien...

2) Trouvé la ligne température, on en met effectivement les mots en tableau (séparateur par défaut : espace). On teste l'élément dont le premier caractère sera numérique (en commençant par la fin, parce qu'on sait qu'il est plus près de la fin). Identifié, la fonction Val permet d'en renvoyer la partie numérique (qui correspond donc à la température cherchée) en laissant de côté les caractères qui suivent.

3) Like est un opérateur de comparaison de chaînes. Il permet de comparer une chaîne-texte modèle. Le modèle permet d'utiliser des caractères génériques : * => 1 ou plusieurs caractères quelconques ou aucun ; ?=> 1 caractère quelconque (un seul) ; #=> un chiffre. La construction du modèle offre aussi d'autres possibilités : on peut y inclure la possibilité de caractères alternatifs, une suite de caractères entre crochets indiquera qu'à cette position peuvent figurer l'un des caractères de la suite entre crochets.

Exemple de modèle : "[01]#:[0-5]#" qui indique que tu cherches une chaîne de 5 caractère signifiant une heure (le tiret indique que tous les caractères inclus entre les bornes sont inclus : tous les chiffres de 0 à 5 ; de même [a-z] signifierait toute lettres minuscule).

Ici tu ne reconnais que des horaires inférieurs à 20:00. Pour inclure toutes les valeurs horaires, il faudrait un modèle : "2[0-3]:[0-5]#", la comparaison recherchant l'adéquation à l'un ou l'autre.

On a encore quelques autres possibilités de constructions de modèles : le problème est toujours d'en construire un qui permet de reconnaître ce qu'on cherche en y incluant les diverses variantes connues, en éliminant les cas où l'on pourrait obtenir une raconnaissance à tort.

4) Ce sont ce que l'on appelle des caractères de déclarations de type. Il en existe quelques-uns dont la signification est :

$ = As String

% = As Integer

& = As Long

! = As Single

# = As Double

@ = As Currency

Cela permet de raccourcir un peu les déclarations de variables.

5) Le bout de code cité est simplement un test ramenant le second argument de la fonction saisi (t ou m) à une minuscule, de façon à pouvoir accepter les saisies : t ou T et m ou M.

Pour ce qui est des variations que l'on pourrait constater, on pourra, dès lors qu'on les connait, ajuster les tests de comparaisons.

Par exemple si material peut être trouvé avec un M et si l'espace avant le : peut ne pas exister, on pourra ajuster le modèle de comparaison ainsi : "*[Mm]aterial*:"

Si le nom du materiau peut se trouver sur la même ligne, il faudra encore ajouter une * à la fin. Et il faudra un test d'extraction...

N'étant pas partis avec un échantillon des variantes possibles, il faudra corriger au fur et à mesure...

Cordialement.

Rechercher des sujets similaires à "macro recherche via mot cle"