【问题标题】:loop macro through all worksheets在所有工作表中循环宏
【发布时间】:2015-06-10 18:18:20
【问题描述】:

我试图在当前工作簿中的所有工作表中循环这个宏,它会根据年份更改行的颜色,但似乎不知道该怎么做。我试图从其他问题和答案中拼凑一些东西,但无济于事。任何帮助,将不胜感激。代码如下:

Sub ExpirationYeartoColors()
Dim num As Integer, lr As Long, r As Long
lr = Cells(Rows.Count, "A").End(xlUp).Row

ActiveSheet.Select

For r = 2 To lr

Select Case Range("A" & r).Value
    Case Is = "2015"
    Range("A" & r).Interior.Color = RGB(181, 189, 0)
    Case Is = "2016"
    Range("A" & r).Interior.Color = RGB(0, 56, 101)
    Case Is = "2017"
    Range("A" & r).Interior.Color = RGB(0, 147, 178)
    Case Is = "2018"
    Range("A" & r).Interior.Color = RGB(155, 211, 221)
    Case Is = "2019"
    Range("A" & r).Interior.Color = RGB(254, 222, 199)
    Case Is = "2020"
    Range("A" & r).Interior.Color = RGB(238, 242, 210)
    Case "2020" To "2080"
    Range("A" & r).Interior.Color = RGB(238, 242, 210)
    Case Is = "Unknown"
    Range("A" & r).Interior.Color = RGB(197, 200, 203)
    Case Is = "Available"
    Range("A" & r).Interior.Color = RGB(247, 150, 91)
    Case Is = "CommonArea"
    Range("A" & r).Interior.Color = RGB(230, 230, 230)
    Case Else
    Range("A" & r).Interior.Color = RGB(255, 255, 255)
End Select
Next r

On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next

End Sub

【问题讨论】:

  • A 列中的值实际上是一个 4 位文本值,看起来像一个代表年份的数字,还是可以格式化为显示 yyyy 的日期?你考虑过Conditional Formatting吗?
  • for each worksheet in thisworkbook.sheets 将循环遍历工作表
  • @Raystafarian - 听起来您鼓励使用 .Select 来转移工作表控制权。 -1.
  • @Jeeped 我想可能吧?我没有太在意,我不会使用select,因为我也不会使用这样的案例。

标签: vba excel loops


【解决方案1】:

我已经计算了工作簿上可用工作表的数量并存储到一个变量中。然后使用 for 循环遍历整个工作簿直到最后一个工作表。

被屏蔽的代码是你的代码被修改的部分。

我还看到 2020 - 2080 年的案例,格式颜色是相同的。

Sub ExpirationYeartoColors()
Dim num As Integer, lr As Long, r As Long
t = ActiveWorkbook.Worksheets.Count
i = 0
For i = 1 To t
Worksheets("sheet" & i).Activate
lr = Cells(Rows.Count, "A").End(xlUp).Row

ActiveSheet.Select

For r = 2 To lr

Select Case Range("A" & r).Value
    Case Is = "2015"
    Range("A" & r).Interior.Color = RGB(181, 189, 0)
    Case Is = "2016"
    Range("A" & r).Interior.Color = RGB(0, 56, 101)
    Case Is = "2017"
    Range("A" & r).Interior.Color = RGB(0, 147, 178)
    Case Is = "2018"
    Range("A" & r).Interior.Color = RGB(155, 211, 221)
    Case Is = "2019"
    Range("A" & r).Interior.Color = RGB(254, 222, 199)
    Case Is = "2020"
    Range("A" & r).Interior.Color = RGB(238, 242, 210)
    Case "2021" To "2080"
    Range("A" & r).Interior.Color = RGB(238, 242, 210)
    Case Is = "Unknown"
    Range("A" & r).Interior.Color = RGB(197, 200, 203)
    Case Is = "Available"
    Range("A" & r).Interior.Color = RGB(247, 150, 91)
    Case Is = "CommonArea"
    Range("A" & r).Interior.Color = RGB(230, 230, 230)
    Case Else
    Range("A" & r).Interior.Color = RGB(255, 255, 255)
End Select
Next r
Next i
On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next

End Sub

这将遍历所有工作表并进行格式化。代码经过测试,运行良好

【讨论】:

  • 亲爱的大家,请让我知道为什么我的解决方案被否决,以便我将来更正这些问题。根据问题,我创建了包含模拟和测试所需数据的 excel。在成功的结果之后,我才发布了我的回复。
【解决方案2】:

Here 是您的答案...您需要一个变量来计算工作表,然后将循环放入另一个“for”中以遍历所有工作表。

或者如果你愿意的话,你可能会使用一段时间..

【讨论】:

    【解决方案3】:

    有几种方法可以循环浏览工作簿中的工作表。我更喜欢工作表索引方法,它只是根据工作表在工作表队列中的位置来识别工作表。

    Sub ExpirationYeartoColors()
        Dim w As Long, lr As Long, r As Long, vVAL As Variant
    
        For w = 1 To Worksheets.Count
            With Worksheets(w)
                lr = .Cells(Rows.Count, "A").End(xlUp).Row
                For r = 2 To lr
                    vVAL = .Range("A" & r)
                    If IsNumeric(vVAL) Then
                        'treat numbers as numbers!!!
                        vVAL = Int(vVAL)   'maybe vVAL = Year(vVAL) ?
                        Select Case vVAL
                            Case 2015
                                .Range("A" & r).Interior.Color = RGB(181, 189, 0)
                            Case 2016
                                .Range("A" & r).Interior.Color = RGB(0, 56, 101)
                            Case 2017
                                .Range("A" & r).Interior.Color = RGB(0, 147, 178)
                            Case 2018
                                .Range("A" & r).Interior.Color = RGB(155, 211, 221)
                            Case 2019
                                .Range("A" & r).Interior.Color = RGB(254, 222, 199)
                            Case 2020
                                .Range("A" & r).Interior.Color = RGB(238, 242, 210)
                            Case 2021 To 2080
                                .Range("A" & r).Interior.Color = RGB(238, 242, 210)
                            Case Else
                                .Range("A" & r).Interior.Pattern = xlNone
                        End Select
                    Else
                        Select Case vVAL
                            Case Is = "Unknown"
                                .Range("A" & r).Interior.Color = RGB(197, 200, 203)
                            Case Is = "Available"
                                .Range("A" & r).Interior.Color = RGB(247, 150, 91)
                            Case Is = "CommonArea"
                                .Range("A" & r).Interior.Color = RGB(230, 230, 230)
                            Case Else
                                .Range("A" & r).Interior.Pattern = xlNone
                        End Select
                    End If
                Next r
            End With
        Next w
    
    
    On Error GoTo ErrorHandler
       ' Insert code that might generate an error here
       Exit Sub
    ErrorHandler:
       ' Insert code to handle the error here
       Resume Next
    
    End Sub
    

    有许多未回答的问题;特别是关于数据的性质。但是,您应该将数字视为数字,特别是如果您想在Case "2020" To "2080" 之类的地方使用它们。我试图确定值的性质并分别处理文本和数字。这可以编译,但没有样本数据或对所提出的 cmets 的答案,我无法保证其有效性。

    .pattern 设置为 xlNone 会移除内部填充,而不是将其涂成白色。

    请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

    【讨论】:

      【解决方案4】:

      还有一种使用条件格式 (CF) 的替代方法。

      优点是一旦设置了 CF,单元格的格式将响应任何更改的值。

      您可以使用 VBA 代码将 CF 添加到所有工作表,方法是循环访问工作簿中的所有工作表并运行 VBA 代码来添加它。或者您可以手动添加它,如下所示。

      我了解您可能出于其他原因需要编写 VBA 代码,如果您这样做,其他答案很好,但我怀疑这可能对您有用。

      Select all rows on a sheet (or as many as you need).
      
      Ribbon>HOME>Conditional formatting
      Choose: "Use a Formula to determine which cells to format"
      
      Enter this formula  "=AND($A1=2010,$A1>0)"
      (it assume your data value is in column A
       it assumes the first row you selected was row 1)
      
      Enter the formatting you want for the whole row when year in column A=2010
      

      为每一年添加一个条件格式。

      我建议您录制一个宏,然后根据需要更改它,以便将每年的 CF 添加到每个工作表中。

      有时简单是最好的。

      哈维

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2014-09-15
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多