在保存时创建.xlsm的副本为.xlsx

时间:2018-03-12 11:34:41

标签: excel vba excel-vba

我正在尝试创建工作簿.xlsm的备份副本并将其另存为.xlsx

由于与此处相同的问题:Run time error '1004': Copy method of worksheet class failed - Temp file issue 我无法使用SaveCopyAs以及更改文件格式

我的解决方法是

  1. 创建.xlsm文件的新副本
  2. 打开此新副本
  3. 将其另存为.xlsx
  4. 关闭.xlsx文件
  5. 从第1步中删除文件
  6. 这是我的代码

        Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        On Error GoTo ErrorHandler:
        'define variables
        Dim backupfolder As String
        Dim strFileName As String
        Dim xlsxStrFileName As String
        Dim fullPath As String
        Dim xlsxFullPath As String
        Dim wkb As Workbook
    
        'get timestamp
        dt = Format(CStr(Now), "yyyymmdd_hhmmss")
    
        'construct full path to backup file which will be later converted to .xlsx
        backupfolder = "c:\work\excel macro\delete\"
    
        strFileName = "Test_iz_" & dt & ".xlsm"
        fullPath = "" & backupfolder & strFileName
    
        xlsxStrFileName = "Test_iz_" & dt & ".xlsx"
        xlsxFullPath = "" & backupfolder & xlsxStrFileName
    
        ActiveWorkbook.SaveCopyAs Filename:=fullPath
    
        Set wkb = Workbooks.Open(fullPath)
    
        wkb.Activate
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs Filename:=xlsxFullPath, FileFormat:=51 'saves the file
        Application.DisplayAlerts = True
        'Application.Wait (Now + TimeValue("00:00:03"))
        ActiveWorkbook.Close
        Kill fullPath
        Exit Sub
    
    ErrorHandler:
        MsgBox "An error occured " & vbNewLine & vbNewLine & Err.Number & ": " & Err.Description
        MsgBox "Backup saved: " & xlsxFullPath
        ActiveWorkbook.SaveAs Filename:=fullPath
    
    End Sub
    

    我的问题是我总是在ErrorHandler中结束,即使我得到了预期的结果

    当我评论第2行时

    On Error GoTo ErrorHandler:
    

    错误运行时错误'91':未设置对象变量或With块变量 在Debug上,它指向带有代码的行

    wkb.Activate
    

    和.xlsm文件未被删除

    我想问题是,当我创建xlsm文件的新副本并保存它时,整个代码将再次执行,并且该问题存在于某处,但我无法找到它。 谢谢

1 个答案:

答案 0 :(得分:0)

这在我的电脑上有效:

Sub Workbook_BeforeSave()
On Error GoTo ErrorHandler:
'define variables
Dim backupfolder As String
Dim strFileName As String
Dim xlsxStrFileName As String
Dim fullPath As String
Dim xlsxFullPath As String
Dim wkb As Workbook

'get timestamp
dt = Format(CStr(Now), "yyyymmdd_hhmmss")

'construct full path to backup file which will be later converted to .xlsx
backupfolder = "c:\work\excel macro\delete\"

strFileName = "Test_iz_" & dt & ".xlsm"
fullPath = "" & backupfolder & strFileName

xlsxStrFileName = "Test_iz_" & dt & ".xlsx"
xlsxFullPath = "" & backupfolder & xlsxStrFileName

ActiveWorkbook.SaveAs Filename:=fullPath, FileFormat:=52
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=xlsxFullPath, FileFormat:=51 'saves the file
Application.DisplayAlerts = True
ActiveWorkbook.Close
Kill fullPath
Exit Sub
ErrorHandler:
MsgBox "An error occured " & vbNewLine & vbNewLine & Err.Number & ": " & Err.Description
MsgBox "Backup saved: " & xlsxFullPath
ActiveWorkbook.SaveAs Filename:=fullPath
End Sub

干杯,

乔纳森