【问题标题】:How do I reference a sheet name in vba where the name has a number different如何在 vba 中引用名称不同的工作表名称
【发布时间】:2021-08-13 22:48:44
【问题描述】:

我正在尝试使用 vba 引用具有通用名称和唯一编号的工作表范围,以在每个工作表上明确范围。但我收到 1004 错误。

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

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

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

【问题讨论】:

  • 你不需要ActivateThisWorkbook.Worksheets("Week" & lngWeek).Range("B5:H7").ClearContents.
  • 使用 CStr 而不是 Str。阅读文档以了解原因。
  • 你甚至不需要CStr& forces string concatenation.
  • 不需要CStr、@BigBen,而是“说出你的意思,说出你的意思”,让代码更清晰
  • @FreeMan & 言行一致。

标签: excel vba range


【解决方案1】:

您在此处收到错误 1004:

Range(strRange).Activate

因为strRange 是工作表限定的,但Range 不是;这是一个implicit ActiveSheet reference,这意味着Range.Activate 成员调用只能在strRange 引用一个已经在ActiveSheet 上的单元格时起作用。建议:将strRange 重命名为cellAddress 或其他真正有意义的名称。 "str"-for-String 没用; “哦,那是一个地址”是 ;-)

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

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)

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

ws.Activate
ws.Range("B5:H7").Select

请注意,除非是为了方便用户,否则通常几乎没有理由在 VBA 中使用 SelectActivate 任何内容:当您正确限定正在使用的所有对象时,您将不会当 ActiveSheet 不是您的代码假定处于活动状态的工作表时出现错误 1004,因为代码将不再假定工作表处于活动状态。

【讨论】:

  • 谢谢马修。我是老派,变量类型对我来说也很有用:“哦,那是地址”没有帮助,因为它可能是长数字、短数字、双数字、字符串或许多其他变量类型。我把 str 放在前面是为了表明 Range 变量是一个字符串。但是感谢您澄清 1004 错误的原因。
  • @tmd63 如果你这么说的话。 FYI Systems Hungarian Notation 在所有单一类型的编程语言中都被普遍丢弃和强烈反对,它在 VBA 和 VB6 中根深蒂固的使用非常有助于使 VBA 和 VB6 成为现存的最可怕的单一语言。我强烈推荐阅读Making Wrong Code Look Wrong,它解释了匈牙利符号的产生方式和原因,以及匈牙利符号正确完成 不是“str-for-string”或“lng-for”的方式和原因- 长”。干杯!
  • 此外,Ctrl+i 为您提供插入符号所在的任何数据类型、FWIW,并且不应将任何变量声明为在其使用范围之外。
  • 作为basic对经常被忽视甚至被忽视的代码basics理解的不知疲倦和几乎传教士的传播者,你值得un grand merci! - 我真的希望您宝贵的 cmets 和 articles 的精髓能够在 官方帮助 站点中找到表达,因为完全合格的范围参考似乎广为人知. @MathieuGuindon
【解决方案2】:

如果您想清除名称为“Week#”形式的任何工作表中的相同范围,您可以处理所有工作表,并且只对名称与正确格式匹配的工作表进行操作。

Sub ClearSpecial()
Dim ASheet As Worksheet
Dim ToClear As Boolean

For Each ASheet In ActiveWorkbook.Worksheets
    ToClear = Left(ASheet.Name, 4) = "Week" ' add more conditions if needed
    If ToClear Then
        ASheet.Range("B5:H7").ClearContents
    End If
Next ASheet

End Sub

例如,如果还有一个名为“每周摘要”的工作表,您可以扩展您的测试以排除它。

【讨论】:

  • 谢谢。我在按钮代码中使用了这个,它需要一段时间但效果很好(有 52 Weeks 和 12 Month 页面以及其他一些页面)。
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
相关资源
最近更新 更多