Fonction LET pour Excel 2013

Résolu

Bonjour à tous,

Dans le but d'avoir une fonction LET pour mon Excel 2013 j'ai consulté l'IA Gemini qui m'a concocté ce code

Function LET_2013(ParamArray args() As Variant) As Variant
    ‘Exemple de fonction : =LET_2013("x"; A1*2; "y"; B1+5; "x + y")
    Dim i As Long
    Dim numArgs As Long
    Dim varName As String
    Dim varVal As Variant
    Dim expr As String
    
    numArgs = UBound(args) - LBound(args) + 1
    
    If numArgs < 3 Or (numArgs Mod 2 = 0) Then
        LET_2013 = CVErr(xlErrValue)
        Exit Function
    End If
    
    expr = CStr(args(UBound(args)))
    
    For i = LBound(args) To UBound(args) - 1 Step 2
        varName = CStr(args(i))
        varVal = args(i + 1)
        
        If IsError(varVal) Then
            LET_2013 = varVal
            Exit Function
        ElseIf TypeName(varVal) = "String" Then
            varVal = """" & Replace(varVal, """", """""") & """"
        ElseIf TypeName(varVal) = "Date" Then
            varVal = CDbl(varVal)
        ElseIf TypeName(varVal) = "Boolean" Then
            varVal = IIf(varVal, "TRUE", "FALSE")
        End If
        
        expr = Replace(expr, varName, CStr(varVal))
    Next i
    
    LET_2013 = Application.Evaluate(expr)
End Function

Puis j'ai ajouté des arguments de la fonction en consultant d'anciennes fonctions ajoutées à mon Excel

Sub DescriptionFonction()
    ‘Déclaration des variables
    Dim NomFonction As String
    Dim DescriptionFonction As String	
    Dim ArgumentDesc (1 To 9) As String
    
    ‘Affectation des variables
    NomFonction ="LET_2013"
    DescriptionFonction ="La fonction LET_2013 attribue des noms aux résultats des calculs. Elle permet de stocker des calculs intermédiaires, des valeurs ou de définir des noms à l’intérieur d’une formule. Ces noms ne s’appliquent que dans le cadre de la fonction."
    ' Descriptions des 9 premiers arguments visibles dans la fenêtre fx
    ArgumentDesc (1) = "Nom de la variable 1 (entre guillemets, ex: "x")."
    ArgumentDesc (2) = "Valeur ou formule attribuée à la variable 1."
    ArgumentDesc (3) = "Nom de la variable 2 (optionnel) ou calcul final utilisant la variable définie (entre guillemets)."
    ArgumentDesc (4) = "Valeur ou formule attribuée à la variable 2."
    ArgumentDesc (5) = "Nom de la variable 3 (optionnel) ou calcul final utilisant les variables définies (entre guillemets)."
    ArgumentDesc (6) = "Valeur ou formule attribuée à la variable 3."
    ArgumentDesc (7) = "Nom de la variable 4 (optionnel) ou calcul final utilisant les variables définies (entre guillemets)."
    ArgumentDesc (8) = "Valeur ou formule attribuée à la variable 4."

    ArgumentDesc (9) = "Calcul final utilisant les variables définies (entre guillemets)."

'Insertion de la fonction dans la bibliothèque des fonctions d'Excel
    Application.MacroOptions _
    Macro:=NomFonction, _
    Description:=DescriptionFonction, _
    ArgumentDescriptions:=ArgumentDesc

End Sub

Mesdames/Messieurs les cadors du code VBA j'aimerai savoir s'il y a des rectifications à apporter.

Je vous remercie par avance.

Cordialement


Windows / Chrome 152.0.0.0

3 réponses

  1. Bonjour,

    Au saut du lit, je viens de faire un essai : affecter à la variable "tbl" la plage A1:A10 et afficher cette plage :

    =LET_2013(tbl;A1:A10;tbl)

    alors que la fonction native Excel renvoie bien la plage. En C5, la formule avec LET_2013 et en D5, la formule avec la fonction LET :

    Daniel


    0
    1. Apparemment, la fonction n'a pas prévu le cas d'un tableau de plusieurs valeurs. Elle fonctionne avec des valeurs uniques comme :

      =LET_2013("tbl";RACINE(4);"tbl")

      Je regarde si je peux modifier, mais, normalement, une fonction VBA ne peut écrire que dans la cellule où elle est insérée.

      Daniel

      0
    2. @danielc0

      Par contre avec Copilot, ceci fonctionne, au moins pour une plage de cellules :

      Public Function LET_2013(ParamArray Arguments() As Variant) As Variant
          On Error GoTo Erreur
          
          Dim i As Long, Dernier As Long
          Dim NomRecherche As String
          
          Dernier = UBound(Arguments)
          
          ' Couples nom/valeur + résultat final
          If Dernier < 2 Or (Dernier Mod 2) <> 0 Then
              LET_2013 = CVErr(xlErrValue)
              Exit Function
          End If
          
          NomRecherche = CStr(Arguments(Dernier))
          
          ' Recherche du nom demandé
          For i = 0 To Dernier - 1 Step 2
              If StrComp(CStr(Arguments(i)), NomRecherche, _
                         vbTextCompare) = 0 Then
                  
                  If IsObject(Arguments(i + 1)) Then
                      LET_2013 = Arguments(i + 1).Value
                  Else
                      LET_2013 = Arguments(i + 1)
                  End If
                  
                  Exit Function
              End If
          Next i
          
          LET_2013 = CVErr(xlErrName)
          Exit Function
      
      Erreur:
          LET_2013 = CVErr(xlErrValue)
      End Function

      Au moins, ça fonctionne avec Excel 365. A tester avec Excel 2013.

      Daniel

      0
  2. Salut Daniel

    J'ai changé par ton code mais comme je n'y comprends toujours rien en VBA je fais  confiance.

    Je ne cherche pas une fonction très compliquée du moment que ce soit plus lisible pour des calculs moyennement complexes.

    Par contre pour la partie description j'ai certainement fait une erreur en enregistrant car, à part les 9 cases visibles je n'ai aucune explication dans la fenêtre fx. As-tu un mode d'emploi ?

    Cordialement

    0
    1. Un exemple pour affecter la variable "tbl" à la plage A1:A10 et afficher celle-ci :

      =LET_2013("tbl";A1:A10;"tbl")
      =LET_2013("tbl";RACINE(A1:A10);"tbl")

      Par contre, ça ne fonctionne pas pour :

      =LET_2013("tbl";A1:A10;RACINE("tbl"))

      Je regarde, mais j'ai l'impression qu'il va y avoir une tonne de cas particculiers

      Daniel

      0
    2. @danielc0

      En fait, ça me dépasse totalement. Quand j'entre par exemple :

      =LET_2013("tbl";A1:A10;"tbl"*2)

      La formule retourne "#VALEUR!" sans que le code VBA soit lancé. Je laisse tomber. Si tu n'as pas de réponse ici, pose la question sur un autre forum.

      Daniel

      0
  3. Bonjour,

    Daniel, je te remercie.

    Finalement j'abandonne aussi ; ça ne fonctionne pas correctement et ça ralentit l'ouverture d'Excel, je supprime cette fonction complémentaire.

    Cordialement

    0