Formularios para búsqueda, alta, baja y actualización de registros en Excel

En este ejemplo les comparto algunos formularios con las acciones más comunes y solicitadas al momento de manejo de registros en bases de datos.

  1. Búsqueda.
  2. Alta.
  3. Baja.
  4. Actualización.

Tenemos una tabla con los encabezados ID, USARIO, DEPARTAMENTO y PUESTO, donde obligatoriamente el ID debe ser un registro único para que todas las acciones funcionen bien.

El primer formulario tendrá las acciones de ALTA y BUSCAR.

Acciones de alta y búsqueda en Excel

Figura 1. Acciones de Alta y búsqueda.

Ver el video Alta, Baja, Búsqueda y actualización de registros

Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.

Alta de registros

Al presionar el botón Alta se mostrará el segundo formulario para dar de alta datos en la tabla. Este formulario tiene la capacidad de detectar si el ID está dado de alta en la tabla y no podremos dar de alta el registro a menos que indiquemos otro ID.

Detectar registro duplicado en Excel

Figura 2. No se podré registrar un ID duplicado.

Búsqueda de registros

Al registrar un ID que no esté repetido en la tabla, ahora procedemos a dar click en el botón Buscar del formulario de acciones.

La búsqueda se hace por departamento y ésta usa un operador LIKE para encontrar todos los registros similares, es decir, que contengan el texto a buscar.

Al filtrar nuestra búsqueda en el ListBox se mostrarán todos los resultados que coinciden con el texto buscado.

Filtro de búsqueda en ListBox de Excel

Figura 3. Resultado de la búsqueda en un ListBox.

Eliminar registros

Al tener el filtro con los resultados devueltos podemos elegir cualquiera de la lista y al presionar Eliminar se dará de baja el registro en la base de datos.

Actualizar registros

De la misma manera en que podemos eliminar registros, si damos click en el botón Modificar se mostrará otro formulario donde podremos modificar los campos del registro seleccionado.

Actualizar registros en Excel con formulario

Figura 4. Actualización de datos.

Código de las macros

Alta de registros

'Alta de un registro
Private Sub CommandButton1_Click()
'Declaración de variables
'
Dim strTitulo As String
Dim Continuar As String
Dim TransRowRng As Range
Dim NewRow As Integer
Dim Limpiar As String
'
strTitulo = "EXCELeINFO"
'
Continuar = MsgBox("Dar de alta los datos?", vbYesNo + vbExclamation, strTitulo)
If Continuar = vbNo Then Exit Sub
'
Cuenta = Application.WorksheetFunction.CountIf(Range("A:A"), Me.txtID)
'
If Cuenta > 0 Then
    '
    MsgBox "El ID '" & Me.txtID & "' ya se encuentra registrado", vbExclamation, strTitulo
    '
Else
    '
    Set TransRowRng = ThisWorkbook.Worksheets("Hoja1").Cells(1, 1).CurrentRegion
    NewRow = TransRowRng.Rows.Count + 1
    With ThisWorkbook.Worksheets("Hoja1")
        .Cells(NewRow, 1).Value = Me.txtID
        .Cells(NewRow, 2).Value = Me.txtUsuario
        .Cells(NewRow, 3).Value = Me.txtDepartamento
        .Cells(NewRow, 4).Value = Me.txtPuesto
    End With
    '
    MsgBox "Alta exitosa.", vbInformation, strTitulo
    '
    Unload Me
End If

Búsqueda de registros

'Abrir el formulario para modificar
Private Sub CommandButton3_Click()
If Me.ListBox1.ListIndex < 0 Then
    MsgBox "No se ha elegido ningún registro", vbExclamation, "EXCELeINFO"
Else
    frmModificar.Show
End If
End Sub
'
'Eliminar el registro
Private Sub CommandButton4_Click()
Pregunta = MsgBox("Está seguro de eliminar el registro?", vbYesNo + vbQuestion, "EXCELeINFO")
If Pregunta <> vbNo Then
    ActiveCell.EntireRow.Delete
End If
Call CommandButton5_Click
End Sub
'
'Mostrar resultado en ListBox
Private Sub CommandButton5_Click()
On Error GoTo Errores
If Me.txtFiltro1.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
Filas = Range("a1").CurrentRegion.Rows.Count
For i = 2 To Filas
    If LCase(Cells(i, j).Offset(0, 2).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then
        Me.ListBox1.AddItem Cells(i, j)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
    Else
    End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation, "EXCELeINFO"
End Sub
'
'Activar la celda del registro elegido
Private Sub ListBox1_Click()
Range("a2").Activate
Cuenta = Me.ListBox1.ListCount
Set Rango = Range("A1").CurrentRegion
For i = 0 To Cuenta - 1
    If Me.ListBox1.Selected(i) Then
        Valor = Me.ListBox1.List(i)
        Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
    End If
Next i
End Sub
'
'Dar formato al ListBox y traer datos de la tabla
Private Sub UserForm_Initialize()
For i = 1 To 4
    Me.Controls("Label" & i) = Cells(1, i).Value
Next i

With ListBox1
    .ColumnCount = 4
    .ColumnWidths = "60 pt;60 pt;60 pt;60 pt"
End With
End Sub

Actualizar registros

'Actualizar el registro
Private Sub CommandButton1_Click()
For i = 1 To 4
    ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value
Next i
Unload Me
End Sub
'
'Llenar los cuadro de texto con los datos del registro elegido
Private Sub UserForm_Initialize()
For i = 1 To 4
    Me.Controls("TextBox" & i).Value = ActiveCell.Offset(0, i - 1).Value
Next i
End Sub

Descarga el archivo de ejemplo

:: Descargar el ejemplo Alta, Baja y actualización de registros con búsqueda en ListBox.rar

31 thoughts on “Formularios para búsqueda, alta, baja y actualización de registros en Excel”

  1. eL BOTON acciones no me funciona en Office 2003.
    No sabria decir si funciona en 2007 o 2010.
    Edito:
    Que podria hacerse para que al dar de alta o baja el id auto-aparezca en la casilla de ID en el form de alta o baja, ¿porque?

    Si doy de alta un producto tengo que ponerme a adivinar cual es el ultimo ID registrado.

    Sugerencia: Un cuadro de texto o label que capte el “ultimo ID registrado” y otro label que diga el “ID sigueinte” a dar de alta.
    Vei el codigo pero es lo mismo que ver una telaraña sin saber como construirla, para mi es cosa que no está a mi alcance

      1. Habia yo enviado este mensaje y no lo he visto en el post

        Gracias Sergio por responder y estar pendiente como siempre, Gracias
        Quiero mencionarte que tiene la compatibilidad instalada desde que lo instalo (siempre lo hago) en 2013 si funciona.
        Lo guarde con la extensión para 2003 y tampoco me funcionan en 2003.
        A parte de la sugerencia que te hice anteriormente, sobre el ID, quiero decirte la falla que me presenta en 2013.
        Busco una opción, selecciono Ejemplo: el ID 7, mando eliminar y lo hace pero el ListBox no se actualiza correctamente, Elimina si el ID 7 (línea) de la hoja y del ListBox pero en el ListBox deja de aparecer además del 7 que ya no existe, los IDs 8 y 9.
        ¿Qué puedes hacer al respecto?.
        Gracias por tu trabajo compartido sin pedir nada a cambio.
        Hasta el momento son las fallas que le he encontrado
        HE visto ahora que al hacerle un cambio de búsqueda para la columna B, si el ListBox se rellena correctamente, anteriormente no me lo hace

  2. Que tal Sergio, Insisto, tu pagina esta genial, me ha ayudado mucho, de hecho ya pude resolver el problema que tenia.

    Ahora me surgió otro, espero y me puedas ayudar o si tienes algún ejemplo en cual basarme y agregarlo a mi archivo.

    En mi Formulario tengo la Alta, Baja y Consulta de Alumnos pero quiero agregar fotos de mis Alumnos dentro del Formulario Alta y a su que a la hora de consultar el alumno me aparezca su foto que di de alta.

    Tendrás algún ejemplo que me ayude ??

    Gracias eres todo un héroe de Excel. 😀
    Saludos.

  3. Espero y me puedas ayudar o si tienes algún ejemplo en cual basarme y poder adecuarlo a mi archivo.

    En mi Formulario tengo la Alta, Baja y Consulta de Alumnos pero quiero agregar fotos de mis Alumnos dentro del Formulario Alta y a su que a la hora de consultar el alumno me aparezca su foto que di de alta.

    Tendrás algún ejemplo que me ayude ??

    Gracias eres todo un héroe de Excel. 😀
    Saludos.

  4. Que tal Sergio, me acabo de percatar, que si logro insertar las fotos de los alumnos en el archivo, este mismo pesaría mucho mas de 100 MB.
    Entonces se me ocurrió si se puede dentro del mismo formulario a la hora consultar el alumno me de la opción con un botón de consultar la foto de “x” Alumno con un hipervínculo ??
    Se podrá??
    Gracias y Saludos.

  5. Disculpa Sergio, se podrá incluir el hipervínculo cuando este dando de alta el usuario dentro del formulario ??

    1. sergioacamposh

      Lo ideal será tener las imágenes en una carpeta y que Excel haga referencia a esa carpeta y al nombre de cada archivo, así no aumentamos el tamaño del archivo.

      Tengo un ejemplo sin terminar al respecto. Pronto lo termino y lo comparto.

      Te adelanto que la clave será con un control de imagen que jale la ruta de cada imagen y usando el código:

      Image1.Picture = LoadPicture(RutaImagen)

      1. Genial, lo estaré esperando con ansias. En que categoría lo vas a subir… Base de datos, Macros??
        Gracias y Saludos.

  6. Pingback: EXCELeINFO – Excel vba e información - Formulario para filtrar datos de una tabla en ListBox eligiendo la columna de búsqueda en un ComboBox en Excel

  7. Hola Sergio,

    Para poder adecuar el codigo a más columnas, con el botón alta no hay problema añadiendo .Cells(NewRow, ‘número de la columna).Value = Me.’nombre del textbox.

    Pero para adaptar los demás aspectos del código me pierdo y necesitaría ampliarlo en varias columnas (te parecerá exagerado pero serian unas 18 columnas en total jaja). Lo que me pasa que el código que utilizas es muy distinto al programa que tengo yo desarrollado y al no ser especialista en esto creo que me estoy haciendo un lío.

    Saludos y acabo de descubrir este bolg y es una pasada! Felicidades de verdad

    1. Solucionado Sergio, No se porque pero modificaba al principio lo que modifico ahora del código y al final he entendido las variables que utilizabas y lo he podido adaptar a más columnas.

      Saludos!!

        1. Lo único que no logro Sergio es adaptar el ejemplo del filtro avanzado (el que te permite las variantes de filtrado entre las columnas “https://blogs.itpro.es/exceleinfo/2014/04/24/formulario-para-filtrar-datos-de-una-tabla-en-listbox-eligiendo-la-columna-de-bsqueda-en-un-combobox/”) y substituir el userform frmbuscar de este ejemplo. Me salta un error al substituir el código tal que así: error 381.

          Si me pudieras aclarar este pequeño inconveniente tendría listo la modificación de mi proyecto!

          Muchas gracias de antemano!

  8. Muy bueno! Sería posible agregar en el formulario de alta un combobox que traiga los codigos de ID desde un listado y que muestre solo los que no están ya utilizados?

    Si me pudieran ayudar con esto sería fantástico.

    Saludos!

  9. Joseph Sanchez

    hola Sergio existe alguna forma de usar esta parte desde otra hoja? lo he intentado modificar pero me da error

    Private Sub ListBox1_Click()
    Range(“a2”).Activate
    Cuenta = Me.ListBox1.ListCount
    Set Rango = Range(“A1”).CurrentRegion
    For i = 0 To Cuenta – 1
    If Me.ListBox1.Selected(i) Then
    Valor = Me.ListBox1.List(i)
    Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
    End If
    Next i
    End Sub

    1. Alfonso Contreras

      Necesito lo mismo!!! he tratado modificando y usando otros comandos pero nada! si alguien pudiera ayudar!

  10. Hola Sergio, me viene perfecto tu ejemplo pero me serviria mucho mas aun si fuera una combinacion de tu otro trabajo, “formulario-para-filtrar-datos-de-una-tabla-en-listbox-eligiendo-la-columna-de-bsqueda-en-un-combobox”

    Es decir este archivo, que permite alas, busqueda y modificacion pero con la opion de busqueda por todas las columnas no solo departamento.

    Te soy 100% sincero, intente hacerlo y por ahora vengo fracasando.

    Si me ayudas te reagradezco.

    Slds

    Gustavo

  11. Gabriel Durán

    Que tal?
    Necesito ocupar la opción de no repetir un ID, pero en mi programa, el formulario no esta en un UserForm sino en otra hoja de Excel, llamada “NuevoAlumno”, el ID se escribe en la celda E18… cómo lo puedo usar?

  12. hola buen día tengo un problemita con la extracción de datos el reto es en la opción de Actualizar ya que al tratar de traer los datos seleccionados en el (listBox)consulta y pedir que me los muestre solo me muestra un text box. manejo el mismo codigo que subistes solo que no puedo adaptarlo a mi formulario. en mi caso manejo combox box y txtbox.
    si le quito el “FOR” marca error si quito el textbox y pongo combobox también :/
    como le puedo hacer para que muestre la información en los distintos combox y textbox para su modificación ?

    Private Sub UserForm_Initialize()
    For i = 1 To 4
    Me.Controls(“TextBox” & i).Value = ActiveCell.Offset(0, i – 1).Value
    Next i
    End Sub

    anexo una imagen
    saludos cordiales

  13. Francesc Robles Pinto

    Buenas tardes; el ejemplo me fué muy útil, y con base al mismo he configurado un registro de datos para la imputación de materiales. Para que me entiendan, les expongo mi duda en base a este ejemplo. Imaginemos que he añadido una columna mas con los salarios en función del puesto de trabajo; en otra hoja me gustaría sumar los salarios del puesto denominado “Agente” que se encuentran en el departamento 5. Utilizando el formato “sumar.si.conjunto” en función de dos variables no me funciona porque es una tabla que se actualiza cada vez que se da de alta un registro, podrían decirme como realizar este tipo de sumas en otra hoja donde se resumen las sumas de los salarios en función del puesto y departamento? No sé si me he explicado bien. Muchas gracias.

  14. Buenas tardes!

    La verdad es que no pude dar en la tecla al modificar esta macro para un archivo propio.

    Cualquiera sea el intento me arroja error ’91’ – “Variable de Objeto o Bloque With no establecido” al seleccionar un item del listbox

    La linea que indica el error es:

    Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate

    Alguna idea????????

    Gracias!

  15. Buenas noches.
    Buen ejemplo, me ha venido genial, con alguna que otra modificación.
    Quisiera llegar un poco mas lejos y poder añadir cometarios en la celda elegida, esto es, que un formulario de las mismas características que el frmModificar, anotara los valores introducidos como comentario de la celda.
    Por mas que he modificado el código no lo he conseguido.
    Muchas gracias.

  16. Danilo Fernando Jiménez Ontane

    Hola

    Mira adapte tu partes de tu codigo a un formulario que tengo. Me funciona muy bien Busca registro, Seleciona registro y elimina registro sin problema. El inconveniente es que al cerrar el formulario me da error 1004 “No se puede encontrar la propiedad CurrentRegion de la clase Range”
    “Set Rango = Range(“A1″).CurrentRegion”
    Me podrias indicar cual es el inconveniente

    Saludos y Gracias

  17. victor sepulveda

    buenas noches, me pueden ayudar por favor al ingresar los registros le modifique el codigo para que en vez de la guardar la informacion en la hoja 1 le cambie por hoja2 pero al ir a modificar o eliminar cualquier registro lo esta buscando el la hoja 1 como hago para que busque la infromacion en la hoja 2, agradezco su colaboracion

  18. hola.!. , justo lo queria, pero como se podria hacer para conectar a access? y realizar las mismas funciones, alta, buscar y elimiar..

  19. Jonathan Del Valle

    hola sergio nesecito traer los datos al listbox desde otro libro no del mismo como seria el formato o instruccion pata el list box saludos

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top