【问题标题】:VBA dim ws as worksheets (not worksheet)VBA 暗淡 ws 作为工作表(不是工作表)
【发布时间】:2016-09-24 23:35:41
【问题描述】:

好吧,我知道我可以做到:

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 的工作表对象中。这更多的是试图理解 heirachy,但出于功能目的,我试图让 wss 包含工作簿 x 中的所有工作表,所以我可以只做 ws = wss(1) 而不是说 set ws = wb.worksheets(1)

这是可能的还是我误解了工作表/工作表的关系?

【问题讨论】:

  • 通常最容易通过using the Object Browser 找到此类问题的答案并查看方法或属性定义。
  • 我查看了 Sheets 和 Worksheets 的成员,它们都是相同的。帮助文件说Worksheets 返回工作表集合,我认为这很好,因为我对图表不感兴趣。我只想利用 workbooks 对象来利用 workbook.worksheets 集合。我想我错过了一些简单的东西,所以我想看看这个论坛提供了什么!我在这里看到了最有创意的代码和/或简单的解释(与官方文档相比)。
  • 文档具有误导性。如果您查看SheetsWorksheets properties,您会发现它们都返回Sheets 对象。
  • 好的,这就是混乱所在。我不太明白为什么Worksheets 会返回Sheets 集合而不仅仅是Worksheets 集合。感谢您的澄清。
  • 这是一个 Sheets 集合,仅包含 Worksheets。我想我今天已经受够了 VBA :D

标签: vba excel


【解决方案1】:

您必须将wss 声明为Sheets 对象

Dim wss As Sheets
Dim ws As Worksheet

Set wss = ThisWorkbook.Worksheets
Set ws = wss("Sheet1")

这是因为Workbook 对象的Worksheets 属性返回一个Sheets 集合,即包含工作簿的WorksheetsCharts 对象的集合

如果您只需要 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 集合?
  • 不,这将是一个无效的分配,因为根据 Excel 对象模型 Worksheets 属性的 Workbook 对象返回一个 Sheets 集合。因此Set wss = ThisWorkbook.Worksheets 导致type mismatch error
  • 太棒了,感谢您使用该功能进行编辑更新。你们摇滚。
  • 您不需要特殊的函数来获取工作表的集合。 Dim wss As SheetsSet wss = ThisWorkbook.Worksheets 返回一个 Sheets 集合对象,它只包含工作表(而不是图表或宏表)。例如,您可以使用Debug.Print wss(1).Name
  • @DickKusleika,是的,你是对的,并且 jamheadart 已经明白了(见它的最后一条评论)。我将留下 GetWorkSheets 函数作为如何构建和使用自定义工作表集合的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2014-09-19
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多