"Есть ли способ создать переменную для листа, который в данный момент проходит по циклу?"
Да, используя переменную Worksheet
в качестве аргумента в filter1
.
Избегайте использования Activate
или совершения Range
вызовов без указания Worksheet
.
Sub updateData()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> "BOAT" And ws.Name <> "Data" Then
filter1 ws 'no need to use Call
End If
Next ws
End Sub
Передав ws
в качестве аргумента filter1
, все вызовы Range
полностью квалифицируются с помощью рассматриваемого Worksheet
. Это легко сделать с помощью блока With...End With
- запишите период .
перед .Range("A2").Value
, .Range("A4")
и т. Д. - эквивалентно myWs.Range("A2").Value
, myWs.Range("A4")...
и т. Д.
Sub filter1(myWs As Worksheet)
Dim lastRow As Long, lastRow2 As Long
Dim rInput As String
Application.DisplayAlerts = False
With myWs
rInput = .Range("A2").Value
With .Parent.Sheets("Data")
lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:Y" & lastRow).AutoFilter field:=4, Criteria1:="=*" & rInput & "*"
lastRow2 = .Range("G" & .Rows.Count).End(xlUp).Row
.Range("G1:G" & lastRow2).Copy
End With
.Range("A4").PasteSpecial xlPasteValues
.Rows(4).EntireRow.Delete
End With
Application.DisplayAlerts = True
End Sub