Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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索引匹配_Vba_Excel_Excel 2010 - Fatal编程技术网

VBA索引匹配

VBA索引匹配,vba,excel,excel-2010,Vba,Excel,Excel 2010,我有一个索引/匹配查找公式,我想将其合并到ActiveX表单中。代码是 =IF(A2="","No Search Criteria",IFERROR(INDEX(AssetList,MATCH(A2,AssetList[Asset '#],0),1),INDEX(AssetList,MATCH(A2,AssetList[Serial '#],0),1)) ) 这允许我搜索项目的资产编号或序列号,并返回其资产编号。包含此代码的单元格旁边的单元格已修改版本,以返回其序列号、项目号和棘轮大小。我正在

我有一个索引/匹配查找公式,我想将其合并到ActiveX表单中。代码是

=IF(A2="","No Search Criteria",IFERROR(INDEX(AssetList,MATCH(A2,AssetList[Asset '#],0),1),INDEX(AssetList,MATCH(A2,AssetList[Serial '#],0),1))
) 这允许我搜索项目的资产编号或序列号,并返回其资产编号。包含此代码的单元格旁边的单元格已修改版本,以返回其序列号、项目号和棘轮大小。我正在尝试创建一个表单,它将执行这些相同的功能,允许用户在SearchCriteriaTextBox中键入资产或序列号,并在单击SearchButton时将适当的值返回给AssetNumber列表框、SerialNumber列表框、ItemNumber列表框和RatchetSizeList框

到目前为止,我已经:

Private Sub SearchButton_Click()        
AssetNumberListBox.Value = Application.WorksheetFunction.Match(SearchCriteriaTextBox.Value, Sheet2.ListObjects("AssetList").ListColumns("Asset#").DataBodyRange, False)
SerialNumberListBox.Value =
ItemNumberListBox.Value =
RatchetSizeListBox.Value =


End Sub

但当我单击SearchButton时,会出现“运行时错误'9:下标超出范围”。我对Excel特别是VBA非常陌生,所以如果有人有任何想法,至少可以填充一个列表框,这样我就可以使代码适应其他列表框,我将不胜感激。作为参考,我在Windows7上使用Excel2010。提前谢谢

基本上,我了解到您的数据表结构如下:

Asset Number | Serial Number | Item Number | Rachet Size
第一点是查找数据:

为什么要使用返回位置的
MATCH
函数

AssetNumberListBox.Value = Application.WorksheetFunction.Match(SearchCriteriaTextBox.Value, Sheet2.ListObjects("AssetList").ListColumns("Asset#").DataBodyRange, False)
您应该使用
工作表function.VLOOKUP
返回值

然后,在第二点中,为了填充列表框,必须使用
Additem
方法。
Value
方法将由用户以相反的方式返回列表框中的选定值。(顺便说一句,如果只有一个值要显示,为什么要使用列表框?请改用文本框)

第三点,对于运行时错误,最好通过显示错误行来进行正确的调试。但是,我建议您检查数据工作表中是否已经存在该表。如果是,则检查其名称是否与您在VBA代码中输入的名称匹配(列名相同)

编辑: 用户友好的解决方案之一可以如下所示:

1-制作自己的用户表单,基本上有4个文本框和一个搜索按钮

2-定义自己的函数,该函数返回包含目标数据的行

3-定义一个子集,该子集接受该输入行并使用该行用数据填充文本框

例如,该功能可以:

Function Row_Of_Data(Asset_Num as String, Serial_Num as String, Search_Table as String) as Long
Dim Target_Data as Range
Dim T_Row as Long
'Now, we set a range that contains all of the data in the table object in your worksheet
On Error Goto Unfound 
Set Target_Data = Sheet2.ListObjects(Search_Table).DataBodyRange
If Asset_Num <> "" AND Serial_Num = ""  Then 
     Row_Of_Data = WorksheetFunction.Match(Asset_Num,Target_Data.Columns(1),False)
Elseif Serial_Num <> "" AND Asset_Num = "" Then
   Row_Of_Data = WorksheetFunction.Match(Asset_Num,Target_Data.Columns(2),False)
Else 
   Row_Of_Data = WorksheetFunction.Match(Asset_Num,Target_Data.Columns(1),False)
End if
Exit Function
Unfound:
Row_Of_Data = 0


End Function
函数行\u的\u数据(资产\u数为字符串,序列\u数为字符串,搜索\u表为字符串)长度为
变暗目标_数据作为范围
调暗T_排,长度相同
'现在,我们设置一个包含工作表中表对象中所有数据的范围
关于错误转到未找到
设置Target\u Data=Sheet2.ListObjects(搜索表).DataBodyRange
如果资产数量“”和序列数量=“”,则
数据的行=工作表函数.Match(资产数量,目标数据.Columns(1),False)
如果序列号为“”,资产号为“”,则
数据的行=工作表函数.Match(资产数量,目标数据.Columns(2),False)
其他的
数据的行=工作表函数.Match(资产数量,目标数据.Columns(1),False)
如果结束
退出功能
未找到:
_数据的第_行=0
端函数

我发现一些网站建议使用INDEXMATCH比VLOOKUP更通用,所以我选择了它。另外,感谢你指出列表框的问题——我注意到了这一点,并将它们改为文本框。谢谢你的建议,我会试试你的建议,看看我能想出什么。