取消GetSaveAsFilename

时间:2018-01-26 10:09:30

标签: excel vba type-mismatch

我有代码,仅在用户选择“另存为”时运行。要做到这一点并获取文件的新名称,我正在使用Application.GetSaveAsFilename函数。

我遇到的问题是类型不匹配,同时检查用户是否在未执行此操作时点击取消。

未点击取消时抛出错误的行:If saveName = False Then Exit Sub

我的工作代码:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If Not SaveAsUI Then Exit Sub
  Cancel = True

  'other variables
  Dim saveName As String

  saveName = Application.GetSaveAsFilename(filefilter:="Microsoft Excel Files (*.xlsm), *.xlsm", Title:="Save as Microsoft Excel Macro-Enabled Worksheet")
  On Error GoTo RunTime13
  If saveName <> False Then
  On Error GoTo 0

  'other code

  ThisWorkbook.SaveAs Filename:=saveName, FileFormat:=52
  End If
Exit Sub
RunTime13:
  If Err.Number = 13 Then Resume Next
End Sub

我做错了什么,我必须像这样解决取消按钮?

修改

我选择Dim saveName As Variant可以使用If saveName = False Then Exit Sub

正如Vityata提到我在德国,因此可能会遇到语言问题,幸运的是我的Vityata让我想起了这个问题,因为我实际上是用英语使用Excel,但不是所有的同事都是,所以我的接受的答案可能在他们使用工作簿时没有用。

3 个答案:

答案 0 :(得分:2)

由于您已将SaveName声明为字符串,因此您需要检查"False",而不是False

If saveName <> "False" Then

答案 1 :(得分:1)

OP,我有一些消息告诉你 - 你在德国,因此我肯定你肯定会使用德语Excel。

VBA有点翻译,因此saveName被转换为Falsch而不是False,就像世界其他地方一样。例如。 CStr(False)会返回Falsch

在你的代码中写下这三个中的任何一个:

If saveName <> "Falsch"
If saveName <> False
If Len(saveName) <> 6

答案 2 :(得分:1)

这是另一种方法:

Dim vSaveName As Variant

vSaveName = Application.GetSaveAsFilename(filefilter:="Excel Files (*.xlsm), *.xlsm", _
    Title:="Save as Macro-Enabled Worksheet")
If TypeName(vSaveName) = "Boolean" Then Exit Sub
'' otherwise continue with save...

vSavename是布尔值的唯一时间是用户取消时,所以这种方法不需要知道如何用用户的语言说False。