Excel 2016/2013运行SaveAs方法2次崩溃

Excel 2016/2013运行SaveAs方法2次崩溃,excel,vba,Excel,Vba,我想创建几个新的工作簿。下面的VBA代码在Excel 365和2010中运行良好。但对于Excel 2013或2016,它第一次运行良好(并创建文件)。。。在第二次运行时,Excel崩溃,没有任何错误消息 如果我一步一步地运行它,我会发现是SaveAs行导致了崩溃 我也试图在保存之前删除该文件。要使用计时器 我试图修复Office,重新命名HKEY(身份),我试图在两个不同的窗口(7或10)上运行它。没有任何帮助:/ Sub ExtraireType() Dim shVentes As Work

我想创建几个新的工作簿。下面的VBA代码在Excel 365和2010中运行良好。但对于Excel 2013或2016,它第一次运行良好(并创建文件)。。。在第二次运行时,Excel崩溃,没有任何错误消息

如果我一步一步地运行它,我会发现是
SaveAs
行导致了崩溃

我也试图在保存之前删除该文件。要使用计时器

我试图修复Office,重新命名HKEY(身份),我试图在两个不同的窗口(7或10)上运行它。没有任何帮助:/

Sub ExtraireType()
Dim shVentes As Worksheet
Dim rngVentes As Range
Dim rngTypes As Range
Dim shNew As Worksheet
Dim wkbNew As Workbook
Dim strPath As String
Dim zaza As Range

Application.DisplayAlerts = False
Set shVentes = ThisWorkbook.Worksheets("Ventes")
Set rngVentes = shVentes.Range("A1").CurrentRegion
Set rngTypes = ThisWorkbook.Worksheets("Liste").Range("A2:A4")
strPath = ThisWorkbook.Path

For Each zaza In rngTypes
    rngVentes.AutoFilter
    rngVentes.AutoFilter field:=3, Criteria1:=zaza.Value
    rngVentes.Copy
    Set shNew = ThisWorkbook.Worksheets.Add
    shNew.Paste
    Application.CutCopyMode = False
    shNew.Move
    Set wkbNew = ActiveWorkbook
    wkbNew.SaveAs strPath & "\Type" & zaza.Value & Format(Date, "yyyymmdd")
    wkbNew.Close
    Set shNew = Nothing
    Set wkbNew = Nothing
Next zaza

Set rngVentes = Nothing
Set shVentes = Nothing
Set rngTypes = Nothing
Application.DisplayAlerts = False
End Sub
此代码在Excel 2010或2019/365中运行良好。但我必须在2013年或2016年使用它:(


我做错了什么?感谢您的帮助!

您的代码崩溃的原因之一(在我的例子中,它崩溃了,Excel 2016),可能是因为您没有在结尾添加文件扩展名:
wkbNew.SaveAs strPath&“\Type”和zaza.Value和Format(日期,“yyyyymmdd”)
所以可能是这样:
wkbNew.SaveAs strPath&“\Type”和zaza.Value和Format(日期,“yyyymmdd”)和“.xlsx”

希望能有所帮助。

您的代码崩溃(在我的例子中,Excel 2016崩溃)的原因之一可能是因为您没有在结尾添加文件扩展名:
wkbNew.SaveAs strPath&“\Type”和zaza.Value和Format(日期,“yyyyymmdd”)
所以可能是这样:
wkbNew.SaveAs strPath&“\Type”和zaza.Value和Format(日期,“yyyymmdd”)和“.xlsx”

希望能有所帮助。

我也遇到了这个问题,并找到了一个解决方法-改用.SaveCopyAs

在下面的示例中,.SaveAs如果我一直打开Excel电子表格并删除结果文件,则会每秒崩溃一次Excel,而.SaveCopyAs则不考虑每次都保存。两者之间的唯一区别是.SaveAs具有更多的保存选项,而.SaveCopyAs的唯一选项是文件名

Private Sub SaveAsExcelFile(TempExcelFile As Workbook, _
     NewFullFileName as string, _
     Optional FileFormat As XlFileFormat = xlOpenXMLWorkbook, _
     Optional CreateBackup As Boolean = False)
'
' created & last edited 2020-03-06 by Timothy Daniel Cox
'
' For this example it is assumed the new file name is valid and in .xlsx format
'
    Dim NewFullFileName2 as string

    NewFullFileName2 = Replace(NewFullFileName, ".xlsx", "2.xlsx")
    Application.EnableEvents = False
    TempExcelFile.SaveCopyAs Filename:=NewFullFileName 'doesn't crash here on 2nd run
    TempExcelFile.SaveAs Filename:=NewFullFileName2, FileFormat:=FileFormat, _
                         CreateBackup:=False 'will crash here on 2nd run
    Application.EnableEvents = true
End Sub
我仍然认为Excel中关于.SaveAs的问题存在缺陷,但是:

  • 有一根长长的线 在蜿蜒之后,它有一个明显的分辨率,即链接但具有 下载文件以查看所做的更改-仅限他 似乎已更改输出目录并删除了 设置的文件格式冲突。IMO未解析 问题。
  • 还有另一个类似的未解决的线程没有有用的答案

我也遇到了这个问题,并找到了一个解决方法-改用.SaveCopyAs

在下面的示例中,.SaveAs如果我一直打开Excel电子表格并删除结果文件,则会每秒崩溃一次Excel,而.SaveCopyAs则不考虑每次都保存。两者之间的唯一区别是.SaveAs具有更多的保存选项,而.SaveCopyAs的唯一选项是文件名

Private Sub SaveAsExcelFile(TempExcelFile As Workbook, _
     NewFullFileName as string, _
     Optional FileFormat As XlFileFormat = xlOpenXMLWorkbook, _
     Optional CreateBackup As Boolean = False)
'
' created & last edited 2020-03-06 by Timothy Daniel Cox
'
' For this example it is assumed the new file name is valid and in .xlsx format
'
    Dim NewFullFileName2 as string

    NewFullFileName2 = Replace(NewFullFileName, ".xlsx", "2.xlsx")
    Application.EnableEvents = False
    TempExcelFile.SaveCopyAs Filename:=NewFullFileName 'doesn't crash here on 2nd run
    TempExcelFile.SaveAs Filename:=NewFullFileName2, FileFormat:=FileFormat, _
                         CreateBackup:=False 'will crash here on 2nd run
    Application.EnableEvents = true
End Sub
我仍然认为Excel中关于.SaveAs的问题存在缺陷,但是:

  • 有一根长长的线 在蜿蜒之后,它有一个明显的分辨率,即链接但具有 下载文件以查看所做的更改-仅限他 似乎已更改输出目录并删除了 设置的文件格式冲突。IMO未解析 问题。
  • 还有另一个类似的未解决的线程没有有用的答案

shNew.Move
Set wkbNew=ActiveWorkbook
之间,需要给一些外部代码运行的机会。请尝试在
shNew.Move
指令之后添加
DoEvents
,看看是否有帮助。谢谢Mathieu,但仍然崩溃:(strPath和“\Type”的值是多少&zaza.Value和格式(日期,“yyyymmdd”)崩溃时。在该行之前使用
Msgbox
查看值c:\Users\Philippe\Desktop\typegrossiste20191111在
shNew.Move
Set wkbNew=ActiveWorkbook
之间,需要给一些外部代码运行的机会。请尝试在
shNew.Move之后添加
DoEvents
指令,看看是否有用。谢谢Mathieu,但仍然崩溃:(strPath&“\Type”&zaza.value和Format(Date,“yyyymmdd”)的值是多少
崩溃时。在该行之前使用
Msgbox
查看值c:\Users\Philippe\Desktop\typegrossiste20191111,因此我尝试了
shNew.Move'DoEvents Set wkbNew=ActiveWorkbook'Debug.Print strPath&“\Type”&zaza.Value&Format(Date,“yyyyymmdd”)'wkbNew.SaveAs strPath&\Type”&zaza.Value和Format(日期,“yyyymmdd”),FileFormat:=51
wkbNew.SaveAs strPath&“\Type”&zaza.Value和Format(日期,“yyyymmdd”)&.xlsx”
但是……没有什么更好的,它在第二次运行时仍然崩溃。因此我尝试了
shNew.Move'DoEvents Set wkbNew=ActiveWorkbook'Debug.Print strPath&“\Type”&zaza.Value&Format(Date,“yyyyymmdd”)'wkbNew.SaveAs strPath&“\Type”&zaza.Value&Format(Date,“yyyyymmdd”),FileFormat:=51
wkbNew.SaveAs strPath&“\Type”&zaza.Value&Format(Date,“yyyyymmdd”)&.xlsx”
但是……没有更好的,它在第二次运行时仍然崩溃。它有帮助!仍然是文件格式的问题(xlsm=>xlsx),但它是什么;)ThxIt有帮助!仍然是文件格式的问题(xlsm=>xlsx)但事实就是这样;)Thx