如上图所示:
我需要在某些条件下将Wb1.coumns(1)
上的值与其他工作簿Wb2.coumns(1)
上的值进行匹配。
将从列M
处的值Close
中滤除Wb2
。
然后,我查找最晚的收盘日期,并在B
列中获取其相应的值,然后将该值输入Wb1.column(K)
。
下面的代码可以正确地运行在所提供的例子上,但是它在我的实际数据集上是不可靠的,因为它依赖于许多列从最旧到最新的排序。
这是一个link for the provided sample
Sub Get_the_respective_value_of_Last_Closing_Date()
Dim wb1 As Workbook, wb2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rng1 As Range, rng2 As Range
Dim arr1() As Variant, arr2() As Variant
Application.ScreenUpdating = False
Set wb1 = ThisWorkbook
Set wb2 = Workbooks.Open("Path of wb2", UpdateLinks:=False, ReadOnly:=True)
Set ws1 = wb1.Sheets(1)
Set ws2 = wb2.Sheets(1)
Set rng1 = ws1.Range("A3:K" & ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row) 'Main Range
Set rng2 = ws2.Range("A3:M" & ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row)
arr1 = rng1.Value2
arr2 = rng2.Value2
Dim i As Long, k As Long
For i = LBound(arr1) To UBound(arr1)
For k = LBound(arr2) To UBound(arr2)
If arr1(i, 1) = arr2(k, 1) And arr2(k, 13) = "Close" Then
rng1.Cells(i, 11) = arr2(k, 2)
End If
Next k
Next i
wb2.Close SaveChanges:=False
Application.ScreenUpdating = True
End Sub
3条答案
按热度按时间qnakjoqk1#
请尝试下一个修改过的代码。它使用一个字典来保存打开的工作簿的唯一kay(和“K:K”中的最后一个值作为项目),然后将适当的数据放入工作簿:
要打开的工作簿的“K:K”列必须按升序排序...
编辑日期:
下一个版本不需要对列“K:K”进行排序:
jjjwad0x2#
您可能会受益于Excel中的函数,并将它们与通过VBA进行评估结合起来。正如我所做的示例:
我在同一张工作表中做了这个解释。在K列中得到这个的公式是:
此公式将返回所需的输出。应用于VBA将是:
此外,如果您有Excel365,您可能会受益于函数MAXIFS:
MAXIFS function
我很肯定,在公式中提供的部分
--($W$2:$W$16=MAX(--($Y$2:$Y$16="Close")*--($M$2:$M$16=A2)*$W$2:$W$16))
可以替换为MAXIFS,但我得到了一个旧版本的Excel,所以我不能测试。此外,选中评估:
Application.Evaluate method (Excel)
35g0bw713#
排序和XLOOKUP以获得最大值
Sheet1
的单元格K3
中使用以下溢出公式:XLOOKUP
函数。Book2.xlsx
打开的情况下,您需要将Sheet2!A3:M22
替换为'[Book2.xlsx]Wb2-sh1'!A3:M18
,将A3:A14
替换为A3:A8
,将Closed
替换为Close
(我的错)。