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 :

Interpréter une string comme une formule dans VBA (pas cellule Excel) [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut Interpréter une string comme une formule dans VBA (pas cellule Excel)
    Bonjour à tous,

    Dans le cadre d'une petite explication des tests logiques que l'on peut réaliser sur VBA, je me suis retrouvé à vouloir transformer une string (entrée par l'utilisateur) en formule, mais je n'y arrive pas.

    J'ai essayé à l'aide de la fonction Evaluate, celle-ci fonctionne pour les tests de type "1>2" mais pas pour tout ce qui est plus sophistiqué, du type IsNumeric ou not 1>2.

    Extrait me posant problème (Le blabla je l'ai écrit à la volée et rapidement, ne pas en tenir compte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim Réponse As Variant
    Dim Résultat as string
     
    Do
        Réponse = InputBox("Entrez votre test logique tel que vous l'écririez dans VBA : " & vbNewLine & vbNewLine _
                    & "Exemples d'opérateurs : " & vbNewLine _
                    & "<, <=, =, >=, > : Comparaisons numériques" & vbNewLine _
                    & "IsNumeric(""Texte"") : Vérifie si le texte est une valeur numérique" & vbNewLine _
                    & "IsDate(""Texte"") : idem pour une date " & vbNewLine _
                    & "IsEmpty,IsMissing,IsNull,IsObject,IsError,IsArray, Is Nothing" & vbNewLine _
                    & """Texte1"" Like ""*Texte2*"" : Vérifie si le texte1 ressemble au texte2" & vbNewLine _
                    & "..." & vbNewLine & vbNewLine _
                    & "Ces tests peuvent être multiples à l'aide de And / Or " & vbNewLine & vbNewLine _
                    & "Pour tester l'inverse, commencer par Not   Exemple : ""Not 5>2""", "Tests logiques", Réponse)
     
        If Not IsError(Evaluate(Réponse)) Then Résultat = Réponse & " = " & Evaluate(Réponse) Else Résultat = "Le test logique """ & Réponse & """ ne fonctionne pas..."
        Debug.Print Evaluate(Réponse)
        If MsgBox(Résultat & vbNewLine & vbNewLine & "Recommencer ?", vbYesNo) = vbNo Then Exit Do
    Loop
    Avez-vous une idée de comment faire ?
    Honnêtement, j'ai cherché mais les résultats sont super divers en cherchant par "turn string into formula" ou autre sur google par exemple.

    Merci d'avance !

    Quentin.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 889
    Points
    28 889
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Peut-être que la lecture de ces deux billets dont le sujet traite de cette question t'apportera plus d'éclaircissement Ecrire une formule dans Excel à l'aide d'une procédure VBA et la suite Ecrire une formule dans Excel à l'aide d'une procédure VBA (Part 2)

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Merci Philippe pour cette info, mais ce n'est pas mon problème

    En fait, je sais écrire une formule que ce soit dans une cellule Excel, dans VBA, etc.

    Ma question porte sur le fait que j'aimerais que l'utilisateur entre, via une InputBox, un test logique, du style :

    "Nom.prénom@gmail.com" like "*@*.*" et que cela lui renvoie le résultat (donc "Vrai" dans cet exemple)

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MsgBox "Nom.Prénom@gmail.com" like "*@*.*" ' Le message affiché est "Vrai"
     
    'Cependant j'aimerais que la formule provienne d'une string écrite par l'utilisateur
    Formule = """Nom.Prénom@gmail.com"" like ""*@*.*""" 'Disons que cette string provienne d'une inputbox
     
    MsgBox FONCTIONEXCELRECHERCHEE(Formule) 'Ce que je souhaite obtenir ici est "Vrai" car je souhaite une analyse de la formule contenue dans la string... Je ne sais pas si c'est clair
    Essayez par vous-même dans l'extrait que j'ai écrit dans le message d'origine, la fonction Evaluate("1>2") me donne bien "Faux", mais Evaluate("IsNumeric(1)") me retourne une erreur...

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 889
    Points
    28 889
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Essayez par vous-même dans l'extrait que j'ai écrit dans le message d'origine, la fonction Evaluate("1>2") me donne bien "Faux", mais Evaluate("IsNumeric(1)") me retourne une erreur...
    La fonction Evaluate ne peut évaluer que des fonctions d'excel or IsNumeric est une fonction de VBA.
    En revanche ISNUMBER (ESTNUM) est bien une fonction d'Excel et cela fonctionne donc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox (Evaluate("=ISNUMBER(1)"))

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Bonsoir,

    Merci beaucoup, cela m'éclaire pas mal ! J'avais cru comprendre ça mais j'avais essayé avec les formules en français et non en anglais (EstNum(X) par exemple...).

    Savez-vous s'il existe donc une autre formule permettant d'obtenir ce dont j'ai besoin ?

    À savoir transformer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNumeric(5) then ...
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim VariableFormule as String
    VariableFormule = "IsNumeric(5)"
    'ou VariableFormule = """Exemple de texte" like ""*de*"""
    'ou VariableFormule = "Not ActiveCell.Interior.Color = vbRed and ActiveCell.Value > 4"...
    'ou toute formule que je pourrais écrire dans le code, en me détachant d'une formule de cellule Excel.
     
    If VariableFormule then ...
    En exagérant un peu, ce que je recherche est du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CInt(string)
    CDate(string)
    CSng(String)
    CStr(XXX)...
    MSDN

    J'imagine qu'une solution doit exister

    Merci d'avance !

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 889
    Points
    28 889
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour savoir en excel et à l'aide d'une fonction si c'est un nombre, un texte, un booléen, voir les formules de la catégorie Information et CDate ,n'a pas d'équivalent en Excel puisqu'une date est un nombre formaté.
    Pour connaître la manière de créer une formule en VBA je renvoie vers ces deux billets (liens déjà donné plus haut) Ecrire une formule dans Excel à l'aide d'une procédure VBA et la suite Ecrire une formule dans Excel à l'aide d'une procédure VBA (Part 2)

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Merci Philippe,

    Cependant, cela ne répond pas à ma question, je souhaite de me débarrasser des cellules Excel, je parle uniquement de VBA et de tests logiques (ou toute autre formule).

    Mon objectif : un simulateur de tests logiques pour débutants. Imaginons les tests suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "Nom.Prénom@gmail.com" like "*@*.*" '-> retour du test logique : True
    Ucase("bonjour") = "BONJOUR" '-> retour du test logique : True
    '...
    Une zone de texte dans une InputBox ou UserForm permet à l'utilisateur d'écrire une formule, un test logique, exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringTestLogique=InputBox("Entrez votre test logique, par exemple "Nom.Prénom@gmail.com" like "*@*.*"")
    'On obtiendra donc une string qui s'appelle StringTestLogique et qui contiendra le test que l'utilisateur aura écrit.
    'Seulement, mon besoin est que cette string puisse être lue par VBA, comme si l'utilisateur l'avait écrite dans le code.
    'par exemple, j'aurais besoin du même résultat pour :
    'Classique
    If "Nom.Prénom@gmail.com" like "*@*.*" then MsgBox "Test réussi !"
    'Recherché
    If StringTestLogique then MsgBox "Test réussi !" 
    'Qui devrait, j'imagine, ressembler à :
    If X(StringTestLogique) then MsgBox "Test réussi !" 'Avec X(string) la fonction nécessaire...
    C'est pourquoi je pensais aux fonctions de conversion CDate, CStr... L'ordinateur comprend que cette string est une date, moi j'aimerais qu'il comprenne que c'est une formule VBA (Oubliez la notion de cellule Excel...)

    Ces billets sur les fonctions Excel sont très instructifs mais ne correspondent pas à ce que je recherche.

    Merci

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 110
    Points : 9 919
    Points
    9 919
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici la mécanique à adopter

    bon courage pour :

    - intégrer tous les opérateurs
    - prévoir chaque type de données possibles
    - gérer correctement les erreurs possibles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Option Compare Text
     
    Sub oo()
    Dim TabTest
    Dim TabOp()
    Dim Ok As Boolean
    Dim Spliter As String
     
    Spliter = "/"
    stringtestlogique = InputBox("Entrez votre test logique, par exemple >> Nom.Prénom@gmail.com" & Spliter & "like" & Spliter & "*@*.*")
    If stringtestlogique = "" Then Exit Sub
    If InStr(stringtestlogique, Spliter) <> 2 Then Exit Sub
     
    TabOp = Array("like", "=")
    TabTest = Split(stringtestlogique, Spliter)
     
    For i = LBound(TabOp) To UBound(TabOp)
        If TabTest(1) = TabOp(i) Then
            Select Case i
                Case 0
                    If TabTest(0) Like TabTest(2) Then Ok = True
                    Exit For
                Case 1
                    If TabTest(0) = TabTest(2) Then Ok = True
                    Exit For
            End Select
        End If
    Next i
     
    If Ok Then
        MsgBox "Test réussi !"
    Else
        MsgBox "Test échoué !"
    End If
     
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Bonjour Joe,

    Merci pour ce message, c'est un peu ce que je voulais éviter J'avais pensé à une telle solution mais je me demandais VBA intégrait ceci sous forme de fonction ou autre... !
    Je pense plutôt faire un UserForm du coup avec des ComboBox ou ListBox pour tout prévoir, ce sera beaucoup plus simple que d'analyser toutes les strings possibles...

    Si j'arrive à faire quelque chose, je le partagerai au cas où ça intéresserait d'autres personnes plus tard !

    Merci encore à vous deux pour vos réponses, si quelqu'un a une solution plus accessibles, je serai toujours preneur.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 889
    Points
    28 889
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Cependant, cela ne répond pas à ma question, je souhaite de me débarrasser des cellules Excel, je parle uniquement de VBA et de tests logiques (ou toute autre formule).
    Mon erreur d'interprétation provient tout simplement au fait que tu as utilisé la fonction Evaluate dans ta question.
    bon courage pour :
    - intégrer tous les opérateurs
    - prévoir chaque type de données possibles
    - gérer correctement les erreurs possibles
    Je suis du même avis que Joe

  11. #11
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 110
    Points : 9 919
    Points
    9 919
    Billets dans le blog
    5
    Par défaut
    J'utilise déjà un userform pour ce type de chose, c'est beaucoup plus simple à développer et gérer

    il permet à l'utilisateur de construire une requête dans une pseudo BDD hébergée sous Excel ... sur un modèle similaire au paramétrage d'une requête sous BO

    n'hésite pas à poster ton projet quand il te semblera opérationnel, j'y jetterai un oeil

  12. #12
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Et avec des expressions régulières ?
    Je ne maîtrise pas trop le sujet mais pour l'adresse mail ça pourrait donner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Sub Test()
     
        Dim ExpRatio
        Dim Texte As String
     
        Texte = "Nom.Prénom@gmail.com" 'ou InputBox !
     
        Set ExpRatio = CreateObject("VBScript.RegExp")
     
        ExpRatio.Pattern = "([a-z][\w\.\-]*)(@)(\w+)\.(\w+)"
     
        If ExpRatio.Execute(Texte).Count = 0 Then
     
            MsgBox "Ceci est une adresse mail valide !"
     
        Else
     
            MsgBox "Ceci n'est pas une adresse mail valide !"
     
        End If
     
    End Sub
    Hervé.

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,

    je t'aurais bien proposé d'utiliser un objet ScriptControl voir Comment interpreter une chaine string ?

    après avoir activer la référence : Microsoft Script Control

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub Test()
     Dim oScript As New ScriptControl
     oScript.Language = "VBScript"
     
     Dim formule As String
     
     formule = "IsNumeric(""12"")"
     
    '----------------------  Par exemple avec Execute Statement
     oScript.ExecuteStatement "MsgBox " & formule
     
     '--------------------Autre option avec eval
     MsgBox oScript.Eval(formule), vbCritical, "Avec EVAL"
     
     '------------------- ou encore en créant une Sub
     Dim stCode As String
     
     stCode = "Sub MonCode" & vbCrLf & _
                 "Msgbox " & formule & ",,""MonCode""" & vbCrLf & _
              "End sub"
     
     oScript.AddCode stCode
     
     oScript.Run "MonCode"
     
     
     
     
     
    End Sub
    le hic ... c'est que VBScript ne connait pas l’opérateur "Like"...




  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Merci à vous deux, vos réponses sont franchement intéressantes, je ne connaissais pas cette méthode
    Je vais y jeter un oeil, ça m'a l'air assez prometteur !

    Je continue quoi qu'il en soit mon petit UserForm :p

    Quentin

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Bonsoir à tous,

    Je me suis un peu penché sur le sujet dès que j'avais un peu de temps libre aujourd'hui et j'ai un premier jet : Pièce jointe 177337...

    Le code n'est pas super structuré, j'ai fait ça sans savoir comment le faire et je pense que je pourrais faire l'équivalent plus simplement maintenant, mais je le partage quand-même

    Je ne suis pas certain que je l'optimiserai à fond, je pense avoir réussi à répondre à ma problématique pour l'instant...

    Merci à tous pour votre aide !

    PS : je sais que tous les opérateurs de test ne sont pas prévus, j'ai mis ceux auxquels j'ai pensé pour essayer...
    PPS : Le fichier ne possède pas de macro Workbook_Open() , pour info

    Quentin


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. [XL-2010] Recherche dans une matrice avec doublons (formule ou VBA)
    Par Lucorah dans le forum Excel
    Réponses: 7
    Dernier message: 07/05/2012, 17h16
  3. Interpreter une string comme une méthode
    Par katarnos dans le forum Langage
    Réponses: 7
    Dernier message: 05/08/2010, 10h50
  4. [XL-2002] Problème de syntaxe sur une formule dans VBA
    Par beber_le_stagiaire dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/06/2009, 15h32
  5. [C#] Comment Splitter une string avec une string ?
    Par ADJ Design dans le forum C#
    Réponses: 12
    Dernier message: 27/07/2006, 12h10

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