永发信息网

VBA代码 运行出现424 要求对象错误

答案:4  悬赏:70  手机版
解决时间 2021-04-23 03:02
Public Sub AddData()
With FormMain
If FormMain.LabelData.Text <> "" Then
FormMain.ListData.AddItem (.LabelData.Text)
FormMain.ListData.ListIndex = .ListData.ListCount - 1
End If
End With
End Sub

运行到这一句就报错, If FormMain.LabelData.Text <> "" Then
无论怎么改都是报错。
If .LabelData.Text <> "" Then
If val(.LabelData.Text )<> "" Then
If val(FormMain.LabelData.Text) <> "" Then

LabelData 为TexrBox
ListData 为ListBox
最佳答案
Dim d As New Dictionary 是在 代码表存为数组() 过程里定义的过程级变量,代码表存为数组()过程执行完了后d就消失。
在 过程 生成下拉() 里是没法访问到 d的。
要解决这个问题
1、你可以把 d 定义为模块级的变量:就是把 Dim d As New Dictionary 在放到模块的顶部。代码如下:
Dim d As New DictionarySub 代码表存为数组() Dim data As New 执行 Dim sql As String Dim arr, y sql = "Select 定额名称,单价,计价单位,汇报单位,换算系数 from [定额计件$] " arr = data.筛选结果(sql) For y = 1 To UBound(arr, 2) d(arr(0, y)) = arr(1, y) & "-" & arr(2, y) & "-" & arr(3, y) & "-" & arr(4, y) Next yEnd Sub Sub 生成下拉() Dim sr As String Call 代码表存为数组 sr = Join(d.Keys, ",") With Range("m6:m25").Validation .Delete .Add Type:=xlValidateList, Formula1:=sr End WithEnd Sub2、把代码表存为数组()定义为一个函数,并返回一个 字典对象,把d的定义放到了生成下拉()过程里,代码如下:
Function 代码表存为数组() as Dictionary Dim data As New 执行 Dim sql As String Dim arr, y Dim d As New Dictionary sql = "Select 定额名称,单价,计价单位,汇报单位,换算系数 from [定额计件$] " arr = data.筛选结果(sql) For y = 1 To UBound(arr, 2) d(arr(0, y)) = arr(1, y) & "-" & arr(2, y) & "-" & arr(3, y) & "-" & arr(4, y) Next y set 代码表存为数组=dEnd Sub Sub 生成下拉() Dim sr As String Dim d As Dictionary '把d的定义放到了生成下拉()过程里 set d = 代码表存为数组() sr = Join(d.Keys, ",") With Range("m6:m25").Validation .Delete .Add Type:=xlValidateList, Formula1:=sr End WithEnd Sub3、把 过程 代码表存为数组() 定义为一个接收一个 字典对象的过程,把d的定义放到了生成下拉()过程里,并在生成下拉()过程里带参数调用 代码表存为数组() 过程。代码如下:

Sub 代码表存为数组(ByRef d As Dictionary) Dim data As New 执行 Dim sql As String Dim arr, y sql = "Select 定额名称,单价,计价单位,汇报单位,换算系数 from [定额计件$] " arr = data.筛选结果(sql) If d Is Nothing Then Set d = New Dictionary '如果d没有实例化,则实例化。 For y = 1 To UBound(arr, 2) d(arr(0, y)) = arr(1, y) & "-" & arr(2, y) & "-" & arr(3, y) & "-" & arr(4, y) Next yEnd Sub Sub 生成下拉() Dim sr As String Dim d As New Dictionary Call 代码表存为数组(d) sr = Join(d.Keys, ",") With Range("m6:m25").Validation .Delete .Add Type:=xlValidateList, Formula1:=sr End WithEnd Sub
4、把两个过程合并到一个过程。别的有回答了。这里就不给出具体代码了。
全部回答
你这个formmain没有指向哪个对象 建议你录制一段宏 选中这个对象 知道这个对象的名称后再修改操作
检查是否有名称为FormMain的窗口 检查LabelData对应控件的名称是否正确 一个有效的检查方法,输入时,如果能自动关联控件的属性列表,那么名称就是正确的,否则就是错误的
你这个的 arr1(x) = mid(textbox.text, x, 1)'提示424错误要求对象 你整个程序中并没有textbox名称的控件,所以肯定会出错,还有你的数组只声明了,并没有给定范围并且你 textbox2.text = arr2(x)'提示下表越界 这句在for循环外,此时 x 的值已经是 txt1len+1的值了,而你数组arr2()只给到了txt1len肯定会提示越界的。 由于不太清楚你的意图,你看看下边这个更改后的代码是否符合你的要求吧。 private sub commandbutton1_click() textbox2.text = "" '清空文本框2 dim txt1len as integer dim arr1() as string '定义字符数组1用于存储文本框1的内容 dim arr2() as string '定义字符数组2用于存储文本框2的内容 txt1len = len(textbox1.text) '定义变量提取文本框1的字符长度 redim arr1(txt1len) '给定数组1的范围 redim arr2(txt1len) '给定数组2的范围 for x = 1 to txt1len arr1(x) = mid(textbox1.text, x, 1) arr2(x) = "\x" & hex(asc(arr1(x))) textbox2.text = textbox2.text & arr2(x) next x 'textbox2.text = arr2(x) '由于不太清楚你的意图是什么所以这句你自己看看应该放到哪里吧 _ 总之放到这里肯定不对,会提示越界,我暂时已经给注解掉了,并把这句改为 _ textbox2.text = textbox2.text & arr2(x)放到循环里了,你看看是不是你要的结果吧 end sub
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
网上被骗1000元,网上报警会受理吗?
酷派8310手机卡2 不会待机是怎么回事?
梦幻录像mhw怎么转mp4
不好意思的意思是什么,很想说四个字,什么玩
床的摆放成头北脚南或头西脚东好吗
求AKON的guarantee下载地址.. 要MP3的.空间用
大堰水库在什么地方啊,我要过去处理事情
在哪能看美剧《超能少年》?
为什么苏27比F22速度快????
《星辰变OL》什么时候开服
想自学JQuery,谁能提供好的资料
如果地球变成现在的十倍大小 地球上的生物所
梦幻西游修和抗的问题?
深圳世界之窗门票要多少钱?
很多次晚上下班你都发现一个男人跟着你!他什
推荐资讯
帮忙解释几句谚语
WOW 亡灵Z 牛头 Z 哪个好
圣诞节应该送女朋友什么礼物?
网上银行动态密码是什么?
QQ三国豪杰带什么技能的BB好全说
求初3学习资料....有的发下网站来
30天内出现3、4次的流鼻血应该注意些什么?
QQ飞车不同的宠物三级以后都是什么功能?
科比有几次81分
经常会梦见鱼代表什么意义?
没有高考,你拼得过富二代、官二代吗?
QQ音乐高手进
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?