Проблема, с которой вы сталкиваетесь, заключается в том, что вы перебираете все ячейки в вашей таблице «отформатированных данных». Код VBA не проверяет, были ли отфильтрованы ячейки или нет.
Я прилагаю код ниже, который должен делать то, что вы пытаетесь сделать. Я внес несколько изменений, чтобы немного его очистить, например, сохранить листы в их собственной переменной, чтобы вам не приходилось ссылаться на них напрямую.
Кроме того, я решил использовать прямое присвоение значений, а не копировать / вставлять. Непосредственное присвоение значения обычно происходит быстрее и имеет более чистый, более информативный код. Компромисс в том, что он не копирует форматирование. Если вам действительно нужно форматирование, вы можете добавить его один раз (либо в начале, либо в конце процедуры, для всего столбца).
Узнайте, можете ли вы адаптировать приведенный ниже код, и дайте нам знать, если вам нужна дополнительная помощь.
Sub PRINT_AVIVA_ISA()
Dim sData As Worksheet
Dim sClient As Worksheet
'Prevents the application from rendering graphical elements during processing
Application.ScreenUpdating = False
Set sData = Worksheets("Formatted Data")
Set sClient = Worksheets("Client_1 Data")
sData.Range("$A$1:$R$73").AutoFilter Field:=3, Criteria1:=Array( _
"client_1"), Operator:=xlFilterValues
LastRow = sData.Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To LastRow
If sData.Rows(i).Hidden = False Then
' Rather than add 1 to erow 4 times later, just calculate it here
erow = sClient.Cells(Rows.Count, 1).End(xlUp).Row + 1
sClient.Cells(erow, 1).Value = sData.Cells(i, 2).Value
sClient.Cells(erow, 2).Value = sData.Cells(i, 3).Value
sClient.Cells(erow, 3).Value = sData.Cells(i, 1).Value
End If
Next i
Application.ScreenUpdating = True
End Sub