Buscar ultimo dígito de un numero según el mes

Quería ver si me pueden ayudar para crear un código vb para un formulario. Tengo una base de datos con distintos números de patente o matriculas y tengo un formulario donde al abrirlo tengo 12 texbox con los 12 meses del año y debajo de cada texbox tengo otro texbox indicando la cantidad de patentes o matriculas que terminan en un cierto dígito que estaría ligado a cierto mes del año. Por ejemplo: En el mes de Enero debería estar ligado al número 0 y el mes de Febrero al 1, y así sucesivamente, entonces cuando abro el formulario me debería mostrar cuantas patentes o matriculas hay según en el mes que estemos. Si estamos Febrero, el formulario debería mostrar todas las patentes o matriculas que tengo terminadas en 1. De Chile envió mis saludos a todos los que se dan un tiempo para poder enseñarnos las maravillas en Access VBA.

2 respuestas

Respuesta
2

Para lograr lo que necesitas, utilizaremos una función que mapee el mes actual al dígito de la patente/matrícula y luego una consulta de dominio (DCount) para contar las coincidencias en tu tabla.

Aquí tienes el código VBA que puedes usar para el evento On Load (Al Cargar) de tu formulario.

Codigo para el formulario

Este código está diseñado para:

  1. Determinar el dígito final que corresponde al mes actual.

  2. Contar las patentes cuyo último dígito coincide con el mes.

  3. Mostrar el resultado en el TextBox del mes actual y vaciar el resto.

  4. Pasos para implementar


  • Asegúrate de tener tus TextBox de resultados con nombres únicos que sigan un patrón similar (ej: txtResultadoEnero, txtResultadoFebrero, etc.).

  • Abre tu formulario en Vista Diseño.

  • Ve a la Hoja de Propiedades del formulario.

  • En la pestaña Evento, busca la propiedad Al cargar (On Load).

  • Haz clic en el botón ... (puntos suspensivos) y selecciona Constructor de Código.

  • Pega el código anterior dentro de la Private Sub Form_Load()... End Sub.

  • Ajusta las constantes NOMBRE_TABLA y CAMPO_PATENTE con los nombres reales de tu base de datos.

  • Ajusta el array controlesResultados para que coincida con los nombres exactos de tus 12 TextBox de resultados.

Ejemplo de Mapeo de Dígito:

Si prefieres que Noviembre sea el dígito 0 y Diciembre el dígito 1, el código tal como está (usando (mesActual - 1) Mod 10) funciona perfectamente para un ciclo de 10 dígitos.

Consulta SQL para Conteo Total

Una consulta SQL para obtener los conteos de todos los dígitos y así llenar todos los 12 TextBox

Código SQL (para usar en una Consulta Guardada o un Recordset)

SELECT
    Right([Patente], 1) AS UltimoDigito,
    Count([Patente]) AS Cantidad
FROM
    TblPatentes
GROUP BY
    Right([Patente], 1);

Código VBA para Llenar Todos los Controles

Este código utiliza la consulta anterior, recorre los resultados y actualiza solo los TextBox de los meses que corresponden al dígito encontrado (siguiendo el patrón: Enero=0, Febrero=1, Noviembre=0, Diciembre=1, etc.).

Requisitos Previos:

  1. Guarda la consulta SQL anterior en Access con el nombre, por ejemplo, QryConteoPatentes.

  2. Asegúrate de que tus TextBox de resultados sigan el patrón: txtResultadoEnero, txtResultadoFebrero, etc.

Private Sub Form_Load()
    ' 1. Definir los nombres de los 12 TextBox de resultados
    Dim controlesResultados(1 To 12) As String
    controlesResultados(1) = "txtResultadoEnero"
    controlesResultados(2) = "txtResultadoFebrero"
    controlesResultados(3) = "txtResultadoMarzo"
    controlesResultados(4) = "txtResultadoAbril"
    controlesResultados(5) = "txtResultadoMayo"
    controlesResultados(6) = "txtResultadoJunio"
    controlesResultados(7) = "txtResultadoJulio"
    controlesResultados(8) = "txtResultadoAgosto"
    controlesResultados(9) = "txtResultadoSeptiembre"
    controlesResultados(10) = "txtResultadoOctubre"
    controlesResultados(11) = "txtResultadoNoviembre"
    controlesResultados(12) = "txtResultadoDiciembre"
    ' 2. Limpiar todos los campos de resultado y establecer en 0 (cero)
    Dim i As Integer
    For i = 1 To 12
        Me.Controls(controlesResultados(i)).Value = 0 ' Inicializa en 0
    Next i
    ' 3. Conectar a la base de datos y ejecutar la consulta de conteo
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim digito As String
    Dim cantidad As Long
    Set db = CurrentDb
    ' Ejecutar la consulta guardada (asegúrate de que el nombre coincida)
    Set rs = db.OpenRecordset("QryConteoPatentes", dbOpenSnapshot)
    ' 4. Recorrer los resultados de la consulta
    If Not rs.EOF Then
        rs.MoveFirst
        Do While Not rs.EOF
            digito = rs!UltimoDigito ' El dígito de la patente (0 a 9)
            cantidad = rs!Cantidad    ' El conteo de patentes con ese dígito
            ' 5. Mapear el dígito encontrado a los meses correspondientes y actualizar el control
            Select Case digito
                Case "0" ' Enero y Noviembre
                    Me.Controls(controlesResultados(1)).Value = cantidad  ' Enero
                    Me.Controls(controlesResultados(11)).Value = cantidad ' Noviembre
                Case "1" ' Febrero y Diciembre
                    Me.Controls(controlesResultados(2)).Value = cantidad  ' Febrero
                    Me.Controls(controlesResultados(12)).Value = cantidad ' Diciembre
                Case "2" ' Marzo
                    Me.Controls(controlesResultados(3)).Value = cantidad
                Case "3" ' Abril
                    Me.Controls(controlesResultados(4)).Value = cantidad
                Case "4" ' Mayo
                    Me.Controls(controlesResultados(5)).Value = cantidad
                Case "5" ' Junio
                    Me.Controls(controlesResultados(6)).Value = cantidad
                Case "6" ' Julio
                    Me.Controls(controlesResultados(7)).Value = cantidad
                Case "7" ' Agosto
                    Me.Controls(controlesResultados(8)).Value = cantidad
                Case "8" ' Septiembre
                    Me.Controls(controlesResultados(9)).Value = cantidad
                Case "9" ' Octubre
                    Me.Controls(controlesResultados(10)).Value = cantidad
            End Select
            rs.MoveNext
        Loop
    End If
    ' 6. Cerrar el Recordset y limpiar objetos
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

Explicación de la Lógica del Código

  1. Inicialización: Todos los 12 TextBox de resultados se limpian y se establecen en 0.

  2. Ejecución de la Consulta: El código ejecuta la consulta guardada QryConteoPatentes, que devuelve una lista como esta: | UltimoDigito | Cantidad | | :---: | :---: | | 0 | 50 | | 1 | 45 | | ... | ... |

  3. Mapeo del Dígito:

    • Si la consulta encuentra que hay 50 patentes que terminan en 0, el código entra al Case "0".

    • Dentro de este caso, actualiza el TextBox de Enero y el de Noviembre con el valor 50.

    • Si la consulta encuentra 45 patentes que terminan en 1, el código actualiza el TextBox de Febrero y el de Diciembre con 45.

    • Para los demás dígitos (2 al 9), solo hay un mes asociado, por lo que se actualiza el TextBox correspondiente una sola vez.

Esto asegura que todos los meses muestren el conteo de patentes que les corresponde, independientemente de cuál sea el mes actual.

Esta es una posible solución.

Hola Don Eduardo, buenas tardes. El modelo es excelente, así que muchas gracias por la ayuda, funciona a la perfección. Sin ser una molestia, como podría hacer que por ejemplo en el mes de febrero tengo 20 patentes para ese mes, como puede que al hacer doble click en el cuadro de texto me pueda mostrar esas 20 patentes para saber cuáles son?

1. Crear la función reutilizable para mostrar las patentes

Esta función identifica el mes → calcula el dígito → abre un formulario filtrado.

Ponla en el módulo del formulario:

Private Sub MostrarPatentesPorMes(ByVal Mes As Integer)
    Dim Digito As Integer
    Digito = (Mes - 1) Mod 10   ' Enero=0, Febrero=1, ..., Octubre=9, Nov=0, Dic=1
    ' Abrir formulario con lista de patentes
    DoCmd. OpenForm "frmListaPatentes", acNormal
    ' Asignar RecordSource filtrado
    Forms!frmListaPatentes.RecordSource = _
        "SELECT * FROM tblPatentes WHERE Right([Patente],1)='" & Digito & "'"
End Sub

2. Agregar eventos Doble Clic a cada TextBox

Tú tienes estos nombres:

  • TxtResultadoEnero

  • TxtResultadoFebrero

  • TxtResultadoMarzo

Entonces:

ENERO

Private Sub txtResultadoEnero_DblClick(Cancel As Integer)
    MostrarPatentesPorMes 1
End Sub

FEBRERO

Private Sub txtResultadoFebrero_DblClick(Cancel As Integer)
    MostrarPatentesPorMes 2
End Sub

Y así para los demás meses

3. Crear el formulario “frmListaPatentes”

Debe ser:

  • Formulario continuo

  • Con RecordSource vacío (Access lo llenará al abrirlo)

  • Un cuadro de texto llamado: txtPatente
    Vinculado al campo Patente

Eso es todo.

Y listo. ¿Qué pasa ahora?

Ejemplo:

Si haces doble clic en txtResultadoFebrero
→ Mes = 2
→ Digito = (2-1) Mod 10 = 1
→ Se abre frmListaPatentes con:

SELECT * FROM tblPatentes WHERE Right(Patente,1) = '1'

Se mostrarán TODAS las patentes que terminan en 1. Espero te sirva, lástima que no utilices PostgreSQL cómo base de datos frontend, las cosas serían más prácticas.

Respuesta
1

I. Hola Héctor Manuel, por mi parte no soy conocedor sólo lector habitual de la Comunidad, pero deseaba trasladarle la información (consultas y artículos) que vi sobre esta posibilidad por si pudiese serle de alguna utilidad mientras le atiende un experto de primera mano, al que si lo desea podríamos llamar.

Le ruego me disculpe por las molestias de tanta lectura, la forma de responderle y si una parte de los enlaces ya los hubiese visto usted mismo. Ánimo.

https://excel--tutorial-com.translate.goog/explanation-of-the-vba-code-for-the-calendar/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://stackoverflow.com/questions/44457673/excel-vba-date-search-function

https://stackoverflow.com/questions/14931700/how-to-find-a-value-in-an-excel-column-by-vba-code-cells-find

https://stackoverflow.com/questions/54650417/how-can-i-create-a-calendar-input-in-vba-excel

https://www.reddit.com/r/excel/comments/17pnlmd/what_formula_can_i_use_to_pull_up_the_latest_date/

https://stackoverflow.com/questions/5254827/how-to-check-last-digit-of-number

https://stackoverflow.com/questions/50642569/vba-get-the-last-day-of-the-month/50642701#50642701

https://stackoverflow.com/questions/15731716/how-to-get-the-last-digit-of-a-number

https://www-statology-org.translate.goog/vba-last-day-of-month/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://stackoverflow.com/questions/58749350/excel-find-the-last-day-of-a-month-in-a-range-given-a-specific-year-and-month

https://ayudaexcel.com/foro/topic/21544-macro-buscar-una-fecha-indicada-en-una-columna-y-seleccionar-celda-encontrada/

https://www.reddit.com/r/excel/comments/19e4hbd/unique_id_numbers_and_only_checking_the_last_digit/

https://stackoverflow.com/questions/55294471/vba-code-to-serial-number-auto-generation-based-on-last-cell-value

https://www.reddit.com/r/excel/comments/fyk236/vba_script_for_order_numbers_current_code_listed/

https://www.excel-avanzado.com/39522/ultimo-dia-del-mes-en-excel-vba.html

https://www.mrexcel.com/board/threads/vba-code-to-find-the-last-date-in-the-current-month.1116292/

https://stackoverflow.com/questions/27708141/find-last-digits-with-if

https://www-access--programmers-co-uk.translate.goog/forums/threads/vba-formula-for-last-day-of-last-month.163153/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc

https://stackoverflow.com/questions/57116181/obtain-the-last-digit-of-a-number-contained-in-a-variable

https://stackoverflow.com/questions/36555786/access-vba-create-textbox-formula-check-check-last-digit

https://www.excelforum.com/excel-programming-vba-macros/546104-vba-to-identify-last-digit-in-integer.html

https://www.mrexcel.com/board/threads/vba-to-extract-last-number-from-string.167505/

https://stackoverflow.com/questions/13587638/how-to-get-the-last-record-id-of-a-form

https://stackoverflow.com/questions/50431569/vba-get-last-two-digits-in-cellvariable-lenght-that-are-divided-by-space-and

https://stackoverflow.com/questions/58117445/search-numbers-in-a-string-vba

https://stackoverflow.com/questions/66572184/check-the-last-digit-of-a-number

Gracias David por tu ayuda, pero con lo que me envió don Eduardo quedo super. Saludos

Gracias David, pero con la respuesta de don Eduardo fue suficiente y funciona a la perfección. Saludos

I. Hola Héctor, muchas gracias por sus palabras :) sin duda Don Eduardo le ofreció una respuesta magnífica, me alegro mucho de que vaya a poder realizar la operación. Ánimo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas