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
VBA代码 运行出现424 要求对象错误
答案:4 悬赏:70 手机版
解决时间 2021-04-23 03:02
- 提问者网友:書生途
- 2021-04-22 10:29
最佳答案
- 五星知识达人网友:梦中风几里
- 2021-04-22 11:17
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、把两个过程合并到一个过程。别的有回答了。这里就不给出具体代码了。
在 过程 生成下拉() 里是没法访问到 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、把两个过程合并到一个过程。别的有回答了。这里就不给出具体代码了。
全部回答
- 1楼网友:底特律间谍
- 2021-04-22 13:59
你这个formmain没有指向哪个对象
建议你录制一段宏
选中这个对象
知道这个对象的名称后再修改操作
- 2楼网友:三千妖杀
- 2021-04-22 13:08
检查是否有名称为FormMain的窗口
检查LabelData对应控件的名称是否正确
一个有效的检查方法,输入时,如果能自动关联控件的属性列表,那么名称就是正确的,否则就是错误的
- 3楼网友:杯酒困英雄
- 2021-04-22 11:42
你这个的
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯