VBA代码报错91:计数7个填充txtDp文本框并计算金额求解决
解决VBA错误91及文本框计数逻辑问题
嘿,我来帮你搞定这个错误91的问题,顺便把逻辑理清楚~
首先说错误91的直接原因:当For Each循环结束后,ctrl变量已经不再指向任何有效的控件对象(变成Nothing了),这时候你执行txtEx.Value = ctrl * 10.5,自然会触发“对象变量或With块变量未设置”的错误。
另外你的代码逻辑还有几个小问题:
- 名称判断出错:
txtDp是5个字符,你用Left(ctrl.Name, 6)会多取一位,导致匹配不到正确的控件 - 计数逻辑有问题:你试图用
cont递增去匹配控件名,但如果控件顺序不对或者命名不是严格的txtDp1到txtDp7,就会漏统计 - 空值判断不全面:
IsNull(ctrl.Value)只能检测Null值,用户手动清空的文本框会是空白字符串,这时候IsNull会返回False,导致误统计
下面是修正后的完整代码,我加了注释帮你理解:
Sub btnCal_Click() Dim filledCount As Integer Dim ctrl As Control filledCount = 0 '初始化已填充文本框的计数 For Each ctrl In Me.Controls '先筛选出文本框控件 If TypeOf ctrl Is TextBox Then '检查控件名称是否以"txtDp"开头 If Left(ctrl.Name, 5) = "txtDp" Then '同时判断值不为Null且不是空白字符串 If Not IsNull(ctrl.Value) And ctrl.Value <> "" Then filledCount = filledCount + 1 End If End If End If Next ctrl '用统计好的数量计算总金额并赋值 txtEx.Value = filledCount * 10.5 End Sub
关键修正点说明:
- 改用
filledCount变量专门统计符合条件的已填充文本框数量,语义更清晰 - 修正了名称匹配的长度:
Left(ctrl.Name, 5)准确匹配txtDp开头的控件 - 补充了空白字符串的判断,确保只有真正填充了内容的文本框才会被计数
- 循环结束后使用统计好的数值计算,避免了引用失效的
ctrl变量,彻底解决错误91
内容的提问来源于stack exchange,提问作者WillGreco
相关产品推荐
相关产品推荐

