簡體   English   中英

Excel VBA選擇原始工作簿

[英]Excel VBA Selecting Original Workbook

我正在使用Excel VBA腳本,該腳本要求我有序地將原始excel工作簿的不同詳細信息復制並粘貼到5個新的excel工作簿中。 另外,我正在將宏添加到加載項中,以便可以將其添加到另一台計算機中。 我唯一的問題是,由於以下原因,我無法引用原始工作簿:

1)原始工作簿的文件名將始終更改,因此我無法根據其名稱提取工作簿/將工作簿名稱分配給變量。

2)Excel VBA具有ActiveWorkbook / ThisWorkbook屬性,但並非ActiveWorkbook屬性會一直更改,具體取決於當前處於活動狀態的工作簿。 就是說,ActiveWorkbook對我不起作用,因為新工作簿的創建將覆蓋原始工作簿。 ThisWorkbook屬性對我不起作用,因為VBA代碼將存儲在外接程序中,但是我想將新文件保存在原始工作簿的位置(這是在我使用ThisWorkbook.Path標識位置時)。

有誰知道我是否可以讓Excel VBA讀取原始文件的位置並將該值鎖定為變量,以便在需要再次引用它時始終可以再次調用它?

下面是我的示例代碼。 任何幫助將不勝感激。 謝謝!

Option Explicit

Sub new()

    Dim createWb As Workbook
    Dim Originalwks As Worksheet
    Dim createWbName As String

    Set Originalwks = ActiveWorkbook.ActiveSheet

    createWbName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4)
    Set createWb = Workbooks.Add
    createWb.SaveAs Filename:=ThisWorkbook.Path & Application.PathSeparator & createWbName
    createWb.Sheets("Sheet1").Name = createWbName

    Originalwks.UsedRange.Copy
    createWb.Worksheets(createWbName).Range("A1").PasteSpecial xlValues

    'I will still be adding new workbooks by copying values from the original workbook. 
    'But how do I pull out the original workbook again? 

    createWb.Close SaveChanges:=True

End Sub

您對如何使用ActiveWorkbookThisWorkbook對象感到困惑。 最好的方法始終是控制流程中要處理的所有元素,在這種情況下,您有一個工作簿,它就是原始工作簿,並且您想在以后的例程中使用它的數據和路徑。 從外接程序,原始工作簿本身,甚至從另一個工作簿運行例程都沒關系。 原始工作簿具有一個路徑,您可以在代碼中動態定義它,也可以僅對其進行硬編碼。 因此,您可以使用以下一些選項:

如果原始工作簿處於打開狀態且處於活動狀態,請執行以下操作以始終引用它並檢索其路徑:

Dim WB_Orig As Workbook
Set WB_Orig = ActiveWorkbook

如果activeworkbook發生更改,則不會造成問題。 另外,無論從加載項運行代碼還是從原始工作簿本身運行代碼, activewokbook都將是該代碼(您在屏幕上看到的代碼),如果從加載項運行它,則ThisWorkbook將引用加載項工作簿,並且不是您的原始工作簿。

如果您從加載項中運行代碼,我將嘗試找到原始工作簿並像這樣打開它並將其同時設置為一個對象:

Set WB_Orig = Application.Workbooks.Open("filename") 'filename is the path to your original workbook

同樣,可能存在工作簿處於打開狀態的情況,因此最好在嘗試打開它之前先檢查所有打開的工作簿名稱。 您可以遍歷打開的工作簿並檢查其名稱,如果有匹配項,只需將其分配為WB_Orig

Function GetOriginalWorkbook(sFilename As String)
    Dim WB As Workbook
    For Each WB In Application.Workbooks
        If WB.Name = sFilename Then
            Set GetOriginalWorkbook = WB
            Exit For
        End If
    Next
End Function

使用您的子程序中的上述功能,您可以輕松地執行以下操作:

Set WB_Orig = GetOriginalWorkbook("Book1") 'you need to change Book1 with the name of your origianl workbook.

如果原始工作簿已打開,則將其作為已分配給WB_Orig的對象,否則將為Nothing ,應打開它:

Set WB_Orig = GetOriginalWorkbook("Book1")

if WB_Orig is Nothing then
     Set WB_Orig = Application.Workbooks.Open("filename")
end if

另一個技巧是在嘗試打開原始工作簿然后將其設置回goto 0之前,將on error設置為resume next 這樣,如果未打開原始工作簿,則Excel將打開它,如果已打開,則將引發錯誤,但是由於您告訴excel忽略它,它將恢復執行代碼,您應該可以。 on error resume next使用on error resume nexton error resume next棘手的問題,作為一種好習慣,您應該始終預見和控制錯誤,不要忽略它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM