Macro que debe buscar "x" dato en 2 columnas de varias hojas, donde la encuentra copiar y pegar en otra

Te cuento que estoy iniciándome en macros, con libros al lado pero así y todo no estoy pudiendo conjugar correctamente las funciones de buscar, copiar y pegar operando en diversas hojas te pido ayuda por favor, me atore.

Intento hacer una macro para que busque en 31 hojas (del mismo libro) que se llaman D1, D2, D3... D31, en las columnas "S" y "T" de cada hoja si tienen el dato "NO", de encontrarse ese dato, debe copiar la fila completa "A:W" en la hoja "Informe" en la siguiente fila vacía que ubique, siendo la primera fila a utilizar la n°3, así cuantas veces encuentre "NO".

Respuesta
1

Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim j As Double
    Dim filas_informe As Double
    filas_informe = 0
    j = 2
    For i = 1 To 31 'Mira hoja por hoja de la D1 a la D31
        With Worksheets("D" + CStr(i))

        ' Se usa el With para no tener que escribir todo el tiempo  Worksheets("D" + CStr(i))
            For j = 2 To 10 'Numero de filas, el 2 es por si tus datos tienen cabeceras

'El _ de abajo es para que los datos se puedan leer mejor, para no escribir todo en una línea

                   ' No funciona con todo
                    If ((.Range("S" + CStr(j)) = "NO") Or _
                         (.Range("T" + CStr(j)) = "NO")) Then

                    'Si las columnas S o T o las 2 tienen un NO entonces copia la fila
                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

'Se añade otra fila en la hoja informe
                        filas_informe = filas_informe + 1
                        'Todo esto en una fila

                        'Se copian los datos
                        Worksheets("Informe").Range("A" + CStr(filas_informe) + ":W" + CStr(filas_informe)).PasteSpecial (xlPasteAll)                   
                End If           
            Next j
        End With
    Next i
End Sub

Hola, funcionó perfecto.! Mil gracias.! Una consulta más, ¿cómo sería la modificación para que pegue a partir de la celda A3? Gracias de nuevo.

Donde pone

For j = 2 To 10 'Numero de filas, el 2 es por si tus datos tienen cabeceras

Has de poner

For j = 3 To 10 'Numero de filas, el 2 es por si tus datos tienen cabeceras

Hola de nuevo.!! Te consulto donde dice:

If ((.Range("S" + CStr(j)) = "NO") Or _
      (.Range("T" + CStr(j)) = "NO")) Then

¿Se puede poner así?:

If ((.Range("S" + CStr(j)) = "NO") Or _

      (.Range("T" + CStr(j)) = "NO") Or _

      (.Range("A"+ CStr(j)) <> " " And  ("S" + CStr(j)) = " " And ("T" + CStr(j)) = " ")) Then

Porque lo intente pero no me funcionó ¿que hice mal?¿Como debe ser?. Desde ya muchas gracias.

Se puede poner como quieras siempre que cumpla las condiciones.

Dime que quieres que haga y lo hago

Te cuento, SI y NO son las variables principales, pero en la operatoria diaria, han dejado celdas vacías, la cual también pasa a ser una variable principal porque significa "no gestión".

Luego en un segundo escalón prioritario, llenaron la celda con otras leyendas que no corresponden, es decir, hay una gestión no concluida.

Dado el volumen de datos, es engorroso supervisar hoja por hoja, por eso intento que me traiga los NO que determinan una gestión particular de otras personas, las vacías para reclamar la gestión inicial no realizada y las que completaron con cualquier dato para revisar si corresponde o no.

Se me complico en la primer semana de prueba en la realidad.!!!

Te super agradezco la ayuda que me das.!!!

Hola Antares, usando la base que me diste continúe por mas, te dejo la macro que me quedo luego de varios intentos, lo que quiero es que me traiga todo lo que sea diferente al "SI" hasta que encuentre la primera fila vacía, para que no me traiga el resto en blanco. ¿Me ayudas con este error? Me funcionaba así hasta que agregue lo que dejo remarcado en negrita e inclinado. ¿Tengo que usar .Value=" "?

Desde ya muchas gracias.

Private Sub CommandButton21_Click()

  Dim i As Integer

    Dim j As Double

    Dim filas_reporte As Double

    Borrar_reporte

    filas_reporte = 2

    j = 2

    For i = 1 To 31 'Mira hoja por hoja de la D1 a la D31

        With Worksheets("D" + CStr(i))

        ' Se usa el With para no tener que escribir todo el tiempo  Worksheets("D" + CStr(i))

            For j = 2 To 500 'Numero de filas, el 2 es por las cabeceras

'El _ de abajo es para que los datos se puedan leer mejor, para no escribir todo en una línea

                   ' No funciona con todo

                   If ((.Range("S" + CStr(j)) <> "SI") Or _

                        (.Range("T" + CStr(j)) <> "SI")) Then

                    'Si las columnas S o T o las 2 tienen un NO entonces copia la fila

                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

'Se añade otra fila en la hoja informe

                        filas_reporte = filas_reporte + 1

                        'Todo esto en una fila

                        'Se copian los datos

                        Worksheets("reporte").Range("A" + CStr(filas_reporte) + ":W" + CStr(filas_reporte)).PasteSpecial (xlPasteAll)

                    While (.Range("A" + CStr(j)) = " ")

                    Wend

                    End If

            Next j

        End With

    Next i

End Sub

Sub Borrar_reporte()

    Dim rCell As Range

    Set rCell = Range("A3:W1000")

            Do While Not IsEmpty(ActiveCell)

                rCell.Offset(0, 0).value = " "

                Set rCell = rCell.Offset(0, 0)

            Exit Do

            Loop

End Sub

Se me ocurrió que podrías filtrar los datos por la columna S por la palabra NO, y después la T por el NO también, pero luego pensándolo bien, has de ir 1 por 1 y ver si la fila esta filtrada. Y has de quitar los duplicados, si hay.

Intentalo haciendo esto, en vez de

If ((.Range("S" + CStr(j)) <> "SI") Or _

(. Range("T" + CStr(j)) <> "SI")) Then

Pon

If ((.Range("S" + CStr(j)) = "NO") Or _

      (.Range("T" + CStr(j)) = "NO")) Then

'Si los 2 son NO, copia los datos tal como está puesto, entonces pon

else

     if   (.Range("A"+ CStr(j)) <> " " And  _

            ("S" + CStr(j)) = " " And _

            ("T" + CStr(j)) = " ")) then

      'copia los datos tambien

     end if

end if

Te escribo el código por si te lías, lo de abajo ha de estar dentro del for

'El _ de abajo es para que los datos se puedan leer mejor, para no escribir todo en una línea

' No funciona con todo

                   If ((.Range("S" + CStr(j)) <> "NO") Or _

(. Range("T" + CStr(j)) <> "NO")) Then

'Si las columnas S o T o las 2 tienen un NO entonces copia la fila

                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

'Se añade otra fila en la hoja informe

                        filas_reporte = filas_reporte + 1

                        'Todo esto en una fila

                        'Se copian los datos

                        Worksheets("reporte").Range("A" + CStr(filas_reporte) + ":W" + CStr(filas_reporte)).PasteSpecial (xlPasteAll)        

                    else

                       if   (.Range("A"+ CStr(j)) <> " " And  _

                              ("S" + CStr(j)) = " " And _

                             ("T" + CStr(j)) = " ")) then

                    'Si las columnas S o T son "  "

                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

           'Se añade otra fila en la hoja informe

                        filas_reporte = filas_reporte + 1

                        'Todo esto en una fila

                        'Se copian los datos

                        Worksheets("reporte").Range("A" + CStr(filas_reporte) + ":W" + CStr(filas_reporte)).PasteSpecial (xlPasteAll)   

                      end if

                    End If

Me sigue trayendo filas completamente vacías.!! ¿Until A = " " serviría?

Como se está liando la cosa. Prueba con esto otro

    If ((.Range("S" + CStr(j)) <> "NO") Or _

(. Range("T" + CStr(j)) <> "NO")) Then

  if   (.Range("A"+ CStr(j)) <> " " And  _

                              ("S" + CStr(j)) = " " And _

                             ("T" + CStr(j)) = " ")) then

'Si las columnas S o T o las 2 tienen un NO entonces copia la fila

                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

'Se añade otra fila en la hoja informe

                        filas_reporte = filas_reporte + 1

                        'Todo esto en una fila

                        'Se copian los datos

                        Worksheets("reporte").Range("A" + CStr(filas_reporte) + ":W" + CStr(filas_reporte)).PasteSpecial (xlPasteAll)   

end if

end if   

1 respuesta más de otro experto

Respuesta
1

Te anexo la macro

Sub CopiarDias()
'Por.Dante Amor
    Set h1 = Sheets("informe")
    For Each h In Sheets
        If Left(UCase(h.Name), 1) = "D" Then
            For i = 1 To h.UsedRange.Rows(h.UsedRange.Rows.Count).Row
                If UCase(h.Cells(i, "S")) = "NO" Or UCase(h.Cells(i, "T")) = "NO" Then
                    u = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
                    If u < 3 Then u = 3
                    h.Range("A" & i & ":W" & i).Copy h1.Range("A" & u)
                End If
            Next
        End If
    Next
End Sub

S a l u d o s . D a n t e   A m o r

Recuerda valorar la respuesta.

Hola Dante, te dejo a continuación la macro que me quedo luego de varios intentos, lo que quiero es que me traiga todo lo que sea diferente al "SI" hasta que encuentre la primera fila vacia, para que no me traiga el resto en blanco. ¿Me ayudas a ver mi error? Me funcionaba así hasta que agrege lo que dejo remarcado en negrita e inclinado.

Desde ya muchas gracias.

Private Sub CommandButton21_Click()

  Dim i As Integer

    Dim j As Double

    Dim filas_reporte As Double

    Borrar_reporte

    filas_reporte = 2

    j = 2

    For i = 1 To 31 'Mira hoja por hoja de la D1 a la D31

        With Worksheets("D" + CStr(i))

        ' Se usa el With para no tener que escribir todo el tiempo  Worksheets("D" + CStr(i))

            For j = 2 To 500 'Numero de filas, el 2 es por las cabeceras

'El _ de abajo es para que los datos se puedan leer mejor, para no escribir todo en una línea

                   ' No funciona con todo

                   If ((.Range("S" + CStr(j)) <> "SI") Or _

                        (.Range("T" + CStr(j)) <> "SI")) Then

                    'Si las columnas S o T o las 2 tienen un NO entonces copia la fila

                        .Range("A" + CStr(j) + ":W" + CStr(j)).Copy

'Se añade otra fila en la hoja informe

                        filas_reporte = filas_reporte + 1

                        'Todo esto en una fila

                        'Se copian los datos

                        Worksheets("reporte").Range("A" + CStr(filas_reporte) + ":W" + CStr(filas_reporte)).PasteSpecial (xlPasteAll)

                    While (.Range("A" + CStr(j)) = " ")

                    Wend

                    End If

            Next j

        End With

    Next i

End Sub

Sub Borrar_reporte()

    Dim rCell As Range

    Set rCell = Range("A3:W1000")

            Do While Not IsEmpty(ActiveCell)

                rCell.Offset(0, 0).value = " "

                Set rCell = rCell.Offset(0, 0)

            Exit Do

            Loop

End Sub

H o l a:

Ya no entendí bien qué es lo que necesitas. Te pongo varios casos y me dices qué quieres hacer con cada uno, es decir, me dices por cada caso si lo copio o no lo copio:

Caso 1.

       S          T

      SI       SI

Caso 2.

       S          T

      SI        NO

Caso 3.

       S          T

      NO       SI

Caso 4.

       S          T

      NO       NO

Caso 5.

       S          T

                  SI

Caso 6.

       S          T

      SI       

Caso 7.

       S          T

Caso 8.

       S          T

      NO       

Caso 9.

       S          T

                   NO

Caso 10.

       S          T

      otro       algo

Caso 11.

       S          T

      algo       SI

Caso 12.

       S          T

      SI       algo

Hola, te detallo en cada caso (resumen SyT =SI no copia, T=SI no copia, el resto si, siempre y cuando haya datos en "A".

Caso 1. no copia

       S          T

      SI       SI

Caso 2. Si copia

       S          T

      SI        NO

Caso 3. No copia

       S          T

      NO       SI

Caso 4. Si copia

       S          T

      NO       NO

Caso 5. no copia

       S          T

                  SI

Caso 6. Si copia

       S          T

      SI       

Caso 7. Si copia si hay datos en A

       S          T

Caso 8. Si copia

       S          T

      NO       

Caso 9. Si copia

       S          T

                   NO

Caso 10. Si copia si hay datos en A

       S          T

      otro       algo

Caso 11. no copia

       S          T

      algo       SI

Caso 12. si copia

       S          T

      SI       algo

Mil gracias.

H o l a:

Prueba con la siguiente macro

Sub CopiarDias()
'Por.Dante Amor
    Set h1 = Sheets("reporte")
    u = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
    If u < 3 Then u = 3
    h1.Range("A3:W" & u).ClearContents
    u = 3
    For Each h In Sheets
        If Left(UCase(h.Name), 1) = "D" Then
            For i = 2 To h.UsedRange.Rows(h.UsedRange.Rows.Count).Row
                If UCase(h.Cells(i, "S")) = "SI" And UCase(h.Cells(i, "T")) = "SI" Then
                    'No copia
                ElseIf UCase(h.Cells(i, "T")) = "SI" Then
                    'No copia
                ElseIf h.Cells(i, "A") <> "" Then
                    'Si copia
                    h.Range("A" & i & ":W" & i).Copy h1.Range("A" & u)
                    u = u + 1
                End If
            Next
        End If
    Next
End Sub

S a l u d o s . D a n t e   A m o r

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas