我正在努力理解worksheets
& Excel VBA中的worksheet
obj。我从MSDN参考资料中了解到,worksheet
是worksheets
&的儿童对象。 sheets
。
但是,我们使用worksheets
obj而不是worksheet
obj引用每个工作表。 e.g。
worksheets("ExcelIsCool").range("a1").value -> CORRECT
worksheet ("ExcelIsCool").range("a1").value -> INCORRECT
我的问题是两者之间的区别是什么?
worksheet
仅用于声明变量(到目前为止我唯一使用过的地方)。 e.g。
dim wks as worksheet
答案 0 :(得分:8)
就像@Orphid已经说过的那样,Worksheets
是Worksheet
个Worksheet
个对象。
声明Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
变量时,您可以明确声明它。
Worksheet
因此,您要从Collection
的{{1}}声明Worksheets
。
您还可以遍历Worksheet
内的每个Collection
。
Dim ws As Worksheet
For Each ws In Worksheets
Debug.Print ws.Name
Next ws
因此,您可以看到Worksheet
用于您明确引用单个Worksheet
的情况,主要是在声明变量时。
答案 1 :(得分:4)
Worksheets是Worksheet对象的集合。 A"工作簿"有一个或多个"工作表" - 集合,而集合中的特定对象是"工作表"。
在您的示例中,您尝试按名称从集合中选择工作表,但由于一个工作表本身不是工作表集合,因此它不起作用。当您执行ThisWorkbook.Worksheets(" MyWorksheetName")时,返回的值是工作表对象,因此您可以按照描述的方式与其进行交互。
编辑:用例
好吧,如果你想要明确表示你正在使用工作表,当你希望保持你的职能清除多重责任,以及你希望良好的智能感知支持检查{{1}时,请使用Worksheet
}的成员。因此,如果您将工作表作为某个函数的参数(例如,从给定列的底部查找最后一行数据的函数),您的函数签名可能如下所示:
Worksheet
这很好,因为它意味着你要传递你想要引用的实际对象,而不是字符串或数字)(它的名称或索引)。这也意味着被调用函数(GetLastRow)不需要知道工作表所在的工作簿(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
和ActiveWorkbook
并不总是相同)。这使得调用者有责任找到工作表并确保您获得正确的工作表,从而保持功能清洁。用户可以使用工作表的变量名称(在其中一个VBA编辑器面板中显示)来调用它:
ThisWorkbook
或其他任何引用工作表的方式(请参阅this)。
只要您想谈论一个工作表,就可以使用Worksheet对象。将变量明确声明为Worksheet对象将为您提供适合使用工作表的intellisense选项。对于读者来说,您正在使用工作表,而不是字符串。
答案 2 :(得分:0)
在您的情况下,差异纯粹是语法上的,但区分实际对象和程序化“对象”很重要。例如,您可以使用以下两种方法:
工作表集合:
Worksheets("Sheet1").Range("A1").Value = "1"
工作表“对象”:
Dim wks As Worksheet
Set wks = Worksheets("Sheet1")
wks.Range("A1").Value = "1"
除了易用性和有时更好的可读性之外,没有任何有意义的差异 - 它们都引用了实际对象,即“Sheet1”。在Excel术语中,wks通常也被称为对象,但重要的是要记住,wks 表示一个对象,它本身不是一个对象。
您可以使用wks执行的所有操作,也可以使用工作表(“Sheet1”) - 这只是引用相关工作表的两种不同方式。事实上,在这个特定的例子中,“对象”(如wks)实际上等同于“别名”。