Kay*_*ote 6 excel vba excel-vba
我试图理解Excel VBA中worksheets&worksheetobj 之间的区别.我从MSDN参考中了解到,这worksheet是worksheets&的子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)
像@Orphid已经表示,Worksheets是collection的Worksheet对象.
声明Worksheet变量时,您可以明确声明它.
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Run Code Online (Sandbox Code Playgroud)
所以,你声明Worksheet从Collection的Worksheets.
您也可以通过每个环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,主要是在声明变量时.
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 对象将为您提供适合使用工作表的智能感知选项。读者很清楚您正在使用工作表,而不是字符串。