VBA:在for循环中使用索引/匹配

VBA:在for循环中使用索引/匹配,vba,Vba,我有两列数据,我正在尝试将这两列关联起来。在一列中我有一个零件号,在下一列中我有一个零件说明。我想返回零件说明。我已经写了一个for循环来遍历所有内容。我得到一个下标超出范围的错误 Sub findDataTest() 'define and set variables Dim i As Integer Dim returnRange As Range Dim lookRange As Range Dim startCell As Range Set startCell = Sheets("

我有两列数据,我正在尝试将这两列关联起来。在一列中我有一个零件号,在下一列中我有一个零件说明。我想返回零件说明。我已经写了一个for循环来遍历所有内容。我得到一个下标超出范围的错误

Sub findDataTest()

'define and set variables
Dim i As Integer
Dim returnRange As Range
Dim lookRange As Range
Dim startCell As Range

Set startCell = Sheets("Sheet3").Range("A3:A459")

Set returnRange = Sheets("Sheet3").Range("B3:B459")

Set lookRange = Sheets("Sheets3").Range("A3:A459")

'for loop to get values
For Each startCell In lookRange

    For i = 3 To 459

        Cells(i, 6).Value = WorksheetFunction.Index(returnRange, WorksheetFunction.Match(startCell, lookRange, 0))

    Next i

Next startCell

End Sub


Part Numbers  Part Descriptions
111           nut
222           bolt
333           screw
444           flange
555           cover
以上是存储零件号和零件说明的主数据

Part Number
111
444
222
111
333
222
222

以上是我正在处理的数据,我需要将零件描述与列出的零件号匹配。我可以有零件号的任意组合,每个零件号以不同的频率显示。

您最好的选择是使用字典。要做到这一点,首先必须通过选中工具/引用旁边的复选框来添加Microsoft脚本运行时

在本例中,我假设您的零件号是唯一的。您的描述可以重复,但最好是唯一的,这样您也可以使用描述找到零件号

表1包含您的数据。表2显示了如何填充说明。 我在两张表中都使用了A列和B列,但是您可以根据需要更改它们。这些数据也可以在不同的Excel文件(工作簿)上

若要轻松使用此sub,您可以插入一个形状,然后右键单击它并指定一个宏,找到sub,然后您就可以了

附上Excel代码和示例。您可以通过从这里获取;)来改进代码

您可以从此处下载该文件:


你最好的办法是使用字典。要做到这一点,首先必须通过选中工具/引用旁边的复选框来添加Microsoft脚本运行时

在本例中,我假设您的零件号是唯一的。您的描述可以重复,但最好是唯一的,这样您也可以使用描述找到零件号

表1包含您的数据。表2显示了如何填充说明。 我在两张表中都使用了A列和B列,但是您可以根据需要更改它们。这些数据也可以在不同的Excel文件(工作簿)上

若要轻松使用此sub,您可以插入一个形状,然后右键单击它并指定一个宏,找到sub,然后您就可以了

附上Excel代码和示例。您可以通过从这里获取;)来改进代码

您可以从此处下载该文件:


您正在尝试匹配的范围内进行迭代。如果数字是唯一的,它将返回迭代旁边的值,基本上给你一个B列的副本。请模拟一些数据和预期结果。零件号零件说明111螺母222螺栓333螺钉444法兰555盖666齿轮777按钮888小部件说,上面是主数据。零件号111 555 111 444 777 222 777 888这是我试图匹配零件描述的数据。我有这张主工作表,上面有所有的零件号和零件说明。我需要做的是索引和匹配零件描述,然后使用它将零件描述与我正在处理的数据匹配。这些数据可以是任何频率的零件号的任意组合。不在注释中。请使用edit将示例和预期输出放在原始帖子中。是否需要vba?在这种情况下,
vlookup
将非常有效。可能在匹配函数中使用“Sheets”(“Sheet3”).Range(“A”&i)”而不是“startcell”。您正在迭代尝试匹配的范围。如果数字是唯一的,它将返回迭代旁边的值,基本上给你一个B列的副本。请模拟一些数据和预期结果。零件号零件说明111螺母222螺栓333螺钉444法兰555盖666齿轮777按钮888小部件说,上面是主数据。零件号111 555 111 444 777 222 777 888这是我试图匹配零件描述的数据。我有这张主工作表,上面有所有的零件号和零件说明。我需要做的是索引和匹配零件描述,然后使用它将零件描述与我正在处理的数据匹配。这些数据可以是任何频率的零件号的任意组合。不在注释中。请使用edit将示例和预期输出放在原始帖子中。是否需要vba?在这种情况下,
vlookup
将非常有效。可能在匹配函数中使用“Sheets”(“Sheet3”).Range(“A”&i)”而不是“startcell”。我不熟悉字典,我需要找到一些使用字典的教程。@ErinH。请阅读本网站上的快速入门。字典很简单也很有用:谢谢!我真的很感激这个链接,它很有用!:)@艾琳。然后,请勾选我答案旁边的复选标记,以确认你得到了正确答案。我不熟悉字典,我需要找到一些使用字典的教程。@ErinH。请阅读本网站上的快速入门。字典很简单也很有用:谢谢!我真的很感激这个链接,它很有用!:)@艾琳。然后请打我答案旁边的复选标记以确认你得到了正确的答案
Option Explicit

Sub FindDescription()
    Dim i As Long
    Dim lRow As Long
    Dim rng As Range
    Dim dict As New Dictionary
    Dim WS As Worksheet

    'Define data range
    Set WS = ThisWorkbook.Sheets("Sheet1")
    lRow = WS.Cells(WS.Rows.Count, "A").End(xlUp).Row

    'Make a dictionary [key=Part Number, item=Part Description]
    'Keys should be unique, so to avoid any error we will record only
    'the first instance in case there are part number duplicates
    On Error Resume Next 'will move on if there is any duplicate
    For i = 1 To lRow
        dict.Add WS.Cells(i, 1).Value, WS.Cells(i, 2).Value
    Next i
    On Error GoTo 0

    'Now we have the data, we need to populate the descriptions
    'find the last row in Sheet2
    Set WS = ThisWorkbook.Sheets("Sheet2")
    lRow = WS.Cells(WS.Rows.Count, "A").End(xlUp).Row

    'Clear column B regardless of finding a matching Part Desc or not
    For i = 1 To lRow
        If dict.Exists(WS.Cells(i, 1).Value) = True Then
            WS.Cells(i, 2).Value = dict(WS.Cells(i, 1).Value)
        Else
            WS.Cells(i, 2).ClearContents
        End If
    Next i

End Sub