workbook().worksheets()的简写?

JED*_*JED 3 excel vba excel-vba

我可能会失明,但我已经和VBA合作了几年,但仍然写出来

Workbook("Book1").Sheets("Sheet1").Range("A1").Value
Run Code Online (Sandbox Code Playgroud)

或(将Book1调整为工作簿,将Sheet1调整为字符串

Book1.Sheets(Sheet1).Range("A1").Value
Run Code Online (Sandbox Code Playgroud)

有没有办法可以简写"workbook.sheets"部分(没有做"With"语句)?

Mat*_*don 9

当然.只是以错误的方式做到:

Sheet1.Activate
Range("A1").Value = 42
Run Code Online (Sandbox Code Playgroud)

在标准代码模块中不合格,Range是其成员_Global,Range通过在任何工作表恰好处于活动状态时返回指定范围来实现其属性...如果有的话(在工作表的代码隐藏中,它隐式引用Me.Range,即一个范围)那张表).

如果你要含蓄地工作过ActiveSheet,你还可以推迟类型解析到一个不太高性能的运行时后期绑定调用,使宿主应用程序(这里的Excel)评估一个括号表达了更快的打字:

[A1].Value = 42
Run Code Online (Sandbox Code Playgroud)

哎呀,该Range类型有一个指向它的默认成员Value,所以你甚至可以这样做:

[A1] = 42
Run Code Online (Sandbox Code Playgroud)

如您所见,较少的代码并不总是更好的代码.限定您的Worksheet会员呼叫,并有意识地和明智地使用默认会员.

每当有人进行隐含的调用时_Global,一个婴儿独角兽就会死亡,并且两个新的Stack Overflow问题涉及来自不合格工作表调用的错误,这些问题都是从黑暗中召唤出来的.


抛开讽刺,如果你发现自己经常链接这样的Workbook("Book1").Sheets("Sheet1").Range(...)...调用,那么你会不断地反复引用相同的对象,一遍又一遍:这不仅是类型冗余,而且执行也是多余的.

如果您正在使用ThisWorkbook(运行代码的工作簿),那么您从来没有合理的理由去取消引用编译时存在的工作表.请改用其代码名称:

Sheet1.Range(...)...
Run Code Online (Sandbox Code Playgroud)

如果工作簿仅在运行时存在,或者不存在ThisWorkbook,则在某个时间点您的代码打开或创建该工作簿 - 不需要从Workbooks集合中取消引用它,...如果您将引用存储在第一名:

Set wbExisting = Workbooks.Open(path)
Set wbNew = Workbooks.Add
Run Code Online (Sandbox Code Playgroud)

对于代码在其他工作簿中在运行时创建的工作表也是如此:保留该对象引用!

Set wsNew = wbNew.Worksheets.Add
Run Code Online (Sandbox Code Playgroud)

这只留下了一个场景,您需要一个字符串来取消引用特定的工作表:该工作表已经存在于非工作簿中ThisWorkbook.

如果该工作簿的结构没有(或不能)受到保护,请尽量避免对工作表的索引或名称进行硬编码:

Set wsExisting = wbExisting.Worksheets(1) ' user may have moved it!
Set wsExisting = wbExisting.Worksheets("Summary") ' user may have renamed it!
Run Code Online (Sandbox Code Playgroud)

TL; DR

使用对象.声明对象,分配对象引用并使用它们,将它们作为参数传递给您的过程.没有理由不断地像你一样去解除对象.如果你需要这样做,那么你只需要做一次.

  • +1清楚地表明答案是讽刺性的,并解释为什么缺乏适当的资格导致了这么多问题. (4认同)

Yow*_*E3K 5

当然.只是以正确的方式做到:

Dim wb As Workbook
Set wb = Workbooks("Book1")
Dim ws As Worksheet
Set ws = wb.Worksheets("Sheet1")
Dim x As Variant
x = ws.Range("A1").Value
Run Code Online (Sandbox Code Playgroud)

(抱歉Mat的马克杯 - 我不得不对第一行进行一些挖掘:D)

  • 哈哈哈金色...所以,*使用短的dismvoweled标识符名称*呵呵?;-) (2认同)