【问题标题】:How to save xlsm as xlsx?如何将 xlsm 保存为 xlsx?
【发布时间】:2021-06-29 18:26:50
【问题描述】:

我有一个 xslm 文件。我想将文件另存为 xlsx 和电子邮件。

我可以将它保存为 xls 文件。如果我尝试将其保存为 xlsx,它确实会被保存,但是当我打开它时,它会出现错误。

ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & "\MyFileName - " & Format(Date, "mm-dd-yyyy") & ".xlsx"

Excel 无法打开文件“...path\MyFileName.xlsx”,因为文件格式或文件扩展名无效。验证文件未损坏且文件扩展名与文件格式匹配

【问题讨论】:

  • 请记住,如果文件中有 VBA 宏,则不能使用扩展名 XLSX。
  • @braX 可以,但是重新打开后,所有宏都消失了。

标签: excel vba xlsx


【解决方案1】:

SaveCopyAs 不会更改文件类型。

您根本无法通过SaveCopyAs 将 .xlsm 保存为 .xlsx。

编辑

一种解决方法是保存一个副本,然后更改类型,同时删除旧副本,如下所示:

Dim wb As Workbook, pstr As String

pstr = ActiveWorkbook.Path & "\MyFileName - " & Format(Date, "mm-dd-yyyy") & ".xlsm"
ActiveWorkbook.SaveCopyAs Filename:=y

Set wb = Workbooks.Open(pstr)
wb.SaveAs Left(pstr, Len(pstr) - 1) & "x", 52
wb.Close False

Kill pstr

【讨论】:

  • 它如何允许保存为 xls 而不是 xlsx?请指导是否有办法将此文件保存为 xlsx,因为用户期望它为 xlsx
  • 如果可能的话,我可以使用 SaveAs
  • @SilverFish SaveCopyAs 根本不会更改文件类型...(它不能);)
  • 我可以手动打开 xslm 文件并将文件另存为 Excel Workbook xlsx。它确实提示它将其保存为无宏工作簿。但这很好。因为我们必须通过电子邮件将其发送给用户并且不需要宏。所以你是说这是不可能的?
  • @SilverFish 只需使用SaveAs 而不是SaveCopyAs - 然后将参数传递给.xlsx 您也可以使用Application.DisplayAlerts = False msdn.microsoft.com/en-us/vba/excel-vba/articles/… 忽略弹出警告
【解决方案2】:

试试这个:

Sub SaveAsXLSX()
ThisWorkbook.Save   'Optional
Application.DisplayAlerts = False
ThisWorkbook.SaveAs ActiveWorkbook.Path & "\MyFileName - " & Format(Date, "mm-dd-yyyy"), 51 '51 = xlsx
Application.DisplayAlerts = True
ThisWorkbook.Close  'Optional
End Sub

您只需SaveAs 并将文件格式更改为51 (xlsx)

如果你想“保存副本” - SaveAs 几乎做同样的事情 - 不同之处在于你当前打开的文件变成了保存的文件,但如果你愿意,你可以简单地重新打开旧文件,没有任何变化。

您真正想要做的是SaveAs 一个不同的文件类型,所以使用SaveAs

【讨论】:

  • 请记住,宏的执行可能会变得复杂,因为 SaveAs 将新文件设置为实际文件......这样ThisWorkbook 在运行时会发生变化......如果您正在您的工作簿只是要发送一份副本,请记住关闭工作簿并重新打开原始工作簿。
  • @DirkReichel 它仍然关闭工作簿,因此宏似乎将完成运行,尽管它没有“保存”在新文件中。
  • 仅适用于使用某种主工作簿的情况,该工作簿将创建一个用于发送的非宏副本,同时仍与主工作簿一起工作......在这种情况下,OP 需要重新打开主文件......仍然,如前所述:我们只看到一行,所以我主要“猜测”这部分(因为这是我处理大多数文件的方式,所以我不需要每次都搜索最新的一)
【解决方案3】:

I 这更具可读性。经过测试。

 Sub SaveXlsmAsXlsx() 
Dim wb As Workbook, Filenamepath As String, Filenameext As String, Filenameonly As String, Filepathonly As String

Application.DisplayAlerts = False
Filenamepath = ActiveWorkbook.FullName
Filenameext = ActiveWorkbook.Name
Filenameonly = Replace(Filenameext, ".xlsm", "")
Filepathonly = Replace(Filenamepath, ".xlsm", "")
Set wb = Workbooks.Open(Filenamepath)
'51 = xlsx
wb.SaveAs Filename:=Filepathonly & "_" & Format(Date, "mm-dd-yyyy"), FileFormat:=51
wb.Close True
'Kill- Best not to kill anyone, you might be sorry
ThisWorkbook.Close SaveChanges:=True
Application.DisplayAlerts = True
End Sub

【讨论】:

    【解决方案4】:
    1. 此代码添加到任何模块:
    Public Sub XLSMtoXLSX(FaylAdi As String)
    Dim FullPath As String
    Dim wb As Workbook
    
    MsgBox "YOU WILL GET A WARNING AFTER COMPLETED, PLEASE WAIT"
    
    ThisWorkbook.Save
    
    On Error GoTo XETA
    
    'You can change the name of the folder path below
    FullPath = "C:\kohne sistem\Excel\VBA\Anbar\temp\" & FaylAdi & ".xlsm"
    ThisWorkbook.SaveCopyAs FullPath
    
    Application.DisplayAlerts = False
    Set wb = Workbooks.Open(FullPath)
    wb.SaveAs Left(FullPath, Len(FullPath) - 1) & "x", 51
    wb.Close False
    Kill FullPath
    Application.DisplayAlerts = True
    MsgBox "COMPLETED CORRECTLY"
    Exit Sub
    XETA: MsgBox "THERE WAS A FAULT SOMEWHERE"
    End Sub
    
    1. 那么你可以这样使用它:
    Private Sub CommandButton1_Click()
    Call XLSMtoXLSX(Date)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多