使用用户窗体TextBox创建二维数组时遇类型不匹配(Error 13)问题
解决VBA用户窗体TextBox转CLng/CDate时的类型不匹配错误
这个错误的核心原因很直接:TextBox里的内容是字符串类型,当你输入的文本没法转换成合法的日期或长整数时(比如TextBox3输了“abc”,TextBox4输了“123.45”或字母),直接用CDate/CLng硬转就会触发「类型不匹配(Error 13)」。而且你现在直接在数组初始化里做转换,没有任何校验,一旦输入不符合要求就直接报错。
给你两个实用的解决思路:
1. 先做输入校验再转换(推荐,用户体验更好)
先判断输入内容是否符合转换要求,不符合就提示用户修正,避免报错。代码示例:
Dim tempDate As Date Dim tempLong As Long ' 处理TextBox3的日期转换 If Not IsDate(TextBox3.Value) Then MsgBox "TextBox3请输入有效的日期(比如2024/05/20)!" TextBox3.SetFocus Exit Sub End If tempDate = CDate(TextBox3.Value) ' 处理TextBox4的长整数转换 ' 先判断是否为数字,再确保是整数(避免输入小数) If Not IsNumeric(TextBox4.Value) Or CLng(TextBox4.Value) <> CDbl(TextBox4.Value) Then MsgBox "TextBox4请输入有效的整数!" TextBox4.SetFocus Exit Sub End If tempLong = CLng(TextBox4.Value) ' 最后初始化数组 mFields = Array( _ Array(CStr(TextBox1.Value), 2, vbString, "R", 0), _ Array(CStr(TextBox2.Value), 3, vbString, "R", 0), _ Array(tempDate, 3, vbString, "R", 0), _ Array(tempLong, 4, vbLong, "R", 100))
2. 用错误捕获处理转换失败
如果不想做前置校验,也可以用错误捕获来处理转换失败的情况,比如:
Dim tempDate As Variant Dim tempLong As Variant ' 尝试转换日期,失败则提示 On Error Resume Next tempDate = CDate(TextBox3.Value) If Err.Number <> 0 Then MsgBox "TextBox3日期格式错误!" TextBox3.SetFocus Exit Sub End If On Error GoTo 0 ' 尝试转换长整数,失败则处理 On Error Resume Next tempLong = CLng(TextBox4.Value) If Err.Number <> 0 Then MsgBox "TextBox4请输入整数!" TextBox4.SetFocus Exit Sub End If On Error GoTo 0 mFields = Array( _ Array(CStr(TextBox1.Value), 2, vbString, "R", 0), _ Array(CStr(TextBox2.Value), 3, vbString, "R", 0), _ Array(tempDate, 3, vbString, "R", 0), _ Array(tempLong, 4, vbLong, "R", 100))
关键就是别直接在数组里硬转,先把转换逻辑抽出来,确保内容合法后再放到数组里。
内容的提问来源于stack exchange,提问作者PIeter_105
相关产品推荐
相关产品推荐

