Запустить макрос на отфильтрованных / скрытых строках? - PullRequest
1 голос
/ 15 октября 2019

Я новичок в группе / 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 секунды, так что кажется довольно быстрым!

...