【问题标题】:How to run a method in multiple worksheets without actively selecting each one如何在多个工作表中运行一个方法而不主动选择每个工作表
【发布时间】:2015-05-23 08:59:40
【问题描述】:

我在 VBA 中编写一些代码时遇到问题,该代码将为活动工作簿中的所有工作表运行宏,而无需每次“手动”选择工作表,然后再次运行该方法。我目前拥有的如下:

sub NhlStatsHighlighter()

  Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets

        With ws


            For Each cell In ActiveSheet.UsedRange.Cells

                If IsNumeric(cell) And Not IsEmpty(cell) Then
                    If cell.Value < 0 Then
                    cell.Interior.Color = rgbRed

                    ElseIf cell.Value = 0 Then
                    cell.Interior.Color = rgbGray

                    ElseIf cell.Value > 0 Then
                    cell.Interior.Color = rgbLightBlue

                    End If
                End If
            Next
        End With
    Next ws

这仅适用于第一个(活动)工作表。我不太确定我做错了什么。我尝试了其他方法,但遇到了同样的问题。

【问题讨论】:

  • 请参阅How to avoid using Select in Excel VBA macros,了解摆脱依赖选择和激活来实现目标的方法。
  • @KyleStephens 另外我不确定这是否只是一个示例程序。但是您可以只使用条件突出显示而不是宏来根据其值更改颜色。

标签: vba excel methods selection


【解决方案1】:

您正在构建 With ws / End With,但没有为 UsedRange 的父级利用它。

sub NhlStatsHighlighter()
    Dim ws As Worksheet, rng as range
    For Each ws In ActiveWorkbook.Worksheets
        With ws
            For Each rng In .UsedRange.Cells
                If IsNumeric(rng) And Not IsEmpty(rng) Then
                    If rng.Value < 0 Then
                        rng.Interior.Color = rgbRed
                    ElseIf rng.Value = 0 Then
                        rng.Interior.Color = rgbGray
                    ElseIf rng.Value > 0 Then
                        rng.Interior.Color = rgbLightBlue
                    End If
                End If
            Next
        End With
    Next ws
end sub

注意.UsedRange.Cells。前缀句点(又名 .句号)使父 ws 在您通过外部循环时发生变化。

【讨论】:

  • 很高兴你很快就解决了。很抱歉将您的 cell 变量更改为 rng 但我想我可能不得不在解释中参考 .Range.Cells 并且不想混淆。事实证明我实际上不必这样做。只要不将其与Range.Cells property 混淆,使用cell 作为变量名没有任何问题。
  • 啊,我明白了。没关系!只是一个后续问题:如果我只是删除 rng 变量,然后将所有内容更改回单元格,它应该可以正常工作,对吧?
  • 是的,应该没问题。
【解决方案2】:

您的问题是您使用的是 ActiveSheet 而不是 ws。 ActiveSheet 是用户选择的当前表单。它不会更新,您不应该在代码中选择工作表。如果你这样做,你是否会得到运行时异常。

Dim ws As Worksheet
Dim cell as Range
For Each ws In ActiveWorkbook.Worksheets
    For Each cell in ws.UsedRange.Cells
        ` More stuff here
    Next
Next

您也不需要 with 块。它在这里没有做任何事情。

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多