VBA dim ws as worksheets (not worksheet)

9

好的,我知道我可以做到这一点:

Dim ws as worksheet
Set ws = thisworkbook.worksheets("Sheet1")

然后使用ws工作表对象进行高级操作。

我知道我可以Dim wss as worksheets,并且使用worksheets("Sheet1")返回工作表对象。那么为什么下面的代码不起作用呢?

Dim wss as worksheets
Dim ws as worksheet
Set wss = thisworkbook.worksheets
Set ws = wss("Sheet1")

我也尝试过以下方法:
Dim wss as worksheets
Dim ws as worksheet
Set ws = thisworkbook.wss("Sheet1")

但后者看起来就像我试图重命名/缩短“工作表”,这似乎完全错误。我试图将一个工作簿中的所有工作表放入一个叫做wss的工作表对象中。这更多是为了尝试理解层次结构,但出于实际目的,我想让wss包括来自工作簿x的所有工作表,这样我只需执行 ws = wss(1) 而不是说 set ws = wb.worksheets(1)

那是否可能实现,或者我误解了工作表/工作表之间的关系?


通常最容易找到这类问题的答案是通过使用对象浏览器并查看方法或属性定义。 - Comintern
我查看了SheetsWorksheets的成员,它们是一样的。帮助文件说Worksheets返回工作表集合,我觉得这应该没问题,因为我对图表不感兴趣。我只想利用workbook.worksheets集合来创建一个工作表对象。我觉得我可能漏掉了一些简单的东西,所以想看看这个论坛有什么好的建议!我发现这里的代码创意最多,解释也最简单(相比官方文档)。 - jamheadart
1
文档有误导性。如果您查看SheetsWorksheets属性,您会发现它们都返回一个Sheets对象。 - Comintern
好的,这就是混淆的地方。我不太明白为什么Worksheets会返回一个Sheets集合而不是一个Worksheets集合。谢谢你的澄清。 - jamheadart
这只是一个包含WorksheetsSheets集合。我想我今天已经写够了VBA :D - jamheadart
1个回答

12

您必须将wss声明为Sheets对象。

Dim wss As Sheets
Dim ws As Worksheet

Set wss = ThisWorkbook.Worksheets
Set ws = wss("Sheet1")
这是因为Workbook对象的Worksheets属性返回一个包含工作簿中的WorksheetsCharts对象的集合,即一个Sheets集合。

如果您需要仅获取Workbook对象的Worksheets集合(不包括Charts),以便像这样调用ws = wss(1)或类似的操作,则可以使用Collection对象采用以下解决方法。

Option Explicit

Sub main()
    Dim wss As Collection
    Dim ws As Worksheet

    Set wss = GetWorkSheets
    Set ws = wss("Sheet1")
    Set ws = wss(1)
End Sub

Function GetWorkSheets() As Collection
    Dim wss As New Collection
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        wss.add ws, ws.Name
    Next ws
    Set GetWorkSheets = wss
End Function

好的,这让我更接近理解了。总体上还是有点困惑,所以可以使用Set wss = ThisWorkbook.Sheets来返回一个Sheets集合,但如果你使用Set wss = ThisWorkbook.Worksheets,那也会返回一个Sheets集合? - jamheadart
1
不,那将是一个无效的赋值,因为根据 Excel 对象模型,Workbook 对象的 Worksheets 属性返回一个 Sheets 集合。因此,Set wss = ThisWorkbook.Worksheets 会导致 类型不匹配错误 - user3598756
太棒了,感谢您更新了这个函数。你们真是太棒了。 - jamheadart
1
获取工作表集合不需要特殊函数。Dim wss As SheetsSet wss = ThisWorkbook.Worksheets 可以返回仅包含工作表(而不包含图表或宏表)的工作表集合对象。例如,可以使用 Debug.Print wss(1).Name - Dick Kusleika
@DickKusleika,是的,你说得对,jamheadart已经明白了(请看它的最后一条评论)。我将保留GetWorkSheets函数作为构建和使用自定义工作表集合的示例。 - user3598756

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接