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

OpenOffice & LibreOffice Discussion :

Utilisation d'une fonction native Calc en anglais et à deux arguments


Sujet :

OpenOffice & LibreOffice

  1. #1
    Futur Membre du Club
    Utilisation d'une fonction native Calc en anglais et à deux arguments
    Bonjour à tous,

    Ça y est, j'ai sauté le pas et je converti toutes mes anciennes feuilles de calcul VBA en Basic LibreOffice.
    A cet effet, j'essaie d'utiliser les fonctions natives de Calc, et cela fonctionne parfaitement pour les fonctions à un argument comme celle-ci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function MOYENNEPERSO(Vecteur As Double) As Double
    	Dim LFonction As Object
    	LFonction = createUnoService( "com.sun.star.sheet.FunctionAccess" )
    	MOYENNEPERSO = LFonction.CallFunction("AVERAGE",Vecteur)
    End Function

    En revanche, ce même type de fonction statistique à deux arguments génère un signal d'erreur : « com.sun.star.lang.IllegalArgumentException »
    Cet exemple est supposé calculer la pente de la droite passant au plus près des points expérimentaux d'abscisses LVecteur1 et d'ordonnées LVecteur2.
    (Pour simplifier, j'ai déplacé les deux arguments utilisés à l'intérieur de la fonction) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function PENTEPERSO() As Double	
    Dim LVecteur1(4) As Double
    Dim LVecteur2(4) As Double
    Dim LVecteur(1) As Variant
    LVecteur1=Array(0.83, 1.32, 1.81, 1.63, 2.8)
    LVecteur2=Array(0.24, 0.37, 0.49, 0.63, 0.76)
    LVecteur=Array(LVecteur1,LVecteur2)
    	Dim LFonction As Object
    	LFonction = createUnoService( "com.sun.star.sheet.FunctionAccess" )
    	PENTEPERSO = LFonction.CallFunction("SLOPE", LVecteur() )  
    End Function

    La solution est sans doute triviale, mais je rame depuis des heures sur ce problème, alors je sollicite un coup de main.
    En vous remerciant.

  2. #2
    Futur Membre du Club
    Solution trouvée
    On trouve une solution bricolée à cette adresse : https://forum-test.openoffice.org/en...74&t=72284

    Bizarrement, et contrairement à ce qu'on peut faire avec une seule variable, il ne semble pas qu'on puisse faire les calculs à deux variables à partir de tableaux préalablement construits en Basic, mais ils sont réalisables à partir d'une instruction CallFunction() avec comme arguments :
    - Le nom de la fonction en anglais : "SLOPE"
    - un tableau Array constitué des deux adresses des deux plages de cellules des valeurs de X et de Y (que j'ai nommées "cPlageX" et "cPlageY")

    Donc, pour ce calcul de coefficient directeur d'une droite à partir d'instructions en Basic, voici une solution qui fonctionne :

    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
    SUB COEFFDIRECTEUR()
    Dim LDoc, LFeuille As Object
    Dim a As Double
     
    LDoc = ThisComponent                          ' Désignation du classeur
    LFeuille = LDoc.Sheets("Régression")          ' Désignation de la feuille
     
    'Les valeurs de X et Y se trouvent sur les plages de cellules nommées de la feuille nommée "Régression" :
    ' - sur les cellules que j'ai nommée "cPlageX" on trouve (0.83, 1.32, 1.81, 1.63, 2.8)
    ' - sur les cellules que j'ai nommée "cPlageY" on trouve (0.83, 1.32, 1.81, 1.63, 2.8)
     
        Dim LFonction As Object
        LFonction = createUnoService("com.sun.star.sheet.FunctionAccess")
        a = LFonction.CallFunction("SLOPE",Array(LFeuille.getCellRangeByName("cPlageY"),LFeuille.getCellRangeByName("cPlageX")))
    Print("Fini")     
    End Sub

    Sans doute existe-t-il une solution plus élégante, mais je n'ai pas tout compris.
    Merci à tous ceux qui ont essayé de chercher une solution.

###raw>template_hook.ano_emploi###