[Catégorie modifiée VB6 -> VBA] convertir du texte sous excel en formule vba [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
27 septembre 2011
-
Messages postés
5
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
27 septembre 2011
-
Bonjour à tous,
je souhaiterai pouvoir récupérer une formule rentrée dans une cellule d'excel au format texte par l'utilisateur et la convertir en formule utilisable sous vba d'excel avec reconnaissance des différentes variables du programme.

exemple:
j'ai 3 variables A, B et C (issues d'un gros tableau) définies sous vba. Avant de lancer le programme, l’opérateur pourra rentrer dans les cellules A1:toto, A2:A/B (formule définissant toto, sans le =), B1:tata et B2:C/toto-1.

Je ne souhaite pas que les valeurs de toto et tata apparaissent sous excel mais qu'elles soient calculées sous vba donc que les formules soient utilisables sous vba (recherche d'une fonction qui permettrait à vba de comprendre que les textes en A2 et B2 sont des formules avec des variables intégrées).

Ça parait tout bête, mais je n'ai rien trouvé sur le net pour résoudre mon problème.
C'est pour ça que je me tourne vers vous en espérant que quelqu'un ait une solution.

Merci d'avance
Tof

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Oui, il doit y avoir ce genre de fonction évoluée.
Mais pour te prouver qu'on peut y arriver avec ma solution, voilà une fonction à coller dans un Module :
Public Function maFonction(x As Single, _
                           y As Single, _
                           z As Single, _
                           FonctionRange As Range) As Single
    Dim oSheetTemp  As Worksheet
    Dim bFound      As Boolean
    Dim OutRange    As Range
    Dim sFonction   As String
    
    bFound = False
    For Each oSheetTemp In Worksheets
        If oSheetTemp.Name = "Feuille cachée" Then
            bFound = True
            Exit For
        End If
    Next
    If Not bFound Then
        Set oSheetTemp = Nothing
        Set oSheetTemp = Worksheets.Add
        oSheetTemp.Name = "Feuille cachée"
        oSheetTemp.Visible = xlSheetHidden
    End If
    
    With oSheetTemp
        ' Il ne faut pas rencontrer de X, Y ou Z dans le nom de ces nouvelles cellules
        .Names.Add Name:="mA", RefersToR1C1:="=R1C1"
        .Names.Add Name:="mB", RefersToR1C1:="=R1C2"
        .Names.Add Name:="mC", RefersToR1C1:="=R1C3"
        
        .Range("mA").Value = x
        .Range("mB").Value = y
        .Range("mC").Value = z
        
        sFonction = FonctionRange.Text
        ' Tu noteras les espaces devant et derrière pour ne pas avoir de souci
        sFonction = Replace(sFonction, "x", " mA ", , , vbTextCompare)
        sFonction = Replace(sFonction, "y", " mB ", , , vbTextCompare)
        sFonction = Replace(sFonction, "z", " mC ", , , vbTextCompare)
        
        Set OutRange = .Range("D1")
        OutRange.FormulaR1C1 = "=" & sFonction
        maFonction = OutRange.Value
        
    End With
End Function
Et pour appeler cette fonction, il suffit de fournir les 3 valeurs x, y et z ainsi que le Range où se trouve la formule, exemple :
MsgBox maFonction(32, 8, 3, ActiveSheet.range("A1"))

Pas certain que cette astuce soit très économe en temps machine, mais elle fonctionne. Je pense qu'il faudra penser à stopper le calcul automatique des cellules pendant l'exécution.
Messages postés
5
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
27 septembre 2011

Merci Jack d'avoir pris le temps de me repondre.
Avant de poster mon message, j'avais testé la fonction "evaluate" mais qui ne marche qu'avec des strings et du coup je l'avais abandonné.
En regardant ce que faisait ton code (surtout quand tu effectues les "replace"), j'y ai repensé et j'ai testé ça qui marche bien aussi

Sub total()
    '
    ' tableau d'entrees
    Dim tab1(4, 10) As Single
    Dim toto As Variant
    '
    toto = Range("A1").Value
    '
    ' remplissage du tableau avec des valeurs bidons
    For i = 1 To UBound(tab1, 2)
        tab1(1, i) = i
        tab1(2, i) = i * 3
        tab1(3, i) = i * 7
    Next i
    '
    ' remplissage avec la formule tapée en A1 de la Feuil1 du classeur
    For i = 1 To UBound(tab1, 2)
        ' x
        x = tab1(1, i)
        ' y
        y = tab1(2, i)
        ' z
        z = tab1(3, i)
        '
        ' recup de la formule tapée en A1 (exemple : x+y/z)
        tab1(4, i) = Evaluate(Replace(Replace(Replace(toto, "x", CStr(x)), "y", CStr(y)), "z", CStr(z)))
        '
    Next i
End Sub


il va falloir que j'adapte ton code ou le mien à mon code final qui peut avoir plusieurs variables car x, y et z ce n'était qu'un exemple.
Merci en tout cas de ton aide.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Salut

VBA n'est pas du VB6 --> Catégorie modifiée

Si tu nommes les cellules appropriées, cela devrait être simple à faire :
Pour nommer les cellules, clique la cellule + menu "Insertion", "Nom", "Définir"
Appelle A1 "toto", B1 "tata" etc
Ensuite, pour définir une formule pour la cellule C1 par exemple, il te suffit en VBA d'entrer ta formule dans FormulaR1C1, exemple :
Range("C1").FormulaR1C1 = "=Toto - Tata"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
27 septembre 2011

Merci pour ta réponse Jack et désolé pour la catégorie.
Ce n'est pas ce que je cherche à faire.
En réalité, je cherche à pouvoir utiliser une formule écrite sur excel dans vba.
exemple : dans la case A1 j'ecris "x+y/z" (en texte), je declare ensuite les variables x,y et z sur vba. Je souhaite effectuer l'operation posée sur excel (en case A1) dans vba.
Le but de ceci est de pouvoir definir une operation quelconque sur excel (via une interface) et de pouvoir l'exploiter sur vba.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Oui oui, je t'ai correctement renseigné.
Il te suffit de récupérer le texte équivalent à ta formule et de l'appliquer à un FormulaR1C1 d'une autre cellule.
Seul bémol : Le nom des variables (cellules nommées) doivent être un peu plus étoffées et ne pas ressembler à des noms de colonnes, par exemple. x ou y risquent d'être mal interprété, mais devraient passer.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
"et de l'appliquer à un FormulaR1C1"
moyennant l'ajout d'un "=" en tête
Messages postés
5
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
27 septembre 2011

Merci de nouveau Jack mais ce n'est pas ça que je veux faire, je ne souhaite pas remplir une cellule excel (j'ai de trop gros tableaux à traiter).
Je veux pouvoir exploiter une formule qui serait ecrite (sans le =) dans la cellule A1 d'excel pour alimenter un programme vba avec cette formule.
J'ai fait un bout de code pour que ce soit plus clair:

Sub total()
    '
    ' tableau d'entrees
    Dim tab1(4, 10) As Single
    '
    ' remplissage du tableau avec des valeurs bidons
    For i = 1 To UBound(tab1, 2)
        tab1(1, i) = i
        tab1(2, i) = i * 3
        tab1(3, i) = i * 7
    Next i
    '
    ' remplissage avec la formule tapée en A1 de la Feuil1 du classeur
    For i = 1 To UBound(tab1, 2)
        ' x
        x = tab1(1, i)
        ' y
        y = tab1(2, i)
        ' z
        z = tab1(3, i)
        '
        ' recup de la formule tapée en A1 (pour l'exemple : "x+y/z")
        tab1(4,i)= fonction de recuperation de la formule en A1 (qui serait le résultat de x+y/z)
        '
    Next i
End Sub