【问题标题】:VBA - Looping through all ListObjects across a range of worksheetsVBA - 遍历一系列工作表中的所有 ListObjects
【发布时间】:2021-07-07 15:43:14
【问题描述】:

我有一个表格条件格式宏(感谢 Jeeped),我想扩展它以循环遍历一系列工作表中的所有表格。我怀疑这不是最有效的方法,但它是我能拼凑起来的最好的方法,即使那样它也不起作用。到目前为止,我被困在以下两点。非常感谢任何帮助!

1) 设置 ws 等于多个工作表代号(例如Set ws = Worksheets(5,6,7)

2) 设置没有运行时错误Set myRange = ws.ListObjects.DataBodyRange 的范围会产生“运行时错误'438':对象不支持此属性或方法”

当前代码是:

Sub ConditionalFormatting()
    Dim ws As Excel.Worksheet
    Dim lo As Excel.ListObject
    Dim myRange As Range

    Set ws = Worksheet(5) 'Would like to expand to include multiple worksheets!
    Set myRange = ws.ListObjects.DataBodyRange

    For Each lo In ws.ListObjects
        With lo.FormatConditions
            .FormatConditions.Delete
            Call FormatRange(myRange, 10, "$E5=INDEX(Location,1,1)") 'Warehouse1
            Call FormatRange(myRange, 10, "$E5=INDEX(Location,2,1)") 'Warehouse2
            Call FormatRange(myRange, 10, "$E5=INDEX(Location,3,1)") 'Warehouse3
        End With
    Next lo
End Sub

Public Sub FormatRange(r As Range, clr As Integer, frml As String)
    r.FormatConditions.Add Type:=xlExpression, Formula1:=frml
    r.FormatConditions(r.FormatConditions.Count).Font.colorindex = clr

    With r.FormatConditions(1).Borders(xlTop)
        .LineStyle = xlContinuous
        .Color = color
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With r.FormatConditions(1).Borders(xlBottom)
        .LineStyle = xlContinuous
        .Color = color
        .TintAndShade = 0
        .Weight = xlThin
    End With
    r.FormatConditions(1).StopIfTrue = False
End Sub

【问题讨论】:

    标签: vba excel conditional-formatting listobject


    【解决方案1】:

    未经测试:

    Sub ConditionalFormatting()
        Dim ws As Excel.Worksheet
        Dim lo As Excel.ListObject
        Dim myRange As Range
        Dim i
    
    
        For Each i in Array(5, 6, 7)
    
            Set ws = Worksheets(i)     
    
            For Each lo In ws.ListObjects
    
                Set myRange = lo.DataBodyRange
    
                myRange.FormatConditions.Delete
                FormatRange myRange, 10, "$E5=INDEX(Location,1,1)" 'Warehouse1
                FormatRange myRange, 10, "$E5=INDEX(Location,2,1)" 'Warehouse2
                FormatRange myRange, 10, "$E5=INDEX(Location,3,1)" 'Warehouse3
    
            Next lo
    
        Next i
    
    End Sub
    

    【讨论】:

    • 谢谢蒂姆。此代码有效,但仅部分有效。在我的实际文件中,数组中有很多工作表——不仅仅是三个。该代码适用于数组中的某些工作表,应用格式但不会删除其他工作表的现有格式条件,并且不会应用格式或删除其他其他工作表的现有格式条件。为了让它在短期内正常工作,我使用了Set ws = ActiveSheet 并在每一个工作表上运行,它有效。不知道为什么它以不同的方式处理工作表。
    【解决方案2】:

    就像循环遍历 listobject 集合“Listobjects”一样,您也可以循环遍历 Worksheet 集合“WorkSheets”

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        '...
    Next ws
    

    【讨论】:

      【解决方案3】:

      将此示例用于我的代码以重置我所有表的过滤器

      Dim ws As Worksheet
      Dim lo As ListObject
      
      For Each ws In ThisWorkbook.Worksheets
          For Each lo In ws.ListObjects
              If lo.ShowAutoFilter Then
                  If lo.AutoFilter.FilterMode Then
                      lo.AutoFilter.ShowAllData
                  End If
              End If
          Next lo
      Next ws
      

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2015-11-12
        • 2023-03-23
        相关资源
        最近更新 更多