2 votes

Excel VBA : Est-il possible de créer des fonctions personnalisées avec des méthodes personnalisées ?

Ce à quoi je fais référence, c'est, par exemple, la façon dont vous pouvez faire :

Range().Select

Où "Range()" est la fonction, et "Select" est la méthode.

Par exemple, si j'ai une fonction qui prend trois doubles représentant les longueurs des côtés d'un triangle et qui produit l'angle le plus grand en radians ou en degrés.

Public Function getAngle(a as Double, b as Double, c as Double)

    .degrees = 'some equation to determine degrees as a double
    .rads = 'some equation to determine radians as a string

End Function

Vous obtiendrez donc les résultats suivants :

getAngle(3, 4, 5).degrees : 90.0

getAngle(3, 4, 5).rads : "0.5π"

5voto

cyboashu Points 360

Créez une classe, pour cet exemple nommez-la clsTrig.

Option Explicit

'/ Class  Name : clsTrig

Private m_ddegrees   As Double
Private m_drads  As Double

Public Property Get degrees() As Double
    degrees = m_ddegrees
End Property

Public Property Let degrees(val As Double)
     m_ddegrees = val
End Property

Public Property Get rads() As Double
    rads = m_drads
End Property

Public Property Let rads(val As Double)
     m_drads = val
End Property

Public Function doCalc(a1 As Double, a2 As Double) As Double

    '/ You do the math here. This is just a sample and not actual trigonometery

    m_ddegrees = a1 + a2
    m_drads = a1 - a2

End Function

Ensuite, dans le module standard, vous obtenez le comportement souhaité :

Public Function getAngle(a As Double, b As Double) As clsTrig
    Dim oTrig As New clsTrig

    Call oTrig.doCalc(a, b)
    Set getAngle = oTrig
End Function

Sub test()
    MsgBox getAngle(30, 20).degrees
    MsgBox getAngle(30, 20).rads
End Sub

1voto

Tim Williams Points 31438

Utilisation d'un type :

Option Explicit

Type cType
    Degrees As Double
    rads As Double
End Type

Sub tester()

    Dim a As cType

    a = getAngle(1, 2, 3)

    Debug.Print a.Degrees, a.rads

End Sub

Public Function getAngle(a As Double, b As Double, c As Double) As cType
Dim rv As cType

    rv.Degrees = 88  'for example
    rv.rads = 99     'for example

    getAngle = rv

End Function

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X