使用MsgBox选Cancel触发1004错误,需让VBA宏静默正常结束
解决InputBox取消后触发错误提示的问题
要实现点击InputBox的「Cancel」或未输入内容就关闭时静默结束宏,核心是在执行工作表改名前先判断输入内容是否有效,避免触发错误。
修改后的代码
Option Explicit ' 强制显式声明变量 Sub ChangeSheetName() Dim Carryon As VbMsgBoxResult ' 改用MsgBox返回值的正确枚举类型,避免类型不匹配 Dim shName As String Dim currentName As String On Error GoTo eh Carryon = MsgBox("Change Worksheet Name?", vbYesNo) If Carryon = vbYes Then currentName = ActiveSheet.Name shName = InputBox("Type new Worksheet name") ' 关键判断:输入为空(点击Cancel或未输入内容)时,直接跳过改名操作 If shName <> "" Then ThisWorkbook.Sheets(currentName).Name = shName End If End If Exit Sub eh: MsgBox "发生以下错误:" _ & vbCrLf & "" _ & vbCrLf & "错误代码: " & Err.Number _ & vbCrLf & "" _ & vbCrLf & "错误描述: " & Err.Description _ & vbCrLf & "" _ & vbCrLf & "你可能按下了Esc键或输入了无效的工作表名称。" _ & vbCrLf & "" _ & vbCrLf & "无需担心,你可以重试改名或保持原名。" _ & vbCrLf & "" _ & vbCrLf & "不会有任何不良影响。" End Sub
关键修改说明
- 变量类型修正:将
Carryon的类型从String改为VbMsgBoxResult,这是MsgBox返回值的标准枚举类型,避免潜在的类型不匹配问题。 - 输入有效性校验:在获取输入值后添加判断逻辑,当用户点击Cancel(此时返回空字符串)或未输入内容就确认时,直接跳过改名步骤,宏会自然结束,不会触发错误分支的提示框。
如果需要精准区分「用户点击Cancel」和「主动输入空内容」的场景,可以用StrPtr函数判断:
' 替换原有的shName判断逻辑 If StrPtr(shName) = 0 Then ' 用户点击Cancel,直接退出 Exit Sub ElseIf shName = "" Then ' 用户主动输入空内容,可选择提示或静默退出 MsgBox "工作表名称不能为空!" Exit Sub Else ThisWorkbook.Sheets(currentName).Name = shName End If
内容的提问来源于stack exchange,提问作者JasperX99
相关产品推荐
相关产品推荐

