Llamadas a funciones que llaman a otras funciones con parámetros que son variables definidas por el usuario, en hoja Excel

3 envíos / 0 nuevos
Último envío
xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 2 años 16 horas
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Llamadas a funciones que llaman a otras funciones con parámetros que son variables definidas por el usuario, en hoja Excel

Hola,

Estoy desesperado. Las funciones definidas por el usuario (UDF) se pueden llamar desde una hoja, siempre que sean declaradas como 'Public functions' y estén definidas en un óodulo (no en el código de una hoja).

Pero si la UDF tiene variables que son defindas como variables tipo de usuario, simplemente dará error #VALOR!:

Por ejemplo, si en una celda tenemos la fórmula (con el código dentro de un módulo):
= fATanPoints(fXY2Point(1;2);fXY2Point(3;4))
Dará #VALOR!

En cambio, llamando a otra UDF como:
=fATanPointsXY(1;2;3;4)
Dará por respuesta = 0.553, correcto.

Code:
Public Type POINT
    X As Double
    Y As Double
End Type


Public Function fXY2Point(ByRef X As Double, ByRef Y As Double) As POINT
    Dim TestPoint As POINT
    With TestPoint
        .X = X
        .Y = Y
    End With
    fXY2Point = TestPoint
End Function


Public Function fATanPoints(ByRef Point1 As POINT, ByRef Point2 As POINT) As Double
'Devuelve la Atan de la línea entre dos puntos (no se han implementado control de errores)
fATanPoints = Atn(Point2.Y - Point1.Y) / (Point2.X - Point1.X) End Function Public Function fATanPointsXY(ByRef X1 As double, byref Y1 As double, byref X2 As double, byref Y2 As double) As Double 'Devuelve la Atan de la línea entre dos puntos (no se han implementado control de errores) fATanPointsXY = Atn(Y2 - Y1) / (X2 - X1) End Function

La pregunta es, ¿cómo puedo llamar a funciones UDF del tipo fATanPoints que tienen variables definidas por el usuario, de modo que se obtenga el mismo resultado?
En Excel 97 la función CALL() lo resolvía, pero ahora esa llamada ya no existe.

Gracias de antemano.

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 2 años 16 horas
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Llamadas a funciones que llaman a otras funciones con ...

En el foro MrExcel me han respondido dándome una lección de VBA. Uso de punteros...

http://www.mrexcel.com/forum/excel-questions/737410-call-udf-function-has-user-defined-type-variables-parameters-worksheet.html#post3625398

Me he dejado descolocado. Espero que existan otras soluciones, porque punteros, no se ven demasiado por VBA y sabe Dios qué mundos tocaría explorar.


Public Type POINT
    X As Long
    Y As Long
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Function fXY2Point(ByRef X As Long, ByRef Y As Long) As Long
    Static i As Long
    Static TestPoint As POINT
    Static TestPoint2 As POINT
    
    If i = 0 Then
        With TestPoint
            .X = X
            .Y = Y
        End With
        fXY2Point = VarPtr(TestPoint)
    Else
        With TestPoint2
            .X = X
            .Y = Y
        End With
        fXY2Point = VarPtr(TestPoint2)
    End If
    i = IIf(i = 1, 0, i + 1)
End Function

Public Function fATanPoints(ByRef Point1Ptr As Long, ByRef Point2Ptr As Long) As Double
    'Return the Atan of the line between two points (for this example, didn't implemented error traps, as they're used valid values that has no errors)
    Dim Point1 As POINT
    Dim Point2 As POINT
    
    CopyMemory ByVal Point1, ByVal Point1Ptr, ByVal LenB(Point1)
    CopyMemory ByVal Point2, ByVal Point2Ptr, ByVal LenB(Point2)
    fATanPoints = Atn(Point2.Y - Point1.Y) / (Point2.X - Point1.X)
End Function


Sub Test()
    MsgBox fATanPoints(fXY2Point(1, 2), fXY2Point(3, 4))
End Sub

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 16 horas 33 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11035
gracias

gracias por compartir la solución

 

------
Ya sé Excel, pero necesito más.