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".
2 respuestas
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.
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
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
- Compartir respuesta
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
- Compartir respuesta