宏 VBA,无法让“SaveAs”发挥作用

Posted

技术标签:

【中文标题】宏 VBA,无法让“SaveAs”发挥作用【英文标题】:Macro VBA, can't get "SaveAs" to function 【发布时间】:2021-06-29 19:36:20 【问题描述】:

我有一个在工作簿集上运行的流程。我试图在关闭文件时修改文件类型。在关闭每个工作簿之前,我正在尝试将其添加到流程的末尾。现在,打开的文件位于 .xlsb 中。我正在尝试将其保存为基本上任何其他格式(.xsls 等)

每当我运行宏时,“SaveAs”命令都会出错。我已经尝试了所有我能想到的方法,只是用相同的名称、不同的文件类型保存文件,但没有运气。

我做错了什么?



Application.ScreenUpdating = False
Application.DisplayAlerts = False

Path = ThisWorkbook.Sheets(1).Range("H6")

If Right(Path, 1) <> "\" Then
    Path = Path & "\"
End If


wsheet = ThisWorkbook.Sheets(1).Range("F10")

ThisWorkbook.Sheets(3).Range("A2:B20000").ClearContents
OutLn = 2
Line = 1

Do While ThisWorkbook.Sheets(2).Cells(Line, 1) <> ""
    OpnFil = ThisWorkbook.Sheets(2).Cells(Line, 1)
    Workbooks.Open fileName:=Path & OpnFil, UpdateLinks:=False
    ScanLn = 12
        Do While ThisWorkbook.Sheets(1).Cells(ScanLn, 5) <> ""
            ThisWorkbook.Sheets(3).Cells(OutLn, 1) = OpnFil
            Addr = ThisWorkbook.Sheets(1).Cells(ScanLn, 5)
            ThisWorkbook.Sheets(3).Cells(OutLn, 2) = Workbooks(OpnFil).Sheets(wsheet).Range(Addr)
            OutLn = OutLn + 1
            ScanLn = ScanLn + 1
        Loop
    Workbooks(OpnFil).SaveAs fileName:=Workbooks(OpnFil).GetBaseName, FileFormat:=51
    Workbooks(OpnFil).Close
    Line = Line + 1
Loop

End Sub```

【问题讨论】:

Workbook 没有 GetBaseName 方法。 GetBaseNameFileSystemObject 的一个方法。 不,也许这是我的问题。我希望它会保存到它从(路径)打开的具有相同文件名的相同扩展名中。 我也试过这个Workbooks(OpnFil).SaveAs fileName:=Workbooks(OpnFil).Name, FileFormat:=51 和其他大约一百个哈哈。 请记住,FileFormat 必须与扩展名匹配,否则您会收到错误消息。 好的,很高兴知道,正在打开的文件是 .xlsb。我要添加的部分内容是将其保存为另一个文件路径 .xls/.xlsx。我想我可以通过添加 FileFormat 值来做到这一点。 【参考方案1】:

备份工作簿

使用变量来避免(长)不可读的行(参数)。
Option Explicit

Sub BackupWorkbooks()
    
    Dim swb As Workbook: Set swb = ThisWorkbook
    
    Dim dFolderPath As String: dFolderPath = swb.Sheets(1).Range("H6").Value
    If Right(dFolderPath, 1) <> "\" Then
        dFolderPath = dFolderPath & "\"
    End If
    
    Dim dwsName As String: dwsName = swb.Sheets(1).Range("F10").Value
    
    Application.ScreenUpdating = False
    
    swb.Sheets(3).Range("A2:B" & swb.Sheets(3).Rows.Count).ClearContents
    
    Dim OutLn As Long: OutLn = 2
    Dim Line As Long: Line = 1
    
    Dim dwb As Workbook
    Dim dOldName As String
    Dim dOldPath As String
    Dim dNewPath As String
    Dim dAddr As String
    Dim ScanLn As Long
    
    Do While swb.Sheets(2).Cells(Line, 1) <> ""
        
        dOldName = swb.Sheets(2).Cells(Line, 1)
        dOldPath = dFolderPath & dOldName
        Set dwb = Workbooks.Open(Filename:=dOldPath, UpdateLinks:=False)
        
        ScanLn = 12
        Do While swb.Sheets(1).Cells(ScanLn, 5).Value <> ""
            swb.Sheets(3).Cells(OutLn, 1).Value = dOldName
            dAddr = swb.Sheets(1).Cells(ScanLn, 5).Value
            swb.Sheets(3).Cells(OutLn, 2).Value _
                = dwb.Worksheets(dwsName).Range(dAddr).Value
            OutLn = OutLn + 1
            ScanLn = ScanLn + 1
        Loop
        
        dNewPath = Left(dOldPath, InStrRev(dOldPath, ".") - 1) & ".xlsx"
        ' Or if you insist:
        'dNewPath =  dFolderPath & CreateObject("Scripting.FileSystemObject") _
            .GetBaseName(dOldName) & ".xlsx"
        
        Application.DisplayAlerts = False
        dwb.SaveAs Filename:=dNewPath, FileFormat:=xlOpenXMLWorkbook ' 51
        Application.DisplayAlerts = True
        dwb.Close
        
        Line = Line + 1
    
    Loop

    Application.ScreenUpdating = True
    
    MsgBox "Backups created.", vbInformation, "Backup Workbooks"

End Sub

【讨论】:

非常有帮助,谢谢。我也会研究这个以提高其他效率。谢谢!

以上是关于宏 VBA,无法让“SaveAs”发挥作用的主要内容,如果未能解决你的问题,请参考以下文章

对象'_Workbook'的方法'SaveAs'失败VBA

Excel VBA 宏无法在同事的计算机上保存工作簿,但在我的计算机上很好

在 ms access 2010 中将嵌入式宏转换为 vba 后,代码不再起作用

text EDIMAX网络摄像头。我无法让它发挥作用。回来。玩得开心。

使用 Excel VBA saveas 功能通过用户交互保存为 PDF

Word VBA虽然Wend语句不起作用