Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 添加具有相同代码的新子项时Excel宏不工作_Vba_Excel - Fatal编程技术网

Vba 添加具有相同代码的新子项时Excel宏不工作

Vba 添加具有相同代码的新子项时Excel宏不工作,vba,excel,Vba,Excel,我不打算给你发送全部代码,因为它只是一块重复了很多次的代码。。。下面是代码的全部要点,代码行重复多次,必要时“图纸”和“形状”会发生变化。它所做的是我有一个列表框(其中有一个项目列表),每次单击一个特定的项目时,大约有30个文本框填充与列表框项目相关的特定子项目 问题是,它正在为一个选项卡的子ListBox1_Change宏工作,但当我尝试为同一Excel文件中的第二个选项卡执行此操作时,它表示存在参数错误。然而,这是有趣的部分,当我实际点击文本框时,参数错误弹出。我单击OK,然后它就会填充 代

我不打算给你发送全部代码,因为它只是一块重复了很多次的代码。。。下面是代码的全部要点,代码行重复多次,必要时“图纸”和“形状”会发生变化。它所做的是我有一个列表框(其中有一个项目列表),每次单击一个特定的项目时,大约有30个文本框填充与列表框项目相关的特定子项目

问题是,它正在为一个选项卡的子ListBox1_Change宏工作,但当我尝试为同一Excel文件中的第二个选项卡执行此操作时,它表示存在参数错误。然而,这是有趣的部分,当我实际点击文本框时,参数错误弹出。我单击OK,然后它就会填充

代码可以工作,但当我尝试在第二个选项卡上执行时,它不起作用。我试着把它们组合成一个潜艇,但那根本不起作用。所以我把它们分成了两个独立的潜艇。任何输入都很好

Sub ListBox1_Change()
  Handle_Change Me, "List Box 1", "TextBox1", "W"
  Handle_Change Me, "List Box 1", "TextBox2", "X"
  Handle_Change Me, "List Box 1", "TextBox3", "Y"
  Handle_Change Me, "List Box 1", "TextBox4", "Z"
  Handle_Change Me, "List Box 1", "TextBox5", "AA"
  Handle_Change Me, "List Box 1", "TextBox6, "AB"
End Sub
以及模块中的手柄

Sub Handle_Change(sht As Worksheet, lbName, tbName, colAddr)

   Dim idx As Long, lb   As msforms.ListBox

   Set lb = sht.Shapes(lbName).OLEFormat.Object.Object

   idx = lb.ListIndex
   If idx <> -1 Then
       sht.Shapes(tbName).OLEFormat.Object.Object.Text = _
                     sht.Range(colAddr & idx + 1).Value
   End If

End Sub
子句柄\u更改(sht作为工作表、lbName、tbName、colAddr)
Dim idx长度为,lb长度为msforms.ListBox
设置lb=sht.Shapes(lbName).OLEFormat.Object.Object
idx=lb.ListIndex
如果idx-1那么
sht.Shapes(tbName).OLEFormat.Object.Object.Text=_
短程范围(colAddr&idx+1).值
如果结束
端接头

在编写更多代码之前,您应该重构代码

编辑:测试后进行了一些更改:

'These go in the relvant worksheet code module
Sub ListBox1_Change()
    Handle_Change Me, "ListBox1", "TextBox1", "B"
End Sub

Sub ListBox2_Change()
    Handle_Change Me, "ListBox2", "TextBox2", "C"
End Sub    


'This goes in a *regular* code module
Sub Handle_Change(sht As Worksheet, lbName, tbName, colAddr)

    Dim idx As Long, lb   As msforms.ListBox

    Set lb = sht.Shapes(lbName).OLEFormat.Object.Object

    idx = lb.ListIndex
    If idx <> -1 Then
        sht.Shapes(tbName).OLEFormat.Object.Object.Text = _
                         sht.Range(colAddr & idx + 1).Value
    End If

End Sub
“这些都在相关工作表代码模块中
子列表框1_Change()
处理更改我,“列表框1”、“文本框1”、“B”
端接头
子列表框2_Change()
处理更改我,“列表框2”、“文本框2”、“C”
端接头
'这在一个*常规*代码模块中
子句柄更改(sht为工作表、lbName、tbName、colAddr)
Dim idx长度为,lb长度为msforms.ListBox
设置lb=sht.Shapes(lbName).OLEFormat.Object.Object
idx=lb.ListIndex
如果idx-1那么
sht.Shapes(tbName).OLEFormat.Object.Object.Text=_
短程范围(colAddr&idx+1).值
如果结束
端接头

根据讨论和到的链接,您看到的错误听起来可能是宏名称中的下划线造成的。不过,这似乎只适用于Excel'97。如果这是您使用的版本,请去掉下划线,看看错误是否消失。

您是否已仔细检查代码,以确定是哪一行导致了错误?是的,我不确定可能是什么原因。当我第一个开始工作的时候,我只是复制并粘贴了其余的,并且已经完成了所有50个。我最终将有大约100个总计和4个选项卡。那么,哪一行导致了错误?是的,但它何时会这样说?此时正在执行哪一行代码?tmoore“系统错误&H80070057(-2147024809)。参数不正确。这正是它所说的。只是出于好奇,Tim,我是否需要为每个文本框更改句柄?您只有一个
句柄更改
子-您的其他事件处理程序只需调用它,并传入变量部分。Tim,我正在处理您的,并且遇到一些问题。每次我尝试将其中的e工作表名称显示“编译错误:预期:列表分隔符或)”不太确定这意味着什么…或者我应该逐字逐句地处理您所拥有的内容吗?对于“处理列表框更改”(仅需要此一次)部分。我想我应该把所有的名字都写上。我只是想确保我明白了。所以我很清楚,最上面的代码会出现在它所属的任何一张纸上。最下面的代码会出现在“this工作簿”中。最后,什么是“我”“?我没有。上面的代码是我所做的唯一调整。它表示编译错误:未定义用户定义的类型。第2行。尽可能长地调暗idx…从“列表框1”中去掉空格,使其显示为“ListBox1”,并确保您正在从
ListBox1\u Change
开始调试,因为这就是您的参数现在的来源。按照您的建议执行。编译错误仍然会弹出,只是这次它在第二行突出显示了“lb As msforms.ListBox”,听起来好像您缺少该类型定义。2个问题:您使用的是什么版本的Excel?”97? '03? '10? 当您在VBA编辑器中单击“工具”>“引用”时,是否选中了Microsoft Forms 2.0对象库?