Hola buenos días, necesitaría ayuda para una macro en la que primero filtro aquellas filas que empiezan por EN y luego las copia en la hoja1, mi problema está en que la posición de esas celdas puede variar, como hago para que me copia las filas que me han resultado del autofiltro. Selection.AutoFilter Field:=1, Criteria1:="=en*", Operator:=xlAnd Rows("2:500").Select
Application.CutCopyMode = False Selection.Copy Sheets("Hoja1").Select ActiveWindow.SmallScroll Down:=39 Range("A208").Select ActiveSheet.Paste Range("A1").Select Muchas gracias.
1 respuesta
Respuesta de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
Entiendo que lo que quieres es buscar la última fila escrita de la Hoja1 y pegar después de esa. Para ello puedes cambiar la línea "Range("A208").select por: ActiveCell.SpecialCells(xlLastCell).Select Cells(ActiveCell.Row + 1, 1).Select
Realmente eso es lo que quiero hacer por eso lo pego en una celda en la que sé que no va a haber datos. Pero mi problema lo tengo en copiar las filas que ha seleccionado el filtro ya que de una vez para otra puede variar . Un saludo
Prueba con este código: Option Explicit Sub copiaDatosFiltradosEnHoja2() Dim nLinVacia As Long ' Seleccionamos todas las celdas de la página (no coge las no ' seleccionadas en el filtro pero sí las cabeceras) Cells.Select ' Las copiamos Selection.Copy ' Vamos a la Hoja2 Sheets("Hoja2").Select ' Buscamos la primera línea vacía nLinVacia = buscaPrimeraLineaVaciaPagina("Hoja2") ' Si nos marca la línea 2, pondremos la 1 y después dejaremos las cabeceras If nLinVacia = 2 Then nLinVacia = 1 ' Nos posicionamos en la línea indicada, columna 1 (A) Sheets("Hoja2").Cells(nLinVacia, 1).Select ' Pegamos los datos copiados ActiveSheet. Paste ' Como hemos copiado toda la Hoja1, también hemos copiado la cabecera. ' Quitaremos 1 línea para que no se dupliquen las cabeceras siempre que ' estemos en la línea posterior a la 1 If nLinVacia > 1 Then Sheets("Hoja2").Rows(Format$(nLinVacia)).Delete End If ' Seleccionamos la primera celda donde hemos copiado los datos Sheets("Hoja2").Cells(nLinVacia, 1).Select ' Volvemos a la Hoja1 Sheets("Hoja1").Select ' Cancelamos el 'copiar' que hicimos al principio Application.CutCopyMode = False ' Seleccionamos la celda A1 Sheets("Hoja1").Cells(1, 1).Select End Sub Private Function buscaPrimeraLineaVaciaPagina(ByVal nomPag As String) As Long ' Esta función busca la primera línea en blanco (o al menos sus 10 primeras columnas) ' Para ello, mirará la línea 1, después la 501, 1001, etc... hasta encontrar una ' en blanco. Después volverá hacia atrás de 25 en 25 para buscar una línea ' escrita y, para terminar, volverá a ir hacia adelante, esta vez de 1 en 1, hasta ' encontrar una nueva línea en blanco. ' Hacemos esto así para evitar que tarde muchísimo cuando la página tenga muchas ' líneas. Dim i As Long If snFilaVacia(Sheets(nomPag).Rows(1)) Then buscaPrimeraLineaVaciaPagina = 1 Exit Function End If i = 1 ' Nos moveremos de 500 en 500 hasta encontrar una vacía Do i = i + 50 If i > 65536 Then Exit Do Loop Until snFilaVacia(Sheets(nomPag).Rows(i)) If i > 65536 Then ' Comprobamos si la última línea está vacía. Si no... no queda espacio i = 65536 If Not snFilaVacia(Sheets(nomPag).Rows(i)) Then buscaPrimeraLineaVaciaPagina = -1 Exit Function End If End If ' Como sabemos que estamos en una línea vacía... vamos hacia atrás hasta ' encontrar una con datos. Iremos de 25 en 25 Do i = i - 25 Loop Until Not snFilaVacia(Sheets(nomPag).Rows(i)) ' Para terminar iremos hacia adelante de 1 en 1 hasta encontrar una nueva vacía Do i = i + 1 Loop Until snFilaVacia(Sheets(nomPag).Rows(i)) ' Esa es la primera línea vacía de la página buscaPrimeraLineaVaciaPagina = i End Function Private Function snFilaVacia(ByVal fila As Range) As Boolean Dim i As Integer snFilaVacia = False ' Diremos que una línea está vacía si lo están sus 10 primeras columnas For i = 1 To 10 DoEvents ' Esta instrucción es para que no se nos bloquee el ordenador (para que atienda otros procesos) If fila.Cells(1, i) <> "" Then Exit Function Next i snFilaVacia = True End Function