如何在vba中引用名称不同的工作表名称
我正在尝试使用 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 无法选择每个页面?
回答
您在此处收到错误 1004:
Range(strRange).ActivateRange(strRange).Activate
因为strRange是合格的,但Range不是;它是一个隐式的 ActiveSheet 引用,这意味着Range.Activate成员调用只能在strRange引用已经在ActiveSheet. 建议:重命名strRange为cellAddress或一些真正有意义的东西。“str”-for-String 没有用;“哦,那是地址”是 😉
为了能够选择特定的Range,您必须首先取消引用Worksheet您要使用的对象 - 其中sheetName包含工作表的名称:
然后strRange地址不再需要该WeekXX!部分:
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)
需要注意的是,除非它是为方便用户,通常有很少或几乎没有理由永远Select或Activate在VBA东西:当你正确限定所有对象你,你不会得到错误1004正在工作时,ActiveSheet不是您的代码假定工作表处于活动状态,因为代码将不再假设工作表处于活动状态。
- @tmd63 if you say so. FYI Systems Hungarian Notation is universally dropped and heavily discouraged in every single typed programming language out there, and its stubborn deeply-rooted usage in VBA and VB6 is very much contributing to making VBA and VB6 the single most-dreaded language in existence. I'd warmly recommend reading [Making Wrong Code Look Wrong](https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/), which explains how and why Hungarian Notation came to be, and how and why Hungarian Notation *done right* is not "str-for-string" or "lng-for-long" at all. Cheers!