VBA遍历窗体文本框将值存入Dictionary字典的代码问题求助
VBA遍历窗体文本框写入Dictionary问题修复
核心问题修正
- 字典键存在判断逻辑反转:原代码在Key已存在时新建类实例、Key不存在时读取字典对象,逻辑完全颠倒。正确逻辑为Key不存在时创建新的Class1实例存入字典,Key存在时直接读取字典中已存储的对应实例。
- 文本框属性无智能提示问题:
ctrl声明为通用Control类型时,VBA编辑器不会提示TextBox专属的Text/Value属性,属于编辑器智能提示限制,直接编写属性调用即可正常运行,不存在属性不可用的问题。 - 原代码存在其他语法/逻辑错误:创建类实例时漏写
New关键字、字典结果赋值语句放在循环内部重复执行、组合框控件名存在拼写错误。
前置要求:确保已在VBA编辑器中勾选引用
Microsoft Scripting Runtime,否则Dictionary对象无法正常使用;Class1模块中需提前定义field1、field2为字符串类型,count为数值类型,并设置初始值避免首次累加报错。
修正后可运行代码
Dim dict As New Dictionary Dim Week As Class1, wID As String Dim ctrl As Control Dim tbInputVal As Variant For Each ctrl In UserForm1.Controls ' 可替换为 If TypeOf ctrl Is MSForms.TextBox Then 做更严谨的类型判断 If TypeName(ctrl) = "TextBox" Then wID = ctrl.Name ' 修正字典判断分支逻辑 If dict.Exists(wID) = True Then Set Week = dict(wID) Else ' 补全New关键字创建类实例,初始化属性 Set Week = New Class1 Week.field1 = "" Week.field2 = "" Week.count = 0 dict.Add wID, Week End If ' 直接调用Text属性取值,增加空值判断避免类型错误 tbInputVal = Trim(ctrl.Text) If tbInputVal <> "" Then ' 数值累加用CDbl转类型,若为字符串拼接直接替换为 & tbInputVal 即可 Week.count = Week.count + CDbl(tbInputVal) End If ' 若同Key不需要重复拼接用户名/组合框值,可将以下两句移到上方新建实例的Else分支中 Week.field1 = Week.field1 & Application.Username Week.field2 = Week.field2 & UserForm1.ComboBox1.Value End If Next ctrl ' 循环结束后统一返回字典结果 Set ReadItems = dict
额外注意事项
- 仅当存在多个同Name的文本框时,同一个字典Key对应的
count属性才会触发累加;若所有文本框Name唯一,每个Key仅对应一个文本框的输入值。 - 若运行时提示控件不存在,检查组合框名称,原代码中
combox1为拼写错误,默认窗体组合框命名为ComboBox1。 - 若不需要提前引用Scripting Runtime,可将字典声明改为晚绑定写法:
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary"),无需提前勾选引用即可运行。
内容的提问来源于stack exchange,提问作者RandomPezzer
相关产品推荐
相关产品推荐

