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"语句)?
当然.只是以错误的方式做到:
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)
使用对象.声明对象,分配对象引用并使用它们,将它们作为参数传递给您的过程.没有理由不断地像你一样去解除对象.如果你需要这样做,那么你只需要做一次.
当然.只是以正确的方式做到:
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)
归档时间: |
|
查看次数: |
1540 次 |
最近记录: |