如何在 vba 中引用名称不同的工作表名称

tmd*_*d63 1 excel vba range

我正在尝试使用 vba 引用具有通用名称和唯一编号的一系列工作表来清除每张工作表上的范围。但是我收到 1004 错误。

For lngWeek = 1 To 53
    strSheet = "Week" & Trim(Str(lngWeek))
    strRange = strSheet & "!B5:H7"
    Range(strRange).Activate
Next
Run Code Online (Sandbox Code Playgroud)

工作表是 Week1、Week2 等,我需要清除每张工作表上的范围 B5:H7。从第 1 周一直到第 53 周。

为什么 Range.Activate 无法选择每个页面?

Mat*_*don 5

您在此处收到错误 1004:

Range(strRange).Activate
Run Code Online (Sandbox Code Playgroud)

因为strRange是合格的,但Range不是;它是一个隐式的 ActiveSheet 引用,这意味着Range.Activate成员调用只能在strRange引用已经在ActiveSheet. 建议:重命名strRangecellAddress或一些真正有意义的东西。“str”-for-String 没有用;“哦,那是地址”是 ;-)

为了能够选择特定的Range,您必须首先取消引用Worksheet您要使用的对象 - 其中sheetName包含工作表的名称:

Range(strRange).Activate
Run Code Online (Sandbox Code Playgroud)

然后strRange地址不再需要该WeekXX!部分:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)
Run Code Online (Sandbox Code Playgroud)

需要注意的是,除非它是为方便用户,通常有很少或几乎没有理由永远SelectActivate在VBA东西:当你正确限定所有对象你,你不会得到错误1004正在工作时,ActiveSheet不是您的代码假定工作表处于活动状态,因为代码将不再假设工作表处于活动状态。

  • @tmd63 如果你这么说的话。FYI Systems 匈牙利表示法在每种类型的编程语言中都被普遍放弃和强烈反对,而它在 VBA 和 VB6 中顽固而根深蒂固的使用在很大程度上使 VBA 和 VB6 成为现有的最可怕的语言。我强烈推荐阅读[让错误的代码看起来错误](https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/),它解释了匈牙利表示法的产生方式和原因是的,以及如何以及为什么匈牙利表示法*正确*根本不是“str-for-string”或“lng-for-long”。干杯! (3认同)