Saber el último precio de cierre de cada uno de los valores que compone una cartera de acciones y reflejarlos en un textBox.

Estoy construyendo un formulario para que se vuelque los datos de aquellos la situación de una cartera compuesta por acciones. Es un formulario único pero al clikear en un botón comando se abre un formulario continuo.

La situación en la que estoy ahora mismo es que al disponer de la tabla (THistCompAcc) que es donde se refleja las compras realizadas, con los nombres de campos; Ticker, FechaCompra, TitulosComprados, TitulosDisponibles y PrecioUnitario (precio por unidad)

La instrucción hasta ahora está así:

    Dim categ As String

    Dim HistCta As String

    Dim tablaCotiz As String

    Dim fechaUltimaCotiz As Date

    Dim sqlPosicion As String

    Dim precioCierre As Double  

    ' Validar categoría

    If Not TempVars("Categoria") Is Nothing Then

        categ = Trim(UCase(TempVars("Categoria").Value))

    Else

        MsgBox "No se ha definido la categoría en TempVars.", vbExclamation

        Exit Sub

    End If   

    ' Selección de tablas según categoría

    Select Case categ

        Case "VALORES ACCIONES"

            HistCta = "THistorCompAcc"

            tablaCotiz = "TCotizAcc"

        Case Else

            MsgBox "Categoría no reconocida: " & categ, vbExclamation

            Exit Sub

    End Select

‘’’’ Creo la variable “tablaCotiz” para poder utilizarla en el caso que haya otro productos

    ' Última fecha de cotización

    fechaUltimaCotiz = DMax("FechaCotiz", tablaCotiz)

    ' Consulta de posiciones con títulos disponibles

    sqlPosicion = "SELECT Ticker, FechaCompra, TitulosDisponibles, PrecioUnitario " & _

                  "FROM " & HistCta & " " & _

"WHERE TitulosDisponibles > 0;"

    ' Asignar al formulario

    Me.RecordSource = sqlPosicion

' Ahora, en cada registro del formulario, puedes calcular el precio de cierre con DLookup:

    ' Ejemplo en un control calculado:

    precioCierre = DLookup("PrecioCierre", "TCotizAcc", "Ticker='" & [Ticker] & "' AND FechaCotiz=#" & Format(fechaUltimaCotiz, "yyyy-mm-dd") & "#")

    ' Y la ganancia/pérdida:

    ' =([PrecioCierre]-[PrecioUnitario])*[TitulosDisponibles]

    ' Calcular ganancia/pérdida

' Debug. Print rs! Ticker, (precioCierre - rs!PrecioUnitario) * rs! TitulosDisponibles

      Me.TxtTicker.ControlSource = "Ticker"

    Me.txtFechaCompra.ControlSource = "FechaCompra"

    Me.txtTitDispon.ControlSource = "TitulosDisponibles"

    Me.txtPrecioComp.ControlSource = "PrecioUnitario"

    Me.txtPrecioCierre.ControlSource = "precioCierre"

'    Me.txtGanPerd.ControlSource = "GananciaPerdida"

En principio, y que vea, puede haber mas errores, tengo problemas en que se plasme en el textBox correspondiente el precio de cierre de cada acción.

Le he dado vuelta al revés y al derecho y ahora mismo ya soy incapaz de vislumbrar alguna solución

1 respuesta

Respuesta

Solución correcta: usar un control calculado directamente en la propiedad ControlSource

No necesitas VBA para calcular el precio de cierre.
Puedes hacerlo en la propiedad ControlSource del TextBox usando DLookup.

1. Asegurar que tengas la última fecha de cotización

Puedes dejar en VBA:

FechaUltimaCotiz = DMax("FechaCotiz", tablaCotiz)

Y opcionalmente guardar esa fecha en un control oculto:

Me.txtUltFechaCotiz = fechaUltimaCotiz

2. Control Calculado para Precio de Cierre

En txtPrecioCierre.ControlSource coloca:

=Nz(DLookup("PrecioCierre", "TCotizAcc", 
    "Ticker='" & [Ticker] & "' AND FechaCotiz=#" & Format([txtUltFechaCotiz], "yyyy-mm-dd") & "#"), 0)

Esto ahora funciona porque:

[Ticker] sí existe en el formulario

[txtUltFechaCotiz] es un campo o control del formulario

No depende de variables de VBA

Access recalcula por registro (en formularios continuos)

3. Control Calculado para Ganancia/Pérdida

En txtGanPerd. ControlSource usa:

=([txtPrecioCierre] - [PrecioUnitario]) * [TitulosDisponibles]

Nada de VBA para esto.

Errores importantes en tu código original

Error 1:

Usas:

precioCierre = DLookup(...)

Pero luego haces:

Me.txtPrecioCierre.ControlSource = "precioCierre"

Esto es imposible:
“PrecioCierre” es una variable de VBA, no un campo del recordset.

Access solo acepta:

Campos de la consulta

expresiones calculadas (comenzando con =)

Funciones propias de Access

Error 2:

Intentas “pasar” valores de VBA → ControlSource
Eso no existe. Para asignar un valor directo deberías usar:

Me.txtPrecioCierre.Value = precioCierre

Pero en un formulario continuo esto sería incorrecto
(Todos los registros mostrarían el mismo valor).

Lo más rápido sin DLookup es usar una consulta SQL JOIN.

Muchas gracias por la pronta contestación pero me dice lo mismo que que en alguna prueba que he hecho anteriormente y es que hay un error de sintaxis

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas