全球工作簿参考!

时间:2011-01-05 08:10:39

标签: vba excel-2007

我正在创建一个相当大的宏,它使用多个工作表来获取目前的5个工作簿(可能会随着时间的推移而增加),并将它们组合成一个工作簿。

现在,我认为最简单的方法来执行所有各种任务,我必须做的是声明对工作簿的全局引用。但它似乎没有用。

所以,我已将其声明为:

Public E1_workbook          As Workbook

然后当宏被启动时,它将实例化它。

   Private Sub Begin()

      ...
      Set E1_workbook = Workbooks.Open(Filename:="Workbook name")

      ...
      'Do other stuff
      ...

      Whatever

      ...

      'Close workbooks and free up resources...

      ...

   End Sub

然后在另一个子例程中进一步向下,我尝试使用工作簿:

   private sub Whatever()

        E1_workbook.Worksheets("worksheet name").Select

但是,这将失败,说明“工作表类的选择方法失败”

即使我可以将上面的“Whatever()”子句中的确切行复制到“Begin()”子组中,但它仍能正常运行。

为什么?

TIA

(工作簿和工作表的名称已经更改,以保护无辜者)

1 个答案:

答案 0 :(得分:2)

我假设您在调用Whatever函数之前打开了几个工作簿。您只能在有效工作簿中的可见工作表上调用Select功能。

这意味着您需要在E1_workbook.Activate前添加E1_workbook.Worksheets("worksheet name").Select,如果工作表名称“工作表名称”是隐藏工作表,您还需要使用E1_workbook.Worksheets("worksheet name").Visible = xlSheetVisible将其显示为可见将值设置为xlSheetHidden

,再次隐藏工作表

顺便提一下,我建议你把所有的工作簿放在一个Collection或一个Array中,然后将这个数组传递给any函数,而不是使用public globals。一种方法是:

Private Sub begin()
    Dim srcWorkbooks As Collection

    Set srcWorkbooks = New Collection
    srcWorkbooks.Add workbooks.Open("fileName1")
    srcWorkbooks.Add workbooks.Open("fileName2")

    whatever srcWorkbooks
End Sub

Private Sub whatever(srcWorkbooks As Collection)
    Dim srcWorkbook As Workbook

    For Each srcWorkbook In srcWorkbooks
        srcWorkbook.Activate
        srcWorkbook.Sheets(1).Select
    Next srcWorkbook

    closeWorkbooks srcWorkbooks
End Sub

Private Sub closeWorkbooks(srcWorkbooks As Collection)
    Dim i As Integer

    For i = srcWorkbooks.Count To 1 Step -1
        srcWorkbooks(i).Close
        srcWorkbooks.Remove i
    Next i

    Set srcWorkbooks = Nothing
End Sub