3 votes

Excel VBA - Fonction définie par l'utilisateur pour transformer une chaîne en formule

Je cherche quelque chose de similaire à la solution postée ici:

Fonction Excel qui évalue une chaîne comme si c'était une formule?

Le problème est que cela ne semble pas fonctionner avec une fonction à l'intérieur.

Voici la fonction dans ce fil de discussion telle que soumise par Chris Neilsen:

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function

Voici un exemple de chaîne que je voudrais transformer en formule:

=(INDEX(DataV,1,4)/INDEX(DataV,2,4))*100

DataV est un nom dans la feuille de calcul.

Je ne suis pas sûr de comment le faire, peut-être que je vais trouver, pour l'instant cela semble probablement que je ne le ferai pas à moins que je ne lise beaucoup plus sur VBA.

Toute aide est appréciée.

2voto

LonelyKnight Points 51

Je pensais simplement partager la solution que j'ai finalement choisie car elle fait le travail. Je n'ai pas pu créer de fonction utilisateur qui le fait, cela ne semble pas possible, donc j'ai utilisé un macro de base.

Sub Formules()
Dim rng As Range, cell As Range, y As Integer, o As Integer
    y = Range("B1").Value
    o = (y - 3) * 2
Set rng = Range(Cells(3, 4), Cells(3, y))

On Error GoTo ErrHandler
For Each cell In rng
    cell.Activate
    cell.Formula = ActiveCell.Offset(0, o).Value
Next cell
Exit Sub

ErrHandler:
    Msg = "Formule invalide pour cet indicateur, veuillez vérifier dans la feuille IndDef."
    MsgBox Msg, , "Erreur!", Err.HelpFile, Err.HelpContext

End Sub

Celui-ci a été écrit pour être utilisé avec un bouton, si vous souhaitez un macro exécuté automatiquement, cherchez des astuces sur ce site pour utiliser intersect.

La partie importante pour le problème est la suivante :

cell.Activate
cell.Formula = ActiveCell.Offset(0, o).Value

Définissez simplement la formule de la cellule comme la valeur de celle avec la chaîne :

Range1.Formula = Range2.Value

Dans mon cas, je voulais le faire passer à travers une série de cellules, d'où la nécessité d'activer l'équivalent de Range1 et d'utiliser ActiveCell.Offset pour définir l'équivalent de Range2.

Fonctionne avec n'importe quelle chaîne, mais les fonctions doivent être écrites en anglais. J'espère que cela aide.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X