Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel VBA中是否有一个类似索引的函数,可以返回完全匹配的多列数据?_Excel_Vba - Fatal编程技术网

Excel VBA中是否有一个类似索引的函数,可以返回完全匹配的多列数据?

Excel VBA中是否有一个类似索引的函数,可以返回完全匹配的多列数据?,excel,vba,Excel,Vba,我有两本包含如下数据的工作簿: 如图所示,A列是映射这两个工作簿的唯一键。我要填充的值是原始文件image1中的TBD。所以我在主文件中查找键11x,并获取该键的B列、C&D组件、子组件和零件的值 我尝试了match func,但无法找到复制搜索值的目标,我的代码一次只返回一个值 for R = 2 To lastrow y=application.match(worksheet2.cells(R,1), worksheet2.range("A:A"),0) If not appli

我有两本包含如下数据的工作簿:

如图所示,A列是映射这两个工作簿的唯一键。我要填充的值是原始文件image1中的TBD。所以我在主文件中查找键11x,并获取该键的B列、C&D组件、子组件和零件的值

我尝试了match func,但无法找到复制搜索值的目标,我的代码一次只返回一个值

for R = 2 To lastrow
    y=application.match(worksheet2.cells(R,1), worksheet2.range("A:A"),0)
If not application.isnumber(y) Then
    worksheet2.cells(x,1).copy destination:=worksheet1.cells(**?????????**)

那么,我可以使用一个索引匹配公式返回所有三列值吗?如果没有,我如何在VB中编写搜索函数?请提供帮助。

此代码在启动搜索的工作簿中执行

Private Sub CmdBtn_Click()
On Error GoTo workbookErr
Dim WbMaster As Worksheet: Set WbMaster = Workbooks("MasterWorkBook.xlsm").Worksheets("Sheet1")
Dim WbCopyTo As Worksheet: Set WbCopyTo = ThisWorkbook.Worksheets("Sheet1")
Dim rangeWbCopyTo As Range, rangeWbMaster As Range
Dim cellWbCopyTo As Range, cellWbMaster As Range
Dim i As Integer

With WbMaster
    Set rangeWbMaster = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With
With WbCopyTo
    Set rangeWbCopyTo = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With

For Each cellWbCopyTo In rangeWbCopyTo
    For Each cellWbMaster In rangeWbMaster
        If cellWbCopyTo.Value = cellWbMaster.Value Then
            For i = 0 To 2
                cellWbCopyTo.Offset(0, 1 + i).Value = cellWbMaster.Offset(0, 1 + i).Value
            Next i
            Exit For
        End If
    Next cellWbMaster
Next cellWbCopyTo
Exit Sub
workbookErr:
MsgBox "Open MasterWorkBook before executing the search.", vbCritical
End Sub

使用Find和FindNext循环遍历一个准则的所有重复。代码如下:@BigBen我的意图是使用我的键返回所有3列值,比如11x。索引匹配返回1个值,例如Bus:for键11x。当然,我也可以对其他两列这样做,但这会变得单调乏味。你能展示一下结果应该是什么样子吗?@DariuszSokol-结果是将image1作为image2,即用主文件或上面的图像2中的相应值替换所有TBD单元格。@BigBen-这不是我上面使用的相同公式吗?对不起,我无法得到你的评论。我更想问的是,如何在VBA中的for循环中使用Find/FindNext/match函数,并返回该键的值。我认为,按照惯例,在for循环中使用时,I不是用变量类型声明的。这样我在循环中使用,并在循环完成后在内存中处理。@technoman23,VBA中没有这样的约定。相反,在VBA中,您可以采取两种方式:1声明Option Explicit并强制显式声明所有变量2不使用Option Explicit并让VBA解释器将所有未声明的变量假定为变量type@DariuszSokol,您希望1明确限定所有范围,直到它们的工作表和工作簿父项。请参见::单元格和行。在前两个设置范围中计数第2行在“下一步”之后为语句放置一个出口i在“下一步”之后不继续在RangewMaster中搜索match@HTH我已经根据你的建议更新了这个片段。退出内部循环是个好主意。谢谢,非常感谢。@HTH我研究了这个,结果发现vba有一个非常奇怪的范围。它没有块级或循环级范围。这意味着在循环中声明的变量在默认情况下可以在包含函数或子函数中访问。这与另一种.NET语言C形成对比。这也可以通过在循环完成后立即尝试访问变量来测试。