【发布时间】:2019-01-29 01:25:12
【问题描述】:
我正在编写一个 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
【问题讨论】:
-
如果
Originalwks是ActiveWorkbook中的Activesheet,那么你不能只做Dim OriginalWb as Workbook和Set OriginalWb = ActiveWorkbook吗? -
这意味着如果我在我的新工作簿上,ActiveWorkbook 将更改为新工作簿。如何调用 VBA 重新拉出原来的工作簿?
-
你会有一个变量
OriginalWb- 引用它。尽管ActiveWorkbook会发生变化,但该变量将始终引用同一个工作簿——第一个处于活动状态的工作簿。OriginalWks的工作方式相同 - 即使ActiveSheet发生变化,您也可以引用第一个活动工作表。 -
ThisWorkbook始终指的是运行 VBA 代码的工作簿。如果那是 Excel 加载项,则ThisWorkbook是该 Excel 加载项的隐藏工作簿。 -
就我个人而言,我尽量避免使用 ActiveWorkbook,因为它可能会在意想不到的时候发生变化。 Excel 中有几个函数可以动态创建新的工作簿,这些工作簿成为 ActiveWorkbook,使用 ActiveWorkbook 可能会混淆您真正使用的是哪个工作簿。使用变量来保存您正在访问的工作簿,以便您知道自己拥有正确的工作簿。