Numerar con criterios los registros de una tabla en Microsoft Access

Escrito por Administrador

11 de abril de 2023

El mes pasado, vimos cómo numerar todos los registros de una tabla en Microsoft Access, pero ¿y si queremos numerar en base a ciertos criterios? Te explico cómo hacerlo.

Supongamos que tenemos una tabla como la de la figura, con todos los campos rellenos menos el de "Consecutivo",

saber-usuarios-conectados-base-datos
He creado un formulario con un solo botón que, al pulsarlo, numerará todos los registros de la tabla por orden, con una peculiaridad: la numeración se reiniciará al cambiar de número de factura.
saber-usuarios-conectados-base-datos
El código que hay detrás del botón es el siguiente,
Private Sub Consecutivo_Click()

'Dimensionamos las variables

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim factura As String

'Creamos RecordSet

Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("Select * from Facturas")

'Inicializamos variables

contador = 1

'Actualizamos el campo Consecutivo de la tabla Facturas

rst.MoveFirst

Do Until rst.EOF

'Si coinciden los campos Proveedor y factura con el del registro anterior, sumamos una unidad al contador

If rst!Proveedor = Proveedor And rst!factura = factura Then

contador = contador + 1

Else

'En caso contrario, reiniciamos el contador

contador = 1

End If

'Guardamos los valores del registro actual para compararlos con los del próximo registro

Proveedor = rst!Proveedor
factura = rst!factura

'Actualizamos el campo Consecutivo de la tabla

rst.Edit
rst!Consecutivo = contador
rst.Update
rst.MoveNext

Loop

'Mostramos un mensaje de fin de la operación

MsgBox "Operación realizada con éxito"

End Sub

Como veis, he creado un RecordSet con todos los registros de la tabla "Facturas" y lo vamos recorriendo actualizando el valor del campo "ID". Para ello, uso una variable llamada contador, que empieza con valor 1, y en cada iteración aumenta en una unidad.

En caso de coincidir los campos "Proveedor" y "Factura" con los del registro anterior, la numeración será secuencial. En caso contrario, restablecemos el índice y volvemos a comenzar desde 1.

Finalmente, la tabla queda de la siguiente manera,

saber-usuarios-conectados-base-datos

Después

Espero que este ejemplo te ayude a numerar con criterios los registros de una tabla que hayas creado en Microsoft Access de una manera sencilla.

Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.

Hasta la próxima.

Si te ha servido y quieres donar





Descarga el archivo del ejemplo

14 Comentarios

  1. Hola, tengo una tabla llamada TablaHermanos con el campo IdHermano y otra TblPuestos, en ella tengo tres campos, IdPuesto, NombrePuesto y DonativoPuesto, ( en el campo NombrePuesto hay muchos, pero los mas usuales son: Costalero Cristo y Nazareno) luego tengo un formulario llamado Papeleta de Sitio, y un subformulario llamdo TblDetallePapeleta, en este subformulario tengo los siguientes campos: IdHermano, IdPuesto, NombrePuesto y DonativoPuesto, en el campo puesto, le tengo puesto en € la cantidad de 9€, normalmente el donativo son siempre los 9€, pero a veces algún hermano quiere dar mas, por ejemplo 10€, el caso es, que cuando elijo en el campo Combo el NombrePuesto, me pone automáticamente los 9€ que están definidos en la Tabla TblPuestos en el campo DonativoPuesto, el problema que tengo es, que si yo quiero poner en el subformulario los 10€ en vez de los 9€, me cambia el precio a 10€ de todos los puestos con ese nombre y yo lo que quiero es, que me ponga solo los 10€ en ese puesto y solo a ese hermano.
    Muchas gracias.

    Responder
    • Hola Francisco,

      Abre un hilo en el foro y sube la BBDD para echarte una mano.

      Saludos.

      Responder
      • Me he registrado pero no me envía el correo de confirmación para poder estar registrado y entrar en el foro, lo he intentado con dos cuentas diferentes y no me lo envia.

        Responder
        • Mira a ver si te ha llegado el restablecimiento de contraseña.

          Saludos.

          Responder
  2. Hola he utilizado este código para abrir un informe desde un cuadro combinado, al elegir el informe que quiero abrir desde el combo, en vez de abrirse me manda a imprimir en pdf, algo no tengo bien, este es el código:

    Select Case combo_donativos.ListIndex
    Case 0
    DoCmd.OpenReport "Rpt_Donativos_2025"
    Case 1
    DoCmd.OpenReport "Rpt_Donativos_2024"
    End Select

    Responder
    • Hola Francisco,

      Cuando utilizas DoCmd.OpenReport en VBA, el comportamiento predeterminado es abrir el informe en modo de impresión. Para abrirlo en modo vista previa o vista de diseño, necesitas especificar el parámetro adecuado en el método.
      Prueba con esto,

      DoCmd.OpenReport "Rpt_Donativos_2025", acViewPreview

      Aquí, el segundo argumento acViewPreview indica que el informe se abrirá en vista previa.

      Si lo que buscas es abrirlo en modo diseño, puedes usar:

      DoCmd.OpenReport "Rpt_Donativos_2025", acViewDesign

      Saludos.

      Responder
      • Muchísimas gracias, funciona perfecto.

        Responder
  3. Hola buenas tardes, me podrías ayudar? Intento hacer esa autonumeración en un campo de RECIBOS, pero que esta autonumeración no avance si se selecciona "SI" en el campo REQUIERE FACTURA. Se puede? Muchos saludos!

    Responder
    • Hola Claudia,

      Claro que se puede! Sólo tienes que completar las condiciones del recordset con la cláusula WHERE,

      Set rst = dbs.OpenRecordset("Select * from Facturas where Requierefactura=False")

      De esta manera, solo seleccionas los registros que cumplan los requisitos para ser numerados.

      Si tienes cualquier duda, abre un hilo en el foro, sube el programa y lo miramos.

      Saludos.

      Responder
    • Yo lo que tengo es una tabla "TablaHermanos" con unos 230 registros con datos de los hermanos, y con un campo llamado "EstadoHermano" y en este campo un cuadro combinado con dos opciones, "Activo" y "Baja" y lo que necesito es que me numere el campo "NumeroReal" consecutivamente todas las filas en las que el campo *EstadoHermano" sea "Activo" y en los que está activado "Baja" le tengo puesto un filtro a ese campo para que solo me muestre los "Activo"
      Muchas gracias

      Responder
      • Hola Francisco,

        Aquí tienes el código que tienes que insertar en el botón Numerar para lanzar la consulta de actualización. Saludos.

        Private Sub Numerar_Click()

        Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim i As Integer

        Set db = CurrentDb
        Set rs = db.OpenRecordset("SELECT * FROM TablaHermanos WHERE EstadoHermano = 'Activo'")

        i = 1

        Do While Not rs.EOF

        rs.Edit
        rs("NumeroReal").Value = i
        rs.Update
        i = i + 1
        rs.MoveNext

        Loop

        rs.Close
        Set rs = Nothing
        Set db = Nothing

        MsgBox "Numeración completa.", vbInformation

        End Sub

        Responder
        • Muchísimas gracias, funciona perfecto.

          Responder
  4. Hola,
    ¿Qué pasa si el campo proveedor no esta ordenado alfabeticamente? existe alguna manera de que encuentre el último id de ese proveedor y lo actualice de manera secuencial

    Responder
    • Hola Diego,

      Tendrías que crear un lazo interno que volviese a recorrer todos los registros buscando la última id para ese proveedor y factura. Este método no sería muy eficiente porque, dependiendo del número de registros, puede llegar a ralentizar bastante el proceso.

      Si es tu caso, te aconsejaría ordenar previamente la tabla según los criterios a utilizar para realizar la numeración y posteriormente hacerlo tal cual lo tienes en el ejemplo.

      Saludos.

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Últimas publicaciones

Categorías

abril 2025
LMXJVSD
 123456
78910111213
14151617181920
21222324252627
282930 

Debates en el foro

Contacto