Excel Macro

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
1
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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas