Macro VBA Excel para buscar en 3 hojas según condición

Esta macro

Private Sub cmbBusque_Click()
'Por.Dante Amor
    'Filtrar por fecha
    Dim U As Double, i As Double
    Dim h1 As Object, h2 As Object
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set h1 = Sheets("Productos")
    Set h2 = Sheets("Filtro")
    h2.Cells.Clear
    '
    If DTPicker1 > DTPicker2 Then
        MsgBox "La fecha inicial no puede ser superior a la final", vbExclamation, "REVISAR FECHAS"
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
    U = h1.Range("E" & Rows.Count).End(xlUp).Row
    h1.Range("A1:g" & U).AutoFilter
    h1.Range("A1:g" & U).AutoFilter Field:=5, Criteria1:=">=" & Format(DTPicker1, "mm/dd/yyyy"), _
                             Operator:=xlAnd, Criteria2:="<=" & Format(DTPicker2, "mm/dd/yyyy")
    If h1.Range("E" & Rows.Count).End(xlUp).Row = 1 Then
        MsgBox "No existen registros", vbExclamation, "REVISAR FECHAS"
        If h1.AutoFilterMode Then h1.AutoFilterMode = False
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    h1.Range("A1:g" & U).Copy h2.[A1]
    ListBox1.RowSource = h2.Name & "!A2:g" & h2.Range("g" & Rows.Count).End(xlUp).Row
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
''' Cuenta y muestra cantidad de items en el ListBox
    txtExistencia.Text = ListBox1.ListCount
'''
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

ejecuta una busqueda(filtra) entre fechas dentro de una hoja (Productos); Fecha inicial y fecha final.

Como se ve en el formulario, le agregue 3 OptionBotton con nombre de hoja respectiva

Se agradece la buena voluntad en darme esa mano de ayuda, en editar la macro para que me busque en la hoja según la condición true del OptionBotton.

1 Respuesta

Respuesta
1

[Hola

Prueba con esto


Valora la respuesta para finalizar saludos!

Private Sub cmbBusque_Click()
'Por.Dante Amor
'Act. Adriel
    'Filtrar por fecha
    Dim U As Double, i As Double
    Dim h1 As Object, h2 As Object
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    '
    If OptionButton1 Then
        Set h1 = Sheets("Productos")
    ElseIf OptionButton2 Then
        Set h1 = Sheets("Entrada")
    ElseIf OptionButton3 Then
        Set h1 = Sheets("Salida")
    End If
    '
    Set h2 = Sheets("Filtro")
    h2.Cells.Clear
    '
    If DTPicker1 > DTPicker2 Then
        MsgBox "La fecha inicial no puede ser superior a la final", vbExclamation, "REVISAR FECHAS"
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
    U = h1.Range("E" & Rows.Count).End(xlUp).Row
    h1.Range("A1:g" & U).AutoFilter
    h1.Range("A1:g" & U).AutoFilter Field:=5, Criteria1:=">=" & Format(DTPicker1, "mm/dd/yyyy"), _
                             Operator:=xlAnd, Criteria2:="<=" & Format(DTPicker2, "mm/dd/yyyy")
    If h1.Range("E" & Rows.Count).End(xlUp).Row = 1 Then
        MsgBox "No existen registros", vbExclamation, "REVISAR FECHAS"
        If h1.AutoFilterMode Then h1.AutoFilterMode = False
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    h1.Range("A1:g" & U).Copy h2.[A1]
    ListBox1.RowSource = h2.Name & "!A2:g" & h2.Range("g" & Rows.Count).End(xlUp).Row
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
''' Cuenta y muestra cantidad de items en el ListBox
    txtExistencia.Text = ListBox1.ListCount
'''
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

Hola Adriel Ortiz

La modificcion, funciona solo con el Option de Productos pero si activo el de Entrada o de Salida, me dice que "No hay Registros" y dentro de la hoja, si los hay

Tiene en cuenta que en los DTPicker coloco las fechas necesarias y correctas para que me muestre las fechas desde la inicial hasta la final en el ListBox

Envíame tu archivo para revisarlo saludos! [email protected] 

En la hoja Producto la fecha está en la columna " E" y en entrada y salida está en la "D".

En conclusión todas las hojas la fecha debe estar en la columna E

Hola Adriel

Tienes toda la razón, cosa que no me había pasado por la mente.

Ayúdame a solucionar este punto porque como ves, la Entrada y la Salida son menos columnas, ahí no hace falta la Ubicación ni el precio. Aquí como desconocedor de macros, en mi ignorante conocimiento, seria ¿ocultar la columna DE y pasar la macro respectiva de insertar en DE seria insertar en E?Seria en la macro de Validación, después de la DE oculta, avanzar una letra

    'registro de entrada / salida en su hoja respectiva
    codigo = lista2.List(lista2.ListIndex, 0)
    U = h.Range("A" & Rows.Count).End(xlUp).Row + 1
    h.Cells(U, "A") = codigo
    h.Cells(U, "B") = lista2.List(lista2.ListIndex, 1)
    h.Cells(U, "C") = wcantidad
    h.Cells(U, "D") = DTPicker1.Value 'PASAR A E
    h.Cells(U, "E") = lista2.List(lista2.ListIndex, 6) 'PASAR A F

¿Será correcto?

Si, pero otro dilema me aparece. En las 3 hojas los datos comienzan en línea 2.

Al buscar las fechas me muestra de hoja Productos, en el listbox me muestra los títulos más los datos encontrados y en las hojas Entrada y Salida me muestra títulos (Col8umna A, Columna B, Columna C etc y siguen los títulos más los datos, ¿siendo la misma macro CON EL MISMO BUTTON?

[Hola 

La información no es precisa por que las hojas tienen diferentes cantidades de encabezado.

Entonces lo harías por separado

Así

Private Sub CommandButton1_Click()
'Por.Dante Amor
'Act. Adriel
    'Filtrar por fecha
    Dim u As Double, i As Double
    Dim h1 As Object, h2 As Object, h3, h4 As Object
    '
    'Primer option PRODUCTOS
    If OptionButton1 Then
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    '
        Set h1 = Sheets("Productos")
        Set h2 = Sheets("Filtro")
        h2.Cells.Clear
    '
    If DTPicker1 > DTPicker2 Then
        MsgBox "La fecha inicial no puede ser superior a la final", vbExclamation, "REVISAR FECHAS"
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
    u = h1.Range("E" & Rows.Count).End(xlUp).Row
    h1.Range("A1:g" & u).AutoFilter
    h1.Range("A1:g" & u).AutoFilter Field:=5, Criteria1:=">=" & Format(TextBox1, "mm/dd/yyyy"), _
                             Operator:=xlAnd, Criteria2:="<=" & Format(TextBox2, "mm/dd/yyyy")
    If h1.Range("E" & Rows.Count).End(xlUp).Row = 1 Then
        MsgBox "No existen registros", vbExclamation, "REVISAR FECHAS"
        If h1.AutoFilterMode Then h1.AutoFilterMode = False
        Application.ScreenUpdating = True
        Exit Sub
    End If
    '
    h1.Range("A1:g" & u).Copy h2.[A1]
    ListBox1.RowSource = h2.Name & "!A2:g" & h2.Range("g" & Rows.Count).End(xlUp).Row
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
''' Cuenta y muestra cantidad de items en el ListBox
    'txtExistencia.Text = ListBox1.ListCount
'''
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    End If
    ' option ENTRADA
        If OptionButton2 Then
        '
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
    '
            Set h3 = Sheets("Entrada")
            Set h2 = Sheets("Filtro")
            h2.Cells.Clear
        '
        If DTPicker1 > DTPicker2 Then
            MsgBox "La fecha inicial no puede ser superior a la final", vbExclamation, "REVISAR FECHAS"
            Application.ScreenUpdating = True
            Exit Sub
        End If
        '
        If h3.AutoFilterMode Then h3.AutoFilterMode = False
        u = h3.Range("E" & Rows.Count).End(xlUp).Row
        h3.Range("A1:E" & u).AutoFilter
        h3.Range("A1:E" & u).AutoFilter Field:=5, Criteria1:=">=" & Format(TextBox1, "mm/dd/yyyy"), _
                                 Operator:=xlAnd, Criteria2:="<=" & Format(TextBox2, "mm/dd/yyyy")
        If h3.Range("E" & Rows.Count).End(xlUp).Row = 1 Then
            MsgBox "No existen registros", vbExclamation, "REVISAR FECHAS"
            If h3.AutoFilterMode Then h3.AutoFilterMode = False
            Application.ScreenUpdating = True
            Exit Sub
        End If
        '
        h3.Range("A1:E" & u).Copy h2.[A1]
        ListBox1.RowSource = h2.Name & "!A2:E" & h2.Range("E" & Rows.Count).End(xlUp).Row
        If h3.AutoFilterMode Then h3.AutoFilterMode = False
    ''' Cuenta y muestra cantidad de items en el ListBox
        'txtExistencia.Text = ListBox1.ListCount
    '''
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        End If
   ' option SALIDA
        If OptionButton3 Then
        '
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
    '
            Set h4 = Sheets("Salida")
            Set h2 = Sheets("Filtro")
            h2.Cells.Clear
        '
        If DTPicker1 > DTPicker2 Then
            MsgBox "La fecha inicial no puede ser superior a la final", vbExclamation, "REVISAR FECHAS"
            Application.ScreenUpdating = True
            Exit Sub
        End If
        '
        If h4.AutoFilterMode Then h4.AutoFilterMode = False
        u = h4.Range("E" & Rows.Count).End(xlUp).Row
        h4.Range("A1:E" & u).AutoFilter
        h4.Range("A1:E" & u).AutoFilter Field:=5, Criteria1:=">=" & Format(TextBox1, "mm/dd/yyyy"), _
                                 Operator:=xlAnd, Criteria2:="<=" & Format(TextBox2, "mm/dd/yyyy")
        If h4.Range("E" & Rows.Count).End(xlUp).Row = 1 Then
            MsgBox "No existen registros", vbExclamation, "REVISAR FECHAS"
            If h4.AutoFilterMode Then h4.AutoFilterMode = False
            Application.ScreenUpdating = True
            Exit Sub
        End If
        '
        h4.Range("A1:E" & u).Copy h2.[A1]
        ListBox1.RowSource = h2.Name & "!A2:E" & h2.Range("E" & Rows.Count).End(xlUp).Row
        If h4.AutoFilterMode Then h4.AutoFilterMode = False
    ''' Cuenta y muestra cantidad de items en el ListBox
        'txtExistencia.Text = ListBox1.ListCount
    '''
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        End If
End Sub

Hice la prueba con textbox ya lo actualizas a DTPicker

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas