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
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:
Determinar el dígito final que corresponde al mes actual.
Contar las patentes cuyo último dígito coincide con el mes.
Mostrar el resultado en el TextBox del mes actual y vaciar el resto.
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:
Guarda la consulta SQL anterior en Access con el nombre, por ejemplo, QryConteoPatentes.
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 SubExplicación de la Lógica del Código
Inicialización: Todos los 12 TextBox de resultados se limpian y se establecen en 0.
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 | | ... | ... |
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.
- Compartir respuesta
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://stackoverflow.com/questions/44457673/excel-vba-date-search-function
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.reddit.com/r/excel/comments/19e4hbd/unique_id_numbers_and_only_checking_the_last_digit/
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.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/58117445/search-numbers-in-a-string-vba
https://stackoverflow.com/questions/66572184/check-the-last-digit-of-a-number
- Compartir respuesta