工作表和工作表obj之间的区别

我试图了解Excel VBA中的worksheetsworksheet obj之间的区别。 我从MSDN参考了解到, worksheetworksheetsworksheet的子对象。

但是,我们使用worksheets obj引用每个工作worksheets ,而不是worksheet obj。 例如

 worksheets("ExcelIsCool").range("a1").value -> CORRECT worksheet ("ExcelIsCool").range("a1").value -> INCORRECT 

我的问题是两者之间的区别是什么?

worksheet仅用于声明一个variables(迄今为止唯一使用的地方)。 例如

 dim wks as worksheet 

工作表是Worksheet对象的集合。 “工作簿”有一个或多个“工作表” – 集合,而集合中的特定对象是“工作表”。

在你的例子中,你试图从名称集合中select一个工作表,但是由于一个工作表本身不是一个工作表集合,它将不起作用。 当您执行ThisWorkbook.Worksheets(“MyWorksheetName”)时,返回值是一个工作表对象,因此您可以按照描述的方式与它交互。

编辑:用例

那么,当你想清楚你正在使用一个工作表,当你想保持你的职责清除多个职责,以及你想要良好的智能感知支持检查Worksheet的成员时,使用Worksheet 。 因此,如果您将工作表作为某个函数的参数(例如,查找给定列中最后一行数据的函数),则函数签名可能如下所示:

 Public Function GetLastRow(ByRef wsTarget as Excel.Worksheet, ByVal column as Long) as Long GetLastRow = wsTarget.Cells(wsTarget.Rows.Count, column).End(xlUp).Row End Function 

这很好,因为这意味着你正在传递你想引用的实际对象,而不是一个string或数字(它的名字或索引)。 这也意味着被调用的函数(GetLastRow)不需要知道表单所在的工作簿( ActiveWorkbookThisWorkbook不总是相同)。 这给调用者的责任,find工作表,并确保你得到正确的,保持清洁的function。 用户可以使用工作表的variables名称来调用它(如在VBA编辑器面板中显示的那样):

last_row = GetLastRow(Sheet1, 1)

或者任何参考工作表的其他方式(参见本文 )。

只要您只想讨论一张工作表,就可以使用工作表对象。 将variables明确地声明为Worksheet对象将为您提供适合于使用工作表的intellisense选项。 读者可以清楚地知道,您正在使用工作表,而不是string。

就像@Orphid已经说过的, Worksheets是一个Worksheet对象的collection

当声明一个Worksheetvariables时,你可以显式声明它。

 Dim ws As Worksheet Set ws = Worksheets("Sheet1") 

所以你要从Worksheets Collection中声明一个Worksheet Worksheets

您还可以循环访问Collection每个Worksheet

 Dim ws As Worksheet For Each ws In Worksheets Debug.Print ws.Name Next ws 

所以你可以看到Worksheet被用在你明确提到单个Worksheet场景中,主要是在声明一个variables的时候。

这种区别在你的案例中是纯粹的句法,但区分实际的对象和程序化的“对象”是很重要的。 例如,你可以使用这两个:

工作表集合:

Worksheets("Sheet1").Range("A1").Value = "1"

工作表“对象”:

 Dim wks As Worksheet Set wks = Worksheets("Sheet1") wks.Range("A1").Value = "1" 

没有任何意义的区别,除了易用性和有时更好的可读性 – 它们都引用实际的对象,即“Sheet1”。 在Excel术语中,wks通常也被称为对象,但是重要的是你要记住wks 代表一个对象,它本身不是一个对象。

你可以用wks做的所有事情,你也可以使用Worksheet(“Sheet1”) – 这只是两个不那么不同的方式来引用有问题的工作表。 事实上,在这个特定的例子中,“对象”(像wks)实际上等同于“别名”。