VBA Access: Botón 'Ir a' un registro especificado

Tengo armado el código para que funcionen los botones Atrás, Anterior, Siguiente, Último y funcionan de maravillas (comparto el código más abajo). Por necesidad y unificar la estética del form, lo hago con botones. Y para mantener esa estética y necesidad, ahora necesito un campo donde ingresar un valor numérico y que al hacer clic en un botón "Ir a..." vaya a ese registro. ¿Es posible?
Busqué en varias Base de Datos de prueba que me pasaron y no encuentro esto.


Código de Botones:

' Botones de DESPLAZAMIENTO
Private Sub cmdDFirst_Click()
    DoCmd.GoToRecord , , acFirst
    Call CUENTAVERSIONES
    MsgBox "Primer registro de la Consulta.", 64, "Desplazamiento"
End Sub
Private Sub cmdDAnt_Click()
On Error GoTo ERRH
Select Case x
Case Is <= Y
    DoCmd.GoToRecord , , acPrevious
Case Else
    MsgBox "Primer registro.", 48, "Desplazamiento"
End Select
Call CUENTAVERSIONES
ERRH:
    If Err.Number = 0 Then
        Exit Sub
    ElseIf Err.Number = 2105 Then
        MsgBox "Código: " & Err.Number & vbLf & Error$ & " Ya está en el primer registro.", 48, "Desplazamiento"
        Exit Sub
    Else
        Mensajes.ERR_GENERAL_BY_N
    End If
End Sub
Private Sub cmdDSig_Click()
On Error GoTo ERRH
Select Case x
Case Is <= Y
    DoCmd.GoToRecord , , acNext
Case Else
    MsgBox "Último registro.", 48, "Desplazamiento"
End Select
Call CUENTAVERSIONES
ERRH:
    If Err.Number = 0 Then
        Exit Sub
    ElseIf Err.Number = 2105 Then
        MsgBox "Código: " & Err.Number & vbLf & Error$ & " Ya está en el último registro.", 48, "Desplazamiento"
        Exit Sub
    Else
        Mensajes.ERR_GENERAL_BY_N
    End If
End Sub
Private Sub cmdDLast_Click()
    DoCmd.GoToRecord , , acLast
    Call CUENTAVERSIONES
    MsgBox "Último registro de la Consulta.", 64, "Desplazamiento"
End Sub
Private Sub CuentaRegistros()
    x = CurrentRecord
    Y = DCount("*", "[VERSION]")
    Call REGACT
End Sub
Private Sub REGACT()
    Me.txtRecuento.Value = "Registro: " & x & " de " & Y & "."
End Sub

1 respuesta

Respuesta
2

Sasha: Prueba con:

DoCmd. GoToRecord acDataForm, NombreForm, acGoTo, Me. TxtIrA

Siendo Me. TxtIrA un cuadro de Texto, con un Número de Registro. Saludos >> Jacinto

¡Por Dios! Así de simple. Igual, nunca hubiera podido escribir bien la sintaxis. Me faltó la gran parte de las cosas, además de que no encontraba nada en la web como ejemplo para aplicar como suelo hacer,más allá que aquí plantee las dudas que escapan a mi conocimiento o si lo que encontré (como siempre suele suceder) no me haya funcionado.
Siempre agardecido, esperando que mañana pase una muy feliz Nochebuena y una hermosa Navidad.

Comparto el código usado para el botón en cuestión y el código complementario que uso:

' Botón CERRAR
Private Sub cmdCerrar_Click()
    Acciones.CIERRA_OK
End Sub
' Botones de DESPLAZAMIENTO
'Botón PRIMERO
Private Sub cmdDFirst_Click()
    DoCmd.GoToRecord , , acFirst
    Call CUENTAVERSIONES
    MsgBox "Primer registro de la Consulta.", 64, "Desplazamiento"
End Sub
'Botón ANTERIOR
Private Sub cmdDAnt_Click()
On Error GoTo ERRH
Select Case x
Case Is <= Y
    DoCmd.GoToRecord , , acPrevious
Case Else
    MsgBox "Primer registro.", 48, "Desplazamiento"
End Select
Call CUENTAVERSIONES
ERRH:
    If Err.Number = 0 Then
        Exit Sub
    ElseIf Err.Number = 2105 Then
        MsgBox "Código: " & Err.Number & vbLf & Error$ & " Ya está en el primer registro.", 48, "Desplazamiento"
        Exit Sub
    Else
        Mensajes.ERR_GENERAL_BY_N
    End If
End Sub
'Botón SIGUIENTE
Private Sub cmdDSig_Click()
On Error GoTo ERRH
Select Case x
Case Is <= Y
    DoCmd.GoToRecord , , acNext
Case Else
    MsgBox "Último registro.", 48, "Desplazamiento"
End Select
Call CUENTAVERSIONES
ERRH:
    If Err.Number = 0 Then
        Exit Sub
    ElseIf Err.Number = 2105 Then
        MsgBox "Código: " & Err.Number & vbLf & Error$ & " Ya está en el último registro.", 48, "Desplazamiento"
        Exit Sub
    Else
        Mensajes.ERR_GENERAL_BY_N
    End If
End Sub
'Botón ULTIMO
Private Sub cmdDLast_Click()
    DoCmd.GoToRecord , , acLast
    Call CUENTAVERSIONES
    MsgBox "Último registro de la Consulta.", 64, "Desplazamiento"
End Sub
'Botón IR A
Private Sub cmdIrA_Click()
VALMAX = DCount("*", "VERSION")
If txtX > VALMAX Then
    MsgBox "Usted ingresó '" & txtX & "' y el valor máximo posible es '" & VALMAX & "'." & vbLf & _
    "Por favor ingrese otro valor.", 16, "Valor incorrecto"
    Me.txtX.Value = CurrentRecord
    Me.txtX.SetFocus
ElseIf IsNull(txtX) Then
    Mensajes.ERR_CONSULTAVACIA
    Call CUENTAVERSIONES
    Me.txtX.SetFocus
ElseIf Me.txtX.Value = CurrentRecord Then
    MsgBox "Usted ya se encuentra en el registro '" & CurrentRecord & "'. Escriba otro valor diferente e intente nuevamente.", 64, "Ir a registro"
Else
    DoCmd.GoToRecord acDataForm, "Con_Version", acGoTo, Me.txtX
    Call CUENTAVERSIONES
End If
End Sub
' Para llamar ingresar: call SoloNum(KeyAscii)
' Incluirlo en AL PRESIONAR UNA TECLA
Sub SoloNum(KeyAscii As Integer)
On Error GoTo ERRH
    ' si no es un número entre el 0 y el 9
    If Not Chr(KeyAscii) Like "[0-9]" Then ' If Not Chr(KeyAscii) Like "[0-9,.]" Then ' (Si admite punto y coma)
        Select Case KeyAscii
            ' si es un retroceso(, enter o tabulación)
            Case 8, 9, 13 ' vbKeyBack, vbKeyTab , vbKeyReturn
            ' no se hace nada
            Case Else
                ' si no, se anula el caracter introducido
                KeyAscii = 0
                Beep
                MsgBox "El campo sólo admite números enteros.", 16 + 0, "Sólo números"
        End Select
    End If
ERRH:
    If Err.Number = 94 Or Err.Number = 0 Then
    Else
        ENTORNOERR = "Acciones.SoloNum(KeyAscii)"
        Mensajes.ERR_GENERAL_BY_N
    End If
End Sub

Parte del código creo que pertenece a @Neckitto o @Svenjornelrojo por lo que su crédito para ellos.

Vuelvo a molestar con una pregunta adicional:

¿Cómo puedo hacer para que esto mismo me funcione en un subformulario?
Usé este código:

If CurrentProject.AllForms("Edi_Presta_Devol_Li").IsLoaded Then
    DoCmd.GoToRecord acDataForm, "Forms!Edi_Presta_Devol_Li!Sub_Edi_PrestaLectura", acGoTo, Me.txX
ElseIf CurrentProject.AllForms("Edi_Lectura_Li").IsLoaded Then
    DoCmd.GoToRecord acDataForm, "Forms!Edi_Presta_Devol_Li!Sub_Edi_PrestaLectura", acGoTo, Me.txX
ElseIf CurrentProject.AllForms("Edi_Presta_Devol_Le").IsLoaded Then
    DoCmd.GoToRecord acDataForm, "Forms!Edi_Presta_Devol_Le!Sub_Edi_PrestaLectura", acGoTo, Me.txX
ElseIf CurrentProject.AllForms("Edi_Presta_Devol_Li").IsLoaded Then
    DoCmd.GoToRecord acDataForm, "Forms!Edi_Presta_Devol_Li!Sub_Edi_PrestaLectura", acGoTo, Me.txX
End If

Pero me dice que el formulario no está abierto o no existe en, por ejemplo, este código:

DoCmd.GoToRecord acDataForm, "Forms!Edi_Presta_Devol_Le!Sub_Edi_PrestaLectura", acGoTo, Me.txX

¿Cómo hago referencia al subformulario?
Ya probé con me.Sub_Edi_PrestaLectura y es igual. Y probé referenciar a si está abierto 'Forms!Formulario1!Subformulario' y tampoco funciona.

¿Cómo puedo hacer?

ACLARO:
El campo y el botón "Ir a" están en el Subformulario.

Sasha: Si todos los controles están en el Subformulario, no necesitas sondear si está abierto, porque seguro que lo estará.

Prueba con una línea tal como ésta >>

DoCmd. GoToRecord acDataForm, Me. Name, acGoTo, Me. TxX

Mis saludos y Felices Fiestas >> Jacinto

¡Gracias! Al final hice una pregunta aparte porque creí que esto no iba a verse, pero de todos modos probé 'quitando' partes y funcionó dejando así:

If CurrentProject.AllForms("Edi_Presta_Devol_Le").IsLoaded Then
    Forms![Edi_Presta_Devol_Le]![Sub_Edi_PrestaLectura]![txX].SetFocus
    DoCmd.GoToRecord , , acGoTo, Me.txX

Costó, pero funcionó.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas