【问题标题】:'With Worksheets("xxxx")' works only when "xxxx" is the active worksheet'With Worksheets("xxxx")' 仅在 "xxxx" 是活动工作表时有效
【发布时间】:2018-01-22 21:57:09
【问题描述】:

我对 Excel VBA 还是很陌生。到目前为止,我在这个网站上阅读并学到了很多东西,但还没有找到解决我的问题的方法。

作为宏的一部分,我有以下代码:

With Worksheets("Oracle")
    On error resume next
    ActiveWorkbook.Names("bron").Delete
    ActiveWorkbook.Names.Add Name:="bron", RefersTo:= Range("A1", Range("A1").End(xlToRight).End(xlDown))
    .Cells.Select
    With Selection.Font
        .Name = "Verdana"
        .FontStyle = "Standaard"
        .Size = 8
    End With
    .Range("A1", Range("A1").End(xlToRight)).Font.Bold = True
    MsgBox "Tabblad ‘Oracle’ is klaar!", vbOKOnly
End With

我知道,对于代码的第一行,活动工作表实际上是什么并不重要。但问题是它仅在 Oracle 是活动工作表时才有效。我做错了什么?

【问题讨论】:

  • 欢迎来到本站!查看tourhow-to-ask page 了解更多关于提出问题以吸引高质量答案的信息。您可以edit your question 包含更多信息。问题是它只在Oracle 是活动的sheet 时才有效,还是只在包含Oracleworkbook 处于活动状态时才有效?如果另一个工作簿处于活动状态,Worksheets 可能无法为您提供所需的内容。 编辑另外,实际的失败是什么?
  • 所有Range(...)前面必须有一个.,而不仅仅是一些。
  • @cxw 谢谢!该代码涉及一个工作簿,不涉及其他工作簿,因此恕我直言,不同的工作簿不是问题。几周前我有相同的代码,但后来我使用 Worksheet.Activate 而不是 With Worksheets(“xxxx”),效果很好
  • 感谢您的回复!我认为@GSerg 可能是正确的——对Range(而不是.Range)的引用指的是当前工作表,而不是With 语句中命名的工作表。我将参加近距离投票,但如果您仍然遇到问题,请不要犹豫,要求重新开放或提出其他问题。

标签: vba excel reference worksheet


【解决方案1】:

如果您使用With Worksheets() ... End With,则意味着您要引用特定工作表而不是ActiveSheet。这在 VBA 中被认为是一种很好的做法。

正如@GSerg 在 cmets 中所提到的,您的代码不起作用,因为您在所有范围前面都没有一个点。但是,您不会注意到这一点,因为您使用的是On Error Resume Next,它会忽略所有错误。

在您的情况下,问题是您尝试使用此行.Range("A1", Range("A1").End(xlToRight)). 引用ActiveSheetOracle 中的范围。因此,错误是不可避免的。

您有两种选择来确保您的代码正常工作:

  1. 只需激活工作表“Oracle”并运行代码。它会正常工作的。
  2. 尝试像这样重写它:

With Worksheets("Oracle")
    On Error Resume Next
    ActiveWorkbook.Names("bron").Delete
    ActiveWorkbook.Names.Add Name:="bron", _
                          RefersTo:=.Range("A1", .Range("A1").End(xlToRight).End(xlDown))

        With .Cells.Font
            .Name = "Verdana"
            .FontStyle = "Standaard"
            .Size = 8
        End With

    .Range("A1", .Range("A1").End(xlToRight)).Font.Bold = True
    MsgBox "Tabblad ‘Oracle’ is klaar!", vbOKOnly

End With

看看所有范围都用一个点引用,Select 命令不再使用。

【讨论】:

  • 非常感谢您的详细回答。现在我明白为什么我的原始代码不起作用了。
  • @cxw,GSerg,Vityata。感谢您的即时帮助。我已经按照 Vityata 的建议运行了代码,它运行良好!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2020-01-06
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多