Excel VBA选择原始工作簿

时间:2018-08-22 18:02:20

标签: excel vba excel-vba

我正在处理一个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

1 个答案:

答案 0 :(得分:3)

您对如何使用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

另一种技巧是将on error设置为resume next,然后再尝试打开原始工作簿,然后再将其设置回goto 0。这样,如果未打开原始工作簿,则Excel将打开它,如果已打开,则将引发错误,但是由于您告诉excel忽略它,它将恢复执行代码,您应该可以。使用on error resume next有点棘手,作为一个好的实践,您应该始终尝试预见和控制错误,而不能忽略它们。