Я новичок в группе / VBA, поэтому, пожалуйста, прости меня, если я не настолько лаконичен, как следовало бы.
У меня есть макрос, который добавляет формулу в диапазон ячеек. Однако в диапазоне есть фильтры, и когда я применяю один из них и запускаю код, формула добавляется только к видимым ячейкам, а не к отфильтрованным строкам.
Есть ли способ заставить код, который игнорируется, применитьфильтры? Я бы предпочел не использовать ShowAllData для удаления фильтров, так как пользователи работают с файлом, который они могут сохранить на своем месте, если / когда они запускают код.
Function RefreshFormulas()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim used As Range
Set used = ws.UsedRange
Dim LastRow As Integer
LastRow = used.Row + used.Rows.Count - 1
ws.Range("A5:A" & LastRow).Formula = "=IF(ISBLANK(RC6),"""",'Report Setup'!R9C2)"
End Function
Скажем, мой диапазон содержит 3000 строк,Если этот фильтр не отфильтрован, приведенный выше код заполнит используемый диапазон в столбце A формулой во всех 3000 строк. Однако, если бы я должен был отфильтровать столбец, и теперь видимы только 500 строк, формула будет добавлена только к этим 500 строкам. Я хотел бы, чтобы код запускался на всех 3000 строках независимо от фильтров.
РЕДАКТИРОВАТЬ: Спасибо всем! Мне удалось найти способ сохранить настройки фильтра, а затем запустить мой код и повторно применить настройки. Я добавил код ниже (не мой код, но работает хорошо) на тот случай, если кому-то интересно посмотреть, что я смог найти.
Sub FormulaRefresh()
'Macro to add formulas to all rows within the range. As users add/remove rows, the formulas will dynamically populate.
Dim ws As Worksheet
Set ws = ActiveSheet
Dim used As Range
Set used = ws.UsedRange
Dim LastRow As Long
LastRow = used.Row + used.Rows.Count - 1
Dim FilterArray()
Dim CurrentFiltRange As String
Dim Col As Long
' Capture AutoFilter settings
With ws.AutoFilter
CurrentFiltRange = .Range.Address
With .Filters
ReDim FilterArray(1 To .Count, 1 To 3)
For f = 1 To .Count
With .Item(f)
If .On Then
FilterArray(f, 1) = .Criteria1
If .Operator Then
FilterArray(f, 2) = .Operator
FilterArray(f, 3) = .Criteria2
End If
End If
End With
Next f
End With
End With
'Remove AutoFilter
ws.AutoFilterMode = False
'Formula to be entered
ws.Range("A5:A" & LastRow).FormulaR1C1 = "=IF(ISBLANK(RC6),"""",'Report Setup'!R9C2)"
' Restore Filter settings
For Col = 1 To UBound(FilterArray(), 1)
If Not IsEmpty(FilterArray(Col, 1)) Then
If FilterArray(Col, 2) Then
ws.Range(CurrentFiltRange).AutoFilter field:=Col, _
Criteria1:=FilterArray(Col, 1), _
Operator:=FilterArray(Col, 2), _
Criteria2:=FilterArray(Col, 3)
Else
ws.Range(CurrentFiltRange).AutoFilter field:=Col, _
Criteria1:=FilterArray(Col, 1)
End If
End If
Next Col
If ws.AutoFilterMode = False Then ws.Range("4:4").AutoFilter
'If a filter isn't applied when I run they will disappear so I added a quick check at the end to add them back to row 4 if they are gone.
End Sub
Я запускаю это с разными формулами в 12 столбцах наоколо 5000 строк делают несколько других вещей, и это выполняется менее чем за 3 секунды, так что кажется довольно быстрым!