IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

A l'aide d'un mot clé, exécute une tâche


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Employé administratif
    Inscrit en
    Février 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé administratif

    Informations forums :
    Inscription : Février 2014
    Messages : 77
    Points : 28
    Points
    28
    Par défaut A l'aide d'un mot clé, exécute une tâche
    Bonjour,

    Prenons cet exemple :
    Sur la cellule A1, il a été saisi le texte « le lait équitable »
    Sur cette cellule active, je souhaiterais exécuter une tâche, si l'on y trouve le mot clé.
    En l’occurrence, ce mot clé est « lait », et s’il a bien ce mot clé, décale de 2 cellules vers la droite

    Comment rédiger cette syntaxe ? dans la macro ci-dessous, ça fonctionne seulement si le texte est lait, pas si la cellule contient la donnée « le lait équitable ». Je ne parviens pas modifier ce qui ne va pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub decal()
    If ActiveCell.Value2 = "lait" Then ActiveCell.Offset(0, 2).Select
    End Sub
    Merci pour votre aide.

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour,

    Tu sais que tu as des événements feuille qui te le lancerait automatiquement dès la validation ?
    eric

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je n'ai jamais essayé, mais, tu as peut-être une porte de sortie avec Like

    Ou bien avec quelque chose qui ressemblerait à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub portion()
       dim texte1 as string
       dim texte2 as string
       texte1 = "le lait équitable"
       texte2 = "lait"
       if instr (texte2, texte1) >0 then
          msgbox("Trouvé")
       else
          msgbox("Non rouvé")
       end if
    end sub

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Oula oui, j'ai répondu un peu vite...

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour
    BtjpsspgrW ne veut pas déceler la présence d'une sous-chaîne de caractères, mais celle d'un MOT (ce n'est pas pareil du tout).
    Je ne veux pas apporter dans cette "affaire", dont l'utilité dans un tableur me parait plutôt ludique, une aide au-delà de la description du mécanisme à mettre en place -->>
    - encadrement de la chaîne à traiter par des espaces
    - remplacement par un espace de tout caractère présent dans cette liste : ".,:-()!?"
    - forçage de la casse en majuscule
    - recherche (comme montré plus haut) de la valeur de instr(la-chaîne, " " & ucase(le_mot) & " ")

    Mon aide s'arrêtera là.

    PS : je n'ai pas voulu parler en plus d'autres aspects (pluriels, accords, etc...), puisque le message d'origine n'en parle pas non plus.

    Amusez-vous bien

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Employé administratif
    Inscrit en
    Février 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé administratif

    Informations forums :
    Inscription : Février 2014
    Messages : 77
    Points : 28
    Points
    28
    Par défaut détecter un mot clé dans cette cellule
    Bonjour,
    Je ne comprends pas bien les réponses apportées par les membres.
    Ce que je souhaite :
    Dans une base de données, sur la même colonne en décalant d’une cellule à chaque fois (boucle), je souhaiterais que VISUAL BASIC détecte si le mot clé est contenu dans cette cellule ou pas du tout. On peux trouver ce mot dans la barre de formule après peu de caractères, ou après un grande nombre de caractères.

    EXEMPLE :
    Cellule B2 = le lait équitable
    Cellule B3 = j’aime danser
    Cellule B4 = J’aime boire du lait
    Pour la cellule B2, le mot clé se trouve à partir du 4ème caractère. Pour la cellule B3, le mot clé ne se trouve pas. Pour la cellule B5, le mot clé se trouve à partir du 17ème caractère.

    J’ai essayé avec la syntaxe , mais ça ne fonctionne pas.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bonjour,

    Et qu'en serait-il d'une phrase du genre
    Il s'appelait Raymond

    Faut-il considérer ou non?
    Et qu'en est-il si lait est au pluriel, en majuscule,...?

    Prend le temps de lire le message de unparia (que je salue)

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Salut,

    Pour continuer sur les remarques de Jacques et Parmi...

    On parle du mot "lait"... Donc à encadrer par des espaces, sauf si en début de cellule (pas trop de sens en français mais il serait sage de préciser les cas possibles de façon exhaustive) ou en fin de cellule (suivi d'un des signes prévus par Jacques, ... ou pas!)

    Vu la complexité, j'envisagerais une expression régulière. Sur base d'exemples courants qu'il conviendrait que tu complètes quant aux cas autorisés et rejetés, voici une fonction (dont le pattern serait à adapter si tous les cas que tu prévois ne sont pas dedans), tu pourrais utiliser la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function TestWord(Content As String, Word As String) As Boolean
      Dim regexp As Object
      Dim Pattern As String
     
      Set regexp = CreateObject("VBScript.RegExp")
      regexp.IgnoreCase = True
      Pattern = "(^\(*[word][ ,;\?\.\)]+)|([ |\(][word][ ,;\?\.\)]+)|([ |\(][word][ \.,;?\)]*$)"
      Pattern = Replace(expression:=Pattern, Find:="[word]", Replace:=Word)
      regexp.Pattern = Pattern
      TestWord = regexp.Test(Content)
      Set regexp = Nothing
    End Function

    Nom : 20180824_6.png
Affichages : 216
Taille : 17,1 Ko

    Soyons clairs: je ne suis pas certain d'avoir envisagé tous les cas. Sur base d'une règle de gestion , on devrait probablement affiner/ajuster le pattern, qui semble peut-être ésotérique, mais qui en fait assez simple à disséquer...

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Re
    bonsoir a tous
    oui le regex peut etre interéssant
    @pierre on peut simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        MsgBox TestWord("huile:lait?carton; poire", "lait")
        MsgBox TestWord("il s'appelait trinita", "lait")
        MsgBox TestWord("il faut boire du lait pour grandir", "lait")
        MsgBox TestWord("j'aime la laitiere", "lait")
        MsgBox TestWord("lait et sucre sont necessaires pour la pate a crepe ", "lait")
        MsgBox TestWord("ce qui est bon dans le dejeuner c'est le lait", "lait")
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function TestWord(ByVal txt As String, ByVal Word As String) As Boolean
        Dim Txt2$
        With CreateObject("VBScript.RegExp")
            .Global = True: .IgnoreCase = True
            .Pattern = "[^\w]"    'pattern pour chopper tout les caracteres speciaux y compris les espaces (voir result dans debug )
            Txt2 = .Replace(" " & txt & " ", "|") 'remplacement de ces dit caracteres
            .Pattern = "\|" & Word & "\|" 'new pattern englobant le mot cherché entre caracteres distincts(choisir le caracteres que l'on veut pourvu qu'il soit distinguable de ceux de la chaine)
            TestWord = .test(Txt2) 'test retournant un booleen
            Debug.Print Txt2 & "    :" & TestWord 'verif dand debug(facultatif)
        End With
    End Function

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox TestWord("huile:étourdi?carton; poire", "étourdi")

  11. #11
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    J'appelle en outre l'attention sur l'existence de certains pièges.
    Le mot "grand-père", par exemple, est un mot à part entière et non deux mots.
    La recherche du mot "père" dans la phrase "j'ai rencontré mon grand-père au marché" ne doit en aucun cas retourner "vrai"
    "Vrai" doit par contre être retourné avec la phrase "Jean le grand - père de trois enfants - est connu des services administratifs"
    D'autres pièges existent.
    Amusez-vous bien (il pleut, ce week-end).

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par unparia Voir le message
    J'appelle en outre l'attention sur l'existence de certains pièges.
    Le mot "grand-père", par exemple, est un mot à part entière et non deux mots.
    La recherche du mot "père" dans la phrase "j'ai rencontré mon grand-père au marché" ne doit en aucun cas retourner "vrai"
    "Vrai" doit par contre être retourné avec la phrase "Jean le grand - père de trois enfants - est connu des services administratifs"
    D'autres pièges existent.
    Amusez-vous bien (il pleut, ce week-end).
    ca me parait impossible de demander au regex de dicerner cet exemple vba et regexpand ne possedent pas de dictionnaire
    on peut jouer avec l'espace en plus dans la separation mais ca c'est toi qui le code dans le pattern
    que se soit avec un regex ou like faire les deux test

    pour ma proposition de toute a l'heure j'ai trouver une parade mais c'est pa joli

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
        MsgBox TestWord("huile:étourdi?carton; poire", "étourdi")
        MsgBox TestWord("huile:lait?carton; poire", "lait")
        MsgBox TestWord("il s'appelait trinita", "lait")
        MsgBox TestWord("il faut boire du lait pour grandir", "lait")
        MsgBox TestWord("j'aime la laitiere", "lait")
        MsgBox TestWord("lait et sucre sont necessaires pour la pate a crepe ", "lait")
        MsgBox TestWord("ce qui est bon dans le dejeuner c'est le lait", "lait")
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function TestWord(ByVal txt As String, ByVal Word As String) As Boolean
        Dim Txt2$, word2$
        With CreateObject("VBScript.RegExp")
            .Global = True: .IgnoreCase = True
            .Pattern = Word
            Txt2 = .Replace(txt, String(10, "C"))
            .Pattern = "[^\w]"
            Txt2 = .Replace(" " & Txt2 & " ", "|")
            .Pattern = "\|" & String(10, "C") & "\|"
            TestWord = .test(Txt2)    '
            Debug.Print Txt2 & "    :" & TestWord
        End With
    End Function

  13. #13
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    pour ma proposition de toute a l'heure j'ai trouver une parade mais c'est pa joli
    Ce qui, tant dans le code bancale que dans celui de "correction", n'est pas "joli", c'est sans aucun doute le fait d'utiliser un camion de 20 tonnes (Regex) pour transporter une boîte d'allumettes.
    Je n'irai plus loin (et avec vraiment très peu de code) que si BtjpsspgrW nous exposait une raison vraiment sérieuse de sa démarche.

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    @Jacques,

    Je crois que tout le monde a bien compris les limites. La question n'est pas de réaliser la fonction qui envisage tous les cas possibles et imaginables, même les plus improbables, mais de répondre à la demande initiale dans les limites précises de sa formulation et en ayant en tête la finalité de l'opération.

    Il me semble donc qu'il revient au demandeur de préciser "son cahier des charges" et la finalité de la chose, que j'entrevois plus comme toi comme quelque chose de ludique), et notamment ce qui est considéré comme un mot.

    Citation Envoyé par unparia Voir le message
    [...]
    Le mot "grand-père", par exemple, est un mot à part entière et non deux mots.
    La recherche du mot "père" dans la phrase "j'ai rencontré mon grand-père au marché" ne doit en aucun cas retourner "vrai" [...]
    Il me semble assez évident que certaines règles doivent être respectées. Si on peut trouver "grand-père", ça devrait vouloir dire, au niveau des règles, qu'un mot ne peut pas être encadré par des tirets qui le collent, sinon, il serait impossible de déterminer si on doit considérer "grand-père" ou "grand" et "père" dans "bonjour-grand-père-merci" => retour aux règles qui doivent être énoncées clairement.

    @Patrick. J'étais parti au départ sur un découpage début|milieu|fin, mais en matière de regexp, je n'ai pas beaucoup de pratique, donc je fais sûrement un peu trop compliqué

  15. #15
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour à tous,

    Si on revenait au basique ? ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Compare Text
    Function motOk(phr As String, mot As String) As Boolean
        motOk = mot = phr Or InStr(phr, mot & " ") > 0 Or InStr(phr, " " & mot & " ") > 0 Or InStr(phr, " " & mot) > 0
    End Function
    Ou avec Like
    eric

    Edit : ajout de mot=phr

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub portion()
       Dim texte1 As String
       Dim texte2 As String
       texte1 = "le lait équitable"
       texte2 = "lait"
       MsgBox IsMidText(texte1, texte2)
     End Sub
    Function IsMidText(Txt As String, Cherche As String) As Boolean
    IsMidText = InStr("©" & Replace(Txt, " ", "©") & "©", "©" & Cherche & "©")
    End Function

  17. #17
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Et tant qu'on y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Compare Text
    Function motOk(phr As String, mot As String) As Boolean
        motOk = InStr(" " & phr & " "," " &  mot & " ")
    End Function
    eric

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour eriiic,
    Je n'avais pas vue ta réponse.

  19. #19
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Pas de mal, c'était une avancée avec plus qu'une seule comparaison.
    Et puis ça m'a inspiré la suivante ;-)

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour a tous

    @Patrick. J'étais parti au départ sur un découpage début|milieu|fin, mais en matière de regexp, je n'ai pas beaucoup de pratique, donc je fais sûrement un peu trop compliqué
    @Pierre
    moi non plus je metrise pas les subtilités d'un pattern aussi complexe que le tiens

    c'est ce pattern qui m'a rendu fou je serais incapable de savoir quel segment fait quoi

    pour pouvoir envisager toutes les possibilités
    1. replacer le mot reccherché avec une chaine distincte sans caracteres speciaux
    2. replacer tout les caracteres speciaux y compris les espaces par un caracteres special
    3. test de la chaine de replacement précédée et suivi du caracteres special de remplacement

    toutes les possibilités seront prises en compte
    @unparia
    pour le grand-pere et grand - pere
    le regex n'a pas de dictionnaire il ne sera jamais distinger si c'est un nom commun ou autre,le regex cherche une expression c'est tout

    il faut faire les deux tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pattern="(\s)" & word &"(\s)"
    .test(chaine)
    pattern="[^\w][^\w]" & word &"(\s)"
    .test(chaine)=true

Discussions similaires

  1. [1.x] Exécuter une tâche symfony dans un module
    Par arnauldl dans le forum Symfony
    Réponses: 2
    Dernier message: 11/08/2009, 14h09
  2. créer, supprimer, modifier et exécuter une tâche
    Par younes32 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 05/06/2009, 09h13
  3. Exécuter une tâche à heure précise ?
    Par [ZiP] dans le forum Débuter
    Réponses: 7
    Dernier message: 24/11/2008, 14h07
  4. Service windows exécutant une tâche périodique
    Par Nico_stras dans le forum C#
    Réponses: 13
    Dernier message: 06/03/2008, 08h46
  5. Exécuter une tâche planifiée avec cron
    Par Olivier Regnier dans le forum Administration système
    Réponses: 6
    Dernier message: 30/03/2007, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo