VBA:回答 "save as - overwrite" 提示(和其他)不使用默认选项

VBA: Answer "save as - overwrite" prompt (and others) NOT with default option

我有一个 .xlsm 文件,我需要从中以非宏文件格式 (.xlsx) 保存一些工作表。 为此,我创建了以下代码。 第一部分将名为 "CombinedRaw" 的活动工作表保存为单独的文件 "DATATRY.xlsx"。这将关闭活动文件,即我们不再在文件 "data retrieve 9.xlsm" 中,而是在 "DATATRY.xlsx" 中,因此在删除新 DATATRY 文件中不需要的工作表后,我打开工作簿数据检索 9.xlsm 我最初在其中重新开始,并关闭 DATATRY,这样在宏的末尾我就回到了之前的位置。否则,VBA window 将关闭,我必须手动关闭新文件,打开另一个文件,然后再次打开 VBA developer。

您注意到我设法覆盖了 Delete-Worksheet-Confirmation 提示;但是,还有其他提示我无法以这种方式覆盖,因为我不想用默认答案回答:

第一个是"the following features cannot be saved in Macro-free workbooks: ... to continue saving, click yes"。在这里我需要是,它也是默认答案。

但是,"A file named ... already exists in this location, do you want to replace?"需要是,但默认是否。

删除工作表后出现 "This workbook contains links to other data sources",因为它包含从 Thomson Reuters 数据库获取数据的公式。默认是 "Update",但我想要 "Don't update".

然后又是"cannot be saved in macro-free workbooks",这里我需要默认的是。

是否有方法可以预定义应针对多个连续提示给出的不同答案?

Sub Speichern()

    ChDir ThisWorkbook.Path

    'save as DATATRY.xlsx without macros
    Worksheets("CombinedRaw").SaveAs Filename:= _
        ThisWorkbook.Path & "\DATATRY.xlsx", FileFormat:=51, _
        CreateBackup:=False

    'delete other sheets in the new file, then close
    Application.DisplayAlerts = False
        Worksheets("Codes").Delete
    Application.DisplayAlerts = True

    'open "this" book again
    Workbooks.Open Filename:=ThisWorkbook.Path & "\data retrieve 9.xlsm"
    Workbooks("DATATRY.xlsx").Close SaveChanges:=True

End Sub

或者,从文件夹中删除以前存在的文件然后保存它在我看来是一种粗暴的解决方法,但如果有帮助,也许更好?但是这样还是解决不了非默认"update"提示的问题。

你在这里做了一件非常错误的事情,自然会在此过程中收到警告。

这是你应该做的。

Sub Speichern()

  Dim w As Workbook
  Set w = Workbooks.Add

  ThisWorkbook.Worksheets("CombinedRaw").Copy Before:=w.Sheets(1)

  Dim i As Long

  Application.DisplayAlerts = False
  For i = w.Sheets.Count To 2 Step -1
    w.Sheets(i).Delete
  Next
  Application.DisplayAlerts = True

  w.Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\DATATRY.xlsx"

End Sub

如果 CombinedRaw 的代码模块中没有代码,您将不会收到 xlsm 警告。如果这样做,您可能希望将其移出到一个模块中。

您仍然会收到覆盖警告,但只有那个警告。
如果您想抑制该警告,请将 Application.DisplayAlerts = True 移动到 w.Close.

之后