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

Kay*_*ote 6 excel vba excel-vba

我试图理解Excel VBA中worksheets&worksheetobj 之间的区别.我从MSDN参考中了解到,这worksheetworksheets&的子obj sheets.

但是,我们使用worksheetsobj而不是worksheetobj 引用每个工作表.例如

worksheets("ExcelIsCool").range("a1").value -> CORRECT
worksheet ("ExcelIsCool").range("a1").value -> INCORRECT
Run Code Online (Sandbox Code Playgroud)

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

worksheet仅用于声明一个变量(只在我到目前为止已经使用的地方).例如

dim wks as worksheet 
Run Code Online (Sandbox Code Playgroud)

luk*_*e_t 8

像@Orphid已经表示,WorksheetscollectionWorksheet对象.

声明Worksheet变量时,您可以明确声明它.

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Run Code Online (Sandbox Code Playgroud)

所以,你声明WorksheetCollectionWorksheets.

您也可以通过每个环Worksheet内的Collection.

Dim ws As Worksheet

For Each ws In Worksheets
    Debug.Print ws.Name
Next ws
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到,Worksheet在您明确引用单个的场景中使用它Worksheet,主要是在声明变量时.


Orp*_*hid 6

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

在您的示例中,您尝试按名称从集合中选择一个工作表,但由于一个工作表本身不是工作表集合,因此它不起作用。当您执行 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
Run Code Online (Sandbox Code Playgroud)

这很好,因为这意味着您正在传递要引用的实际对象,而不是字符串或数字)(其名称或索引)。这也意味着被调用的函数 (GetLastRow) 不需要知道工作表在哪个工作簿中(ActiveWorkbook并且ThisWorkbook并不总是相同)。这使调用者有责任定位工作表并确保您得到正确的工作表,保持函数干净。用户可以使用工作表的变量名称(如显示在 VBA 编辑器面板之一中)调用它:

last_row = GetLastRow(Sheet1, 1)

或任何其他引用工作表的方式(请参阅)。

您可以随时使用 Worksheet 对象只讨论一张工作表。明确地将变量声明为 Worksheet 对象将为您提供适合使用工作表的智能感知选项。读者很清楚您正在使用工作表,而不是字符串。