是否可以创建一个不活跃的新工作簿?

时间:2018-10-19 17:31:16

标签: excel vba excel-vba

更新的问题:真正的问题似乎是我在文件名后附加了日期。我似乎无法重新设置日期格式,并且错误似乎是由日期中的/触发的,那么如何重新设置此格式,以便excel理解文件名中包含日期?我现在了解到,SaveCopyAs不需要“虚拟”文件即可首先上传。

我目前对SaveCopyAs方法遇到运行时错误1004,说它找不到我要创建的新文件的位置。我的解释是,我需要创建一个“虚拟”文件来保存复制的信息,然后再用数据和新的文件名覆盖它。它是否正确?

创建虚拟文件并分别引用每个文件,然后按照上面的解释继续操作,解决方案将很简单。但是,我试图循环此过程,并且使用的是PERSONAL.XLSB中托管的模块,因此我无法使用ThisWorkbook,而必须使用ActiveWorkbook。现在的问题是,由于使用ActiveWorkbook,我不知道如何创建将数据复制到新文件的自动化过程。

这是我当前的代码:

Sub cellvalue_filename()

    Dim Path
    Dim NewPath
    Dim WBname
    Dim Destination

    Path = "C:\oldfilelocation\"
    WBname = ActiveWorkbook.Name
    NewPath = "C:\newfilelocation\"

    Destination = NewPath & Range("B2") & WBname

    ActiveWorkbook.SaveCopyAs filename:=Destination
    ActiveWorkbook.Close

End Sub

1 个答案:

答案 0 :(得分:2)

作为一般规则,在VBA中最好显式地引用所需的工作簿和工作表,而不是依赖于其处于活动状态。

您说您不能使用ThisWorkbook,因为您引用的工作簿不是包含VBA代码的工作簿,但这并不意味着您必须使用ActiveWorkbook

相反,当您打开或创建工作簿时,您可以获得参考,例如

Dim objWorkbook As Workbook
Set objWorkbook = Application.Workbooks.Open(...)
...
objWorkbook.SaveCopyAs ...

类似地使用Range("B2")而不指定工作表将假定活动工作簿中的活动工作表。而是明确指定工作表,例如:

Dim objWorksheet As Worksheet
Set objWorksheet = objWorkbook.Worksheets(1) ' or whatever worksheet you want 
...
Destination = NewPath & objWorksheet.Range("B2") & WBname