Cantidad mayor y menor en campos calculados

Tengo un formulario principal con tres subformularios y cada uno con una serie de campos de tipo numero sin decimales, Campo 1, Campo 2, Campo 3... Todos tienen 1 campo calculado del totales, basado en la suma de todos los campos de cada formulario, lo que quiere decir que hay 4, la pregunta es, ¿como puedo coger esos cuatro valores totales, sacar el numero mas alto y el numero mas bajo y dependiendo de la diferencia de la resta entre ellos asignare un valor a otro campo independiente por ejemplo, si la diferencia es 0 asignaré al independiente el valor 6, si es 1 asignaré al independiente el valor 5, si es 2 asignaré al independiente el valor 4 y así sucesivamente...

Comentar que necesito que en cada subformulario o formulario principal cada vez que modifique una cantidad se recalcule todo.

Respuesta
1

Angel, no dices si el formulario y los subformularios están relacionados por algún campo, por ejemplo, IdFactura. Eso es importante, porque podrías usar la función DMax("Campocalculado","nombretablaA","idfactura=" & me.idfactura & "")

Lo mismo para el subformulario B y el C

buenos dias julian y gracias por tu atención, mira los formularios se pueden vincular por un campo comun llamado NCN pero creo que no va a servir esa funcion por que los campos calculados no se guardan hasta que sales del formulario principal.

los campos de todos los formularios se suma 1 o se resta 1 mediante botones + y -, te cuento lo que he hecho, quizás un poco cutre, pero funciona bien.

He puesto 4 campos en el formulario principal con origen en los campos calculados, llamados TxtControlArmA, TxtControlArmB, TxtControlArmC, TxtControlArmdD y otro donde se calcula el numero mayor llamado TxtPtosMax, y funciona poniendo el código que te dejo después en el evento, al hacer click de los botones + y -, el problema es que no es practico poner este código en todos los botones por que hay un montón, me defiendo un poco con VBA pero no se programar por mi mismo, entonces la pregunta es, como hacer una función que cada vez que pulsas un botón desde cualquier formulario, corra el código en la función y devuelva el resultado... simplemente así me vale.

PD: El código en el evento del formulario principal, después de actualizar no funciona bien, me pone el resultado bien pero no cuando pulso el botón, si no cuando pulso el siguiente, osea como que va un paso por detrás aunque hace el resultado bien.

CODIGO DE COMPARACIÓN:

''---------------------------------------------------------------------------
''---------------------------------------------------------------------------
Dim Var1, Var2, Var3, Var4 As Integer
Var1 = Me.TxtControlArmA: Var2 = Me.TxtControlArmB: Var3 = Me.TxtControlArmC: Var4 = Me.TxtControlArmD
Dim VarMax, VarMin As Integer
VarMax = Var1
If Var2 > VarMax Then
VarMax = Var2
End If
If Var3 > VarMax Then
VarMax = Var3
End If
If Var4 > VarMax Then
VarMax = Var4
End If
DoCmd.RunCommand acCmdRefresh
Me.TxtPtosMax = VarMax
''---------------------------------------------------------------------------
''---------------------------------------------------------------------------

Angel, no soy quien para decirte lo que está bien o lo que está mal. Pero, en los formularios ( y por tanto los subformularios ) hay muchísimas formas de hacer cálculos. Por eso, si quieres, repito, si quieres, mándame un mensaje (sólo el mensaje) a [email protected] y te mando un ejemplo de como puedes hacerlo.

Julián, lo tengo sollucionado, ya lo he conseguido, como te dije al final me informe de como crear una función vba con el código de comprobación, ahora cada vez que pulsas un botón se corre el código de la función y se actualizan los valores perfectamente, gracias por tu interés y un saludo

Un saludo

1 respuesta más de otro experto

Respuesta
2

Ángel, independiente que lo haya hecho y se aprender se trata, le dejo otra forma con una función.

Function ObtenerValorMayor(ParamArray Valores() As Variant) As Double
    Dim i As Integer
    Dim MaxValor As Double
    ' Inicializar el valor máximo con el primer valor del array
    MaxValor = Valores(0)
    ' Iterar sobre el array y encontrar el valor máximo
    For i = 1 To UBound(Valores)
        If Valores(i) > MaxValor Then
            MaxValor = Valores(i)
        End If
    Next i
    ' Retornar el valor máximo
    ObtenerValorMayor = MaxValor
End Function

ParamArray() le permite pasar cualquier cantidad de cuadros de texto y no se limita a 4.

Ejemplo de llamada de la función:

Private Sub btnObtenerMayor_Click()
    Dim MayorValor As Double
    ' Llamada a la función pasando los valores de los controles
    MayorValor = ObtenerValorMayor(Nz(Me.TxtControlArmA.Value, 0), _
                                   Nz(Me.TxtControlArmB.Value, 0), _
                                   Nz(Me.TxtControlArmC.Value, 0), _
                                   Nz(Me.TxtControlArmD.Value, 0))
    ' Mostrar el valor mayor
    MsgBox "El valor mayor es: " & MayorValor
End Sub

La respuesta que presento es para obtener el mayor valor, ahora le dejo esta función que dependiendo el primer parámetro retorna el mayor o menor valor, no obstante, se puede utilizar el método Control para recorrer el formulario etc.

Function ObtenerValorMayorMenor(intMayorMenor As Integer, ParamArray Valores() As Variant) As Double
'Parámetros:
'           intMayorMenor=1 Obtener mayor valor
'           intMayorMenor=2 Obtener menor valor
'           Valores()= Array de valores seperados por comas
    Dim i As Integer
    Dim MaxValor As Double
    ' Inicializar el valor máximo con el primer valor del array
    MaxValor = Valores(0)
    ' Iterar sobre el array y encontrar el valor máximo
    For i = 1 To UBound(Valores)
     If intMayorMenor = 1 Then
        If Valores(i) > MaxValor Then
            MaxValor = Valores(i)
        End If
     Else
        If Valores(i) < MaxValor Then
            MaxValor = Valores(i)
        End If
     End If
    Next i
    ' Retornar el valor máximo
    ObtenerValorMayorMenor = MaxValor
End Function

En fin, hay muchas formas más completas, pero necesita conocimientos de VBA.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas