工作簿()的简写。

我可能是盲目的,但我已经与VBA工作了几年,但仍然写出来

Workbook("Book1").Sheets("Sheet1").Range("A1").Value 

或者(在将Book1调暗为工作簿并将Sheet1调暗为string之后)

 Book1.Sheets(Sheet1).Range("A1").Value 

有没有办法可以简化“workbook.sheets”部分(不做“With”语句)?

当然。 只要做正确的方法:

 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 

(抱歉,马克杯 – 我不得不有点第一行挖:D)

当然。 只是做错了方式:

 Sheet1.Activate Range("A1").Value = 42 

不合格的, Range_Global的成员,它通过返回指定的范围(无论哪个工作表碰巧处于活动状态)来实现其Range属性。

如果你要隐式地处理ActiveSheet ,你也可以把parsingtypesparsing为一个性能较低的后期调用的运行时 ,并让主机应用程序(这里是Excel) 计算一个括号内的expression式,以便更快的input:

 [A1].Value = 42 

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

 [A1] = 42 

正如你所看到的, 更less的代码并不总是更好的代码。 合格您的Worksheet成员电话,并有意识地使用默认成员。

每当有人对_Global进行隐式调用时,一个独angular兽就会死亡,另外两个新的堆栈溢出问题将会从黑暗中传出。

好吧,我将从字面上理解“Book1”的名称,并假定您正在编写代码来处理新的工作簿 – 可能是这样的:

 Dim myWorkbook As Workbook Workbooks.Add Set myWorkbook = Workbooks("Book1") 

这已经是一个糟糕的开始,因为:

  1. 用户的语言将决定名称的“书”部分。
  2. 数字后缀将随着每个额外的新工作簿而增加

所以,许多没有经验的编码者尝试这样做:

 Dim myWorkbook As Workbook Workbooks.Add Set myWorkbook = ActiveWorkbook 

但是,这也是错误的。 如果有事件处理程序希望更改活动工作簿呢? 什么是用户更改活动工作簿,而通过代码?

分配您的myWorkbookvariables的最佳方式是这样的:

 Dim myWorkbook As Workbook Set myWorkbook = Workbooks.Add 

而且,就像在添加新的工作簿时一样,在打开现有工作簿时也应遵循相同的方法:

 Dim myWorkbook As Workbook Set myWorkbook = Workbooks.Open("C:\Foo.xlsx") 

在这两种情况下,你都知道你有一个正确的工作簿的参考, 你不关心它被称为是否是活动的 。 您刚刚使您的代码更健壮更高效。

或者,如果您的VBA正在使用它所在的工作簿,则可以使用ThisWorkbook或工作表的代号。

 Debug.Print ThisWorkbook.Name 'By default, a sheet named "Sheet" has a codename of 'Sheet1' Debug.Assert Sheet1.Name = ThisWorkbook("Sheet1").Name 'But give meaningful names to your sheet name and 'sheet codename, and your code becomes clearer: Debug.Assert AppSettings.Name = ThisWorkbook("Settings").Name 

您可能会发现大部分代码都会处理其所在的工作簿,或者代码打开的现有工作簿,或者代码创build的新工作簿。 所有这些情况都在上面处理。 在极less数情况下,您的代码必须与已打开的工作簿交互,或由其他进程打开,您需要按名称引用工作簿,或枚举Workbooks集合:

 Dim myWorkbook As Workbook Set myWorkbook = Workbooks("DailyChecklist.xlsx") For Each myWorkbook In Workbooks Debug.Print myWorkbook.Name Next myWorkbook 

一个例外是加载项,无法使用Workbooks集合进行枚举,但可以使用Workbooks("MyAddin.xlam")进行引用

喜欢这个

 Sub temp() Dim WB As Workbook, WS As Worksheet Set WB = ActiveWorkbook Set WS = WB.Sheets(2) MsgBox WS.Range("A2").Text End Sub 

您可以设置工作表variables以及其父工作簿

 Dim wb1s1 As Worksheet Set wb1s1 = Workbook("Book1").Sheets("Sheet1") 

然后写

 wb1s1.Range("A1").Value