我正在处理一个 Excel VBA 脚本,该脚本要求我有序地将原始 excel 工作簿中的不同详细信息复制并粘贴到 5 个新的 excel 工作簿中。此外,我正在将宏添加到加载项中,以便可以将其添加到另一台计算机中。我唯一的问题是我无法引用原始工作簿,因为:
1(原始工作簿的文件名将始终更改,因此我无法根据其名称拉出工作簿/将工作簿名称分配给变量。
2(Excel VBA具有ActiveWorkbook/ThisWorkbook属性,但它没有 ActiveWorkbook属性将始终更改,具体取决于当前处于活动状态的工作簿。话虽如此,ActiveWorkbook 对我不起作用,因为创建新工作簿将覆盖原始工作簿。此工作簿属性对我不起作用,因为 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
您对如何使用ActiveWorkbook
和ThisWorkbook
对象感到困惑。最好的方法是始终控制您在流程中处理的所有元素,在这种情况下,您有一个工作簿,它是您的原始工作簿,并且您希望稍后在例程中使用其数据和路径。无论是从外接程序还是从原始工作簿本身,甚至从另一个工作簿运行例程,都无关紧要。原始工作簿具有一个路径,您可以在代码中动态定义该路径,也可以仅硬编码。因此,您可以使用以下一些选项:
如果原始工作簿处于打开状态且处于活动状态,则执行此操作以始终引用它并检索其路径:
Dim WB_Orig As Workbook
Set WB_Orig = 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
很棘手,作为一种好的做法,您应该始终尝试预见和控制错误,而不是忽略它们。