Tente isso - tentei manter sua macro gravada, mas tendo em mente que queremos Evite usar .Select
/ .Activate
e use uma variável ou duas para acompanhar a próxima linha vazia.
Sub t()
Dim lastCol&, lastRow&, emptyRow&, i&
Dim mainWS As Worksheet, copyToWS As Worksheet
' Create two variables to hold the sheets
Set mainWS = Sheets("v4 q2")
Set copyToWS = Sheets("v4 r2")
emptyRow = 1
'Now, let's find the last column in the mainWS, and last row
lastCol = mainWS.Cells(1, mainWS.Columns.Count).End(xlToLeft).Column
lastRow = mainWS.Cells(mainWS.Rows.Count, 1).End(xlUp).Row ' assuming your column A (1) has the most data
' Now, loop through your last Column, looking for '1'
For i = 1 To lastRow
If mainWS.Cells(i, lastCol).Value = "1" Then
' Since you only want the VALUES, we can just set the two ranges equal to eachother
' instead of using .Copy
copyToWS.Range(copyToWS.Rows(emptyRow), copyToWS.Rows(emptyRow)).Value = mainWS.Range(mainWS.Rows(i), mainWS.Rows(i)).Value
emptyRow = emptyRow + 1
End If
Next i
End Sub
Além disso, observe que, como você queria apenas os valores, podemos definir os intervalos como iguais, em vez de copiar / colar (o que usa a área de transferência e pode levar mais tempo). Para fazer isso, é apenas Range[destination].Value = Range[the range to copy].Value
.