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.
-
Búsqueda.
-
Alta.
-
Baja.
-
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.
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.
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.
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.
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
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
Es por que el tipo de archivo .xlsm es para versiones 2007 en adelante.
Descárgate este archivo con compatiblidad para 2003.
https://www.dropbox.com/s/qfkv32ctmegva80/Alta%2C%20Baja%20y%20actualizaci%C3%B3n%20de%20registros%20con%20b%C3%BAsqueda%20en%20ListBox.xls
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
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.
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.
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.
Disculpa Sergio, se podrá incluir el hipervínculo cuando este dando de alta el usuario dentro del formulario ??
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)
Genial, lo estaré esperando con ansias. En que categoría lo vas a subir… Base de datos, Macros??
Gracias y Saludos.
Bases de datos, Macros, Excel vba, Forms.
Hola Sergio necesito que me colabores con el codigo para este formulario
mi correo electronico juanmanuelgomez91@hotmail.com
Aquí el ejemplo de formulario con imágenes.
http://blogs.itpro.es/exceleinfo/2014/04/16/formulario-de-alta-y-bsqueda-de-registros-incluyendo-imgenes/
Será cuestión de adecuarlo según las necesidades.
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
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
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!!
Me alegra que lo hayas solucionado.
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!
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!
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
Necesito lo mismo!!! he tratado modificando y usando otros comandos pero nada! si alguien pudiera ayudar!
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
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?
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
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.
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!
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.
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
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
hola.!. , justo lo queria, pero como se podria hacer para conectar a access? y realizar las mismas funciones, alta, buscar y elimiar..
Qué tal. Para lo que deseas, te recomiendo la página de Abraham Valencia y te descargues un ejemplo llamado: 9- Ingresar, eliminar, modificar y ver
registros de Access a través de un Userform en Excel (VBA). http://abrahamexcel.webcindario.com/Ejemplos.html
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