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.

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