Formulario para Buscar datos con Multiples criterios en VBA Macros Excel

Aprende a programar el botón buscar en Formularios VBA con Macros en Excel. Permiten la búsqueda de datos utilizando múltiples criterios. Exploraremos cómo inicializar formularios y cargar datos, cómo implementar funcionalidades de búsqueda que filtran registros en base a diferentes parámetros.

1. Traer Datos de Excel a Listbox1. Evento Initialize

Private Sub UserForm_Initialize()

Me.ListBox1.RowSource = "CLIENTES"
Me.ListBox1.ColumnCount = 6

Me.ListBox1.RowSource = Clear
Me.ListBox1 = Clear

Final_Total = Hoja1.Range("B" & Rows.Count).End(xlUp).Row

Y = 0

For fila = 5 To Final_Total
        Me.ListBox1.AddItem
        'La Columna y la Fila comienza en 0
        Me.ListBox1.List(Y, 0) = ActiveSheet.Cells(fila, 2).Value
        Me.ListBox1.List(Y, 1) = ActiveSheet.Cells(fila, 3).Value
        Me.ListBox1.List(Y, 2) = ActiveSheet.Cells(fila, 4).Value
        Me.ListBox1.List(Y, 3) = ActiveSheet.Cells(fila, 5).Value
        Me.ListBox1.List(Y, 4) = ActiveSheet.Cells(fila, 6).Value
        Me.ListBox1.List(Y, 5) = ActiveSheet.Cells(fila, 10).Value
        
        Y = Y + 1
Next fila

End Sub

Explicación del Código

Inicialización del UserForm

Private Sub UserForm_Initialize()

Este evento se ejecuta automáticamente cuando se inicializa el UserForm.

Configuración Inicial del ListBox

Me.ListBox1.RowSource = "CLIENTES"
Me.ListBox1.ColumnCount = 6

Me.ListBox1.RowSource = Clear
Me.ListBox1 = Clear
  1. Me.ListBox1.RowSource = "CLIENTES": Asigna una fuente de datos llamada «CLIENTES» al ListBox1.
  2. Me.ListBox1.ColumnCount = 6: Establece que el ListBox1 tendrá 6 columnas.
  3. Me.ListBox1.RowSource = Clear y Me.ListBox1 = Clear: Limpia cualquier dato existente en el ListBox1.

Encontrar la Última Fila con Datos

Final_Total = Hoja1.Range("B" & Rows.Count).End(xlUp).Row

Final_Total obtiene el número de la última fila con datos en la columna B de Hoja1.

Inicializar Contador de Filas para el ListBox

Y = 0

Y se utiliza para contar las filas en el ListBox.

Cargar Datos en el ListBox

For fila = 5 To Final_Total
        Me.ListBox1.AddItem
        'La Columna y la Fila comienza en 0
        Me.ListBox1.List(Y, 0) = ActiveSheet.Cells(fila, 2).Value
        Me.ListBox1.List(Y, 1) = ActiveSheet.Cells(fila, 3).Value
        Me.ListBox1.List(Y, 2) = ActiveSheet.Cells(fila, 4).Value
        Me.ListBox1.List(Y, 3) = ActiveSheet.Cells(fila, 5).Value
        Me.ListBox1.List(Y, 4) = ActiveSheet.Cells(fila, 6).Value
        Me.ListBox1.List(Y, 5) = ActiveSheet.Cells(fila, 10).Value
        
        Y = Y + 1
Next fila
  1. Bucle For: Recorre las filas desde la 5 hasta la Final_Total.
  2. Agregar Nueva Fila al ListBox: Me.ListBox1.AddItem agrega una nueva fila vacía al ListBox.
  3. Asignar Valores a las Celdas del ListBox:
    • Me.ListBox1.List(Y, 0) obtiene el valor de la celda en la fila actual y columna 2.
    • Me.ListBox1.List(Y, 1) obtiene el valor de la celda en la fila actual y columna 3.
    • Me.ListBox1.List(Y, 2) obtiene el valor de la celda en la fila actual y columna 4.
    • Me.ListBox1.List(Y, 3) obtiene el valor de la celda en la fila actual y columna 5.
    • Me.ListBox1.List(Y, 4) obtiene el valor de la celda en la fila actual y columna 6.
    • Me.ListBox1.List(Y, 5) obtiene el valor de la celda en la fila actual y columna 10.
  4. Incrementar Contador: Y = Y + 1 incrementa el contador Y para la siguiente fila del ListBox.

Finalización del Evento

End Sub

Este marca el fin del evento Initialize.

2. Código en el Botón Buscar

Private Sub CommandButton1_Click()

Me.ListBox1.RowSource = Clear
Me.ListBox1 = Clear
Final_Total = Hoja1.Range("B" & Rows.Count).End(xlUp).Row

Y = 0

For fila = 5 To Final_Total

nombre = ActiveSheet.Cells(fila, 15).Value

If UCase(nombre) Like "*" & UCase(TextBox1.Value) & "*" Then
       
            Me.ListBox1.AddItem
            
            Me.ListBox1.List(Y, 0) = ActiveSheet.Cells(fila, 2).Value
            Me.ListBox1.List(Y, 1) = ActiveSheet.Cells(fila, 3).Value
            Me.ListBox1.List(Y, 2) = ActiveSheet.Cells(fila, 4).Value
            Me.ListBox1.List(Y, 3) = ActiveSheet.Cells(fila, 5).Value
            Me.ListBox1.List(Y, 4) = ActiveSheet.Cells(fila, 6).Value
            Me.ListBox1.List(Y, 5) = ActiveSheet.Cells(fila, 10).Value
            
            Y = Y + 1

End If

Next fila


End Sub

Explicación del Código

Evento de Click del Botón

Private Sub CommandButton1_Click()

Este evento se ejecuta cuando se hace clic en CommandButton1.

Limpieza del ListBox

vbaCopiar códigoMe.ListBox1.RowSource = Clear
Me.ListBox1 = Clear

Estas líneas limpian cualquier dato existente en el ListBox1.

Encontrar la Última Fila con Datos

Final_Total = Hoja1.Range("B" & Rows.Count).End(xlUp).Row

Final_Total obtiene el número de la última fila con datos en la columna B de Hoja1.

Inicializar Contador de Filas para el ListBox

Y = 0

Y se utiliza para contar las filas en el ListBox.

Bucle para Buscar y Filtrar Datos

For fila = 5 To Final_Total

    nombre = ActiveSheet.Cells(fila, 15).Value

    If UCase(nombre) Like "*" & UCase(TextBox1.Value) & "*" Then
       
        Me.ListBox1.AddItem
        
        Me.ListBox1.List(Y, 0) = ActiveSheet.Cells(fila, 2).Value
        Me.ListBox1.List(Y, 1) = ActiveSheet.Cells(fila, 3).Value
        Me.ListBox1.List(Y, 2) = ActiveSheet.Cells(fila, 4).Value
        Me.ListBox1.List(Y, 3) = ActiveSheet.Cells(fila, 5).Value
        Me.ListBox1.List(Y, 4) = ActiveSheet.Cells(fila, 6).Value
        Me.ListBox1.List(Y, 5) = ActiveSheet.Cells(fila, 10).Value
        
        Y = Y + 1

    End If

Next fila

3. Seleccionar Código al hacer clic en un registro del Listbox1

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Codigo_Registro As String
Codigo_Registro = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
MsgBox Codigo_Registro

End Sub

Explicación del Código

Declaración del Evento DblClick

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Este evento se ejecuta cuando el usuario hace doble clic en un elemento del ListBox1.

Declaración de la Variable para el Código del Registro

Dim Codigo_Registro As String

Se declara una variable Codigo_Registro de tipo String para almacenar el código del registro seleccionado.

Obtención del Código del Registro Seleccionado

Codigo_Registro = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)

Esta línea obtiene el valor de la primera columna (índice 0) del elemento seleccionado en el ListBox1:

  • Me.ListBox1.ListIndex devuelve el índice del elemento seleccionado en el ListBox.
  • Me.ListBox1.List(Me.ListBox1.ListIndex, 0) accede al valor en la primera columna del elemento seleccionado.

Mostrar el Código del Registro en un Mensaje

MsgBox Codigo_Registro

Se muestra el código del registro seleccionado en un cuadro de mensaje.

Creación de un formulario con botones: Registrar, Modificar, Eliminar, Limpiar y Buscar .

Related Articles

Responses

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

  1. Al escribir el código en VBA no me aparece nada en la ListBox, incluso copiando el código que aparece arriba

  2. Hola, Buen día.
    Pudieras ilustrarme como quedaría el código del botón «Buscar» para que muestre más de 10 columnas?
    Gracias de antemano.

  3. Descubrí mi error anterior… Pero ahora me marca error en Me.ListBox1.AddItem. Error ’70’ Permiso denegado 🙁