vba:使用2个条件识别行并从行返回其他数据

时间:2015-07-23 19:19:34

标签: excel vba excel-vba

我正在尝试查找在spreadsheet1中查看两个条件的代码,并找到在spreadsheet2中对应的行,并将spreadsheet2中的第三个数据返回到spreadsheet1。我需要在vba中执行此操作,因为它循环,因为我将一次又一次地完成它,并且因为来自spreadsheet2的数据从另一个数据库导入并将随着时间的推移而改变。如果可能的话,如果代码也允许在电子表格2上识别第3个标准,那将是很好的。

示例是: Spreadsheeet 1

 Product ID  ActCode: A0003
 11111
 12345
 22222
 ...

电子表格2

ProductID  ActivityCode   DateDue
 11111     A0001          7/15/15
 11111     P7530          7/30/15
 11111     A0003          8/1/15
 12345     A0003          12/15/15
 12345     A0007          1/1/15
 22222     A0001          2/1/15 
 ...

我希望Spreadsheet1结束:

Spreadsheeet 1

 Product ID  ActCode: A0003
 11111       8/1/15
 12345       12/15/15
 22222         - 
 ...

过去几天我尝试过很多东西。 1)vlookup / index /匹配从未真正起作用的组合,2)通过productID和activitycode过滤spreadsheet2然后将可见单元格复制到spreadsheet1 - 这可行,但速度很慢。我将为许多活动代码执行此操作,因此我需要更快的内容(如果您想查看它,我可以发布代码)。我目前正在循环中尝试循环。不确定这是否是最好的方法,但这是我到目前为止的代码。它会复制一些日期,但不会复制正确的日期 - 它也有点慢。

Sub test()

Application.ScreenUpdating = False
  Sheets("Spreadsheet1").Select

  Range("A2").Select ' Select A = the column with the product ID in it
  ' Set Do loop to stop when an empty cell is reached.
  Do Until IsEmpty(ActiveCell)

    Dim ConceptAct  As String
    ConceptAct = "A0003"

    Dim ProductID
    ProductID = ActiveCell.Value
    Dim ConcDue

        Sheets("Spreadsheet2").Select
        Range("A2").Select 'The column with the ProductID in it

        Do Until IsEmpty(ActiveCell)

        If ActiveCell.Value = ProductID And ActiveCell.Offset(0, 1).Value = ConceptAct Then

            ConcDue = ActiveCell.Offset(0, 2).Value

            Exit Do
        End If
           ActiveCell.Offset(1, 0).Select
        Loop

     Sheets("Spreadsheet1").Select

     ActiveCell.Offset(0, 1) = ConcDue

     ' Step down 1 row from present location.
     ActiveCell.Offset(1, 0).Select

  Loop

Application.ScreenUpdating = True

End Sub

2 个答案:

答案 0 :(得分:1)

为什么索引/匹配不起作用?我认为,我能够得到一个索引/匹配公式作为数组输入的解决方案。这是一切的截图:

enter image description here

索引/匹配可以使用多个条件进行查找,只需在匹配()的第一部分和第二部分中将它们与&连接,然后按CTRL + SHIFT + ENTER以数组形式输入。这个formua将查看产品ID,然后是ActCode,返回日期。

这是你在找什么?

答案 1 :(得分:0)

我不清楚为什么使用本机工作表函数的双列标准公式不适用,但用户定义函数(又名UDF)将是从VBA角度来看的一种途径。

Function udf_Get_Two(sCode As Range, rCodes As Range, _
                     sProd As Range, rProds As Range, _
                     rDates As Range)
    Dim vCode As Variant, rw As Long, m As Long

    'quick check to see if there is anything to find
    If CBool(Application.CountIfs(rCodes.Columns(1), sCode.Value, _
      rProds.Resize(rCodes.Rows.Count, 1), sProd.Value)) Then
        rw = 0
        For m = 1 To Application.CountIf(rCodes.Columns(1), sCode.Value)
            rw = rw + Application.Match(sCode.Value, rCodes.Columns(1).Resize(rCodes.Rows.Count - rw, 1).Offset(rw, 0), 0)
            If rProds(rw, 1) = sProd Then
                udf_Get_Two = rDates.Cells(rw, 1).Value
                Exit Function
            End If
        Next m
    End If

End Function

像任何其他工作表公式一样使用。例如:

=udf_Get_Two(A2, Sheet2!$A$2:$A$7, $C$1, Sheet2!$B$2:$B$7, Sheet2!$C$2:$C$7)

UDF for two column lookup

请注意,返回的值是raw。单元格格式应为 m / d / yy 或您喜欢的格式。