【问题标题】:Excel VBA: Force user to save as .xlsmExcel VBA:强制用户另存为 .xlsm
【发布时间】:2017-10-11 15:37:35
【问题描述】:

我有一系列可以自动执行大部分流程的宏。我想通过 Excel 插件将它分发给我的同事,但我有一段代码似乎无法正确处理。

这是“主”代码(工作正常):

Option Explicit

Sub MIUL_Run_All()

Dim StartTime As Double
Dim SecondsElapsed As String

'Remember time when macro starts
StartTime = Timer

Call OptimizeCode_Begin

Call Save_As
Call Format_MIUL
Call Custom_Sort_MIUL
Call Insert_Process_List
Call Format_Process_List

Call OptimizeCode_End

'Determine how many seconds code took to run
SecondsElapsed = Format((Timer - StartTime) / 86400, "ss")

'Notify user in seconds
MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", 
vbInformation

End Sub

给我带来麻烦的代码是“Save_As”。我希望用户做的第一件事是将文件保存为启用宏的文件。理想情况下,我希望代码为用户做这些事情:

  1. 强制用户另存为 .xlsm
  2. 在“另存为”对话框中提供当前文件名,以便他们拥有可以使用的文件名。
  3. 如果按下 CANCEL 按钮,它必须停止整个宏!

我认为这将是一件相当微不足道的事情,但到目前为止,它一直是我的代码中最困难的部分。

这是我为 Save_As 代码尝试过的:

Application.Dialogs(xlDialogSaveAs).Show , xlOpenXMLWorkbookMacroEnabled

这段代码很简单,但它没有处理取消按钮。

Dim userResponse As Boolean

On Error Resume Next  
userResponse = Application.Dialogs(xlDialogSaveAs).Show(52) 
On Error GoTo 0 
If userResponse = False Then
Exit Sub 
Else 
End If

由于某种原因,这再次没有解决取消按钮。

我已经尝试了大概六种不同的东西,其中大部分都与上面的代码相似。

感谢任何帮助。

【问题讨论】:

  • userResponse = Application.Dialogs(xlDialogSaveAs).Show(52) 将弹出以 52.xlsx 作为文件名的对话框。对话框的第一个参数是文件名。 52 作为第二个参数将强制使用 XLSM 文件类型。我运行了你的代码,它运行良好。我不确定您是否需要错误行。
  • @mooseman 问题是下一个代码在退出该特定 Sub 时开始运行,并移至下一个代码“Call Format_MIUL”。我怎样才能让它脱离整个代码?
  • 你的意思是你从另一个调用这个子并且希望所有代码在选择取消时停止?这将需要一个整体设计。也许设置一个全局变量并在 userResponse = False 时设置它。

标签: vba excel


【解决方案1】:

你有这个:

If FileDialog.Show = False Then
    Exit Sub
End If

这不考虑错误,只是识别状态。如果仅出现错误,您将希望 Exit Sub 发生。


这个错误处理可以通过替换来实现:

On Error Resume Next  
userResponse = Application.Dialogs(xlDialogSaveAs).Show(52) 
On Error GoTo 0 
If userResponse = False Then
    Exit Sub 
Else 
End If

与:

On Error GoTo Cat  
userResponse = Application.Dialogs(xlDialogSaveAs).Show(52) 

Cat: 
    Exit Sub

【讨论】:

  • 我有点困惑。你是说用我的 OP 中的第二段代码来实现你的第一段代码?
  • @CC268 很抱歉;我是说(从发布的代码中)在 userResponse 之后发生的任何事情的触发错误都应该触发 Exit Sub。这意味着在文件对话框可见后您不需要 If 语句。正如您所写的(我在答案的第一部分中试图达到的目的)是 If 语句与其余代码按顺序排列,如果发生错误则不会发生。
  • 唯一的问题是对话框上的取消按钮不是错误的。如果 userResponse 行和 Cat: 行之间有任何代码,它将处理该代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2021-05-15
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
相关资源
最近更新 更多