NYARCH escribe
Quiero que Excel copie una fila completa en una nueva hoja de cálculo de Excel basada en una entrada de celda. Por ejemplo, tengo datos en las celdas A8: AG8, quiero que Excel copie toda la fila en la hoja "a" si el valor en H8 es "ir", y la hoja "b" si el valor en H8 es "RR". La parte más complicada y no solo copiada, la necesito copiar en la siguiente fila en blanco en la hoja de trabajo. De las aproximadamente 150 filas, sólo unas 15 de cada tipo se copiarán en una hoja nueva.
MrExcel otorgará 50 puntos de bonificación a cualquier lector que recuerde el artículo de Lotus Magazine que ofrece 10 excelentes consejos, donde el consejo n. ° 4 era "Use la tecla Finalizar para ir al final de un rango". Volviendo a los días de Lotus, podría colocar el puntero de celda en cualquier lugar de un bloque de datos, presionar FINALIZAR y luego hacia abajo, y el puntero de celda viajaría hasta el final del rango. Excel tiene una funcionalidad similar, VBA tiene una funcionalidad similar y esta es la clave para encontrar la última fila de datos en una hoja.
La técnica de VBA es usar End (xlDown) para simular la tecla End + Down o End (xlUp) para simular la tecla End + Up. Al presionar esta secuencia de teclas, el puntero de la celda se moverá al siguiente borde de un rango contiguo de datos. Imagine que hay valores en A1: A10 y A20: A30. Empiece en A1. Presione Fin + Abajo y el puntero de celda se moverá a A10. Presione Fin + Abajo y pasará a A20, que es el borde superior del siguiente rango contiguo de datos. Presione End + Down y pasará a A30. De hecho, no sé cómo explicar este comportamiento en un inglés sencillo. Pruébalo y verás cómo funciona.
El truco que utilizo es comenzar en la Columna A en la última fila de la hoja de cálculo y luego presionar Fin + Arriba. Esto me llevará a la última fila con datos. Entonces sé usar la siguiente fila hacia abajo como una fila en blanco.
Aquí hay una macro de fuerza bruta para resolver el problema de esta semana. Sí, ciertamente podría hacer esto de manera más elegante con un autofiltro. Los datos se encuentran actualmente en la Hoja 1, con los títulos en la fila 2.
Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Range("A65536").End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Range("H" & x).Value If ThisValue = "ir" Then Range("A" & x & ":AG" & x).Copy Sheets("a").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Range("A" & x & ":AG" & x).Copy Sheets("b").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub
Dado que Excel 2007 tiene más de 65,536 filas, puede usar esta macro para que sea compatible con versiones posteriores. Tenga en cuenta que uso CELLS (Fila, Columna) en lugar de RANGE aquí:
Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Cells(Rows.Count, 1).End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Cells(x, 8).Value If ThisValue = "ir" Then Cells(x, 1).Resize(1, 33).Copy Sheets("a").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Cells(x, 1).Resize(1, 33).Copy Sheets("b").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub
Para obtener sugerencias sobre cómo usar una macro, consulte Introducción al Editor de VBA de Excel.