我正在尝试查找在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
答案 0 :(得分:1)
为什么索引/匹配不起作用?我认为,我能够得到一个索引/匹配公式作为数组输入的解决方案。这是一切的截图:
索引/匹配可以使用多个条件进行查找,只需在匹配()的第一部分和第二部分中将它们与&
连接,然后按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)
请注意,返回的值是raw。单元格格式应为 m / d / yy 或您喜欢的格式。