【问题标题】:Force Save as XLSM While Maintaining File Structure在保持文件结构的同时强制另存为 XLSM
【发布时间】:2012-08-20 03:23:32
【问题描述】:

所以我正在处理一个 XLTM 文件,我希望用户确保他们保存为 XLSM。当他们点击“保存”时,这工作正常,但我发现当他们点击“另存为”时,文件被保存为“*.xlsm.xlsm”。对于如何确保用户保存为 XLSM,同时将文件名保留为“filename.xlsm”而不是“filename.xlsm.xlsm”,我有点不知所措。

    'Action makes sure the user saves as XLSM file type.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim FileNameVal As String 
    If SaveAsUI Then 
        FileNameVal = Application.GetSaveAsFilename(, "Excel Macro-Enabled Workbook (*.xlsm), *.xlsm") 
        Cancel = True 
        If FileNameVal = "False" Then 'User pressed cancel
            Exit Sub 
        End If 

        Application.EnableEvents = False 
        ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat 
        Application.EnableEvents = True 
    End If 
End Sub 

我认为问题可能是在写“.xlsm”:

ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat 

但是,如果没有在此处写入“.xlsm”,我发现该文件会保存为错误的文件后缀。 (例如,如果我的XLTM文件名为Template(File001).xltm,用户打开一个新的模板文件,它会保存为Template(File001)1(相信“1)1”是文件类型)。

这可能是我的代码结构,所以我需要指导如何修改它。

【问题讨论】:

  • 用户输入文本框后使用调试器时FileNameVal的值是多少?
  • FileFormat:=ThisWorkbook.FileFormat 更改为FileFormat:=52 会发生什么?
  • @SiddharthRout 与此更改没有区别。
  • @enderland 保存一次后,发现FileNameVal 会自动为我添加后缀。因此,在最初将其保存为“.../My Documents/Template(1).xlsm”后,当我选择另存为并输入“1111”时,它将为FileNameVal 提供“1111.xlsm”的值并保存文件为“.../My Documents/1111.xlsm.xlsm”
  • ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=ThisWorkbook.FileFormat将此行更改为ThisWorkbook.SaveAs Filename:=FileNameVal, FileFormat:=52

标签: excel filenames before-save vba


【解决方案1】:

问题似乎已经存在,因为模板在最初实际保存文件之前将其命名为“Template(1)1”。这改变了 Excel 保存文件的方式,因此在此初始保存和进一步保存(已包含文件扩展名)之间进行对比的最简单方法是使用 if-then 语句来判断扩展名是否已存在。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim FileNameVal As String
If SaveAsUI Then
    FileNameVal = Application.GetSaveAsFilename(, "Excel Macro-Enabled Workbook (*.xlsm), *.xlsm")
    Cancel = True
    If FileNameVal = CStr(False) Then 'User pressed cancel
        Exit Sub
    End If
    Application.EnableEvents = False
        If Right(ThisWorkbook.Name, 5) <> ".xlsm" Then
            ThisWorkbook.SaveAs Filename:=FileNameVal & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
        Else
            ThisWorkbook.SaveAs Filename:=FileNameVal, FileFormat:=xlOpenXMLWorkbookMacroEnabled
        End If
    Application.EnableEvents = True
End If
End Sub

【讨论】:

  • 我知道这是一个非常古老的线程,但人们仍然会找到它。如果您的语言环境设置不是英语(在我的情况下是荷兰语),If FileNameVal = "False" Then 'User pressed cancel 行将失败。使用cstr(False) 而不是"False" 来防止这种情况发生。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多