2011-01-05 93 views
0

我正在創建一個相當大的宏,它需要使用多個工作表的目前5個工作簿(這可能會隨着時間的推移而增加),並將它們合併到一個工作簿中。現在全球手冊參考!

,我還以爲做的一切taht我要做的是宣佈一個全球性的參考工作簿中的各種任務的最簡單方法。但它似乎並不奏效。

所以,我已經聲明它:

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

(該工作簿和工作表的名稱已更改爲保護無辜者)

回答

2

我假設你調用函數無論之前打開工作簿夫婦的。您只能調用一個可見表Select功能在活動工作簿

這意味着你需要在E1_workbook.Worksheets("worksheet name").Select前面加E1_workbook.Activate,如果表「工作表名稱」是一個隱藏的工作表,你還需要通過將該值設置爲xlSheetHidden

再次使其可見通過 E1_workbook.Worksheets("worksheet name").Visible = xlSheetVisible可以隱藏工作表

順便說一句,我建議你把所有的工作簿放在一個集合或數組中,並將這個數組傳遞給任何函數而不是使用公共全局變量。一種方法是:

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 
+0

感謝瑪格花時間回覆 - 我剛剛發現我是個白癡。在嘗試引用工作表之前,應已激活工作簿。我想更多的咖啡。對不起浪費你的時間! – JustAPleb 2011-01-05 09:00:33

+0

哦,對這個系列有很好的想法 - 我會用它。 Ta :-D – JustAPleb 2011-01-05 09:02:23