在vba中查找的两个标准
我想查看表格Columns C
的值(“MV_Backtest”)st cell_i匹配Columns A
,cell_j匹配Columns B
,这里是代码:
Sub Matrix() lastRow = ThisWorkbook.Sheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row lastColumn = ThisWorkbook.Sheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Column For i = 2 To lastRow For j = 3 To lastColumn cell_i = ThisWorkbook.Sheets("Sheet2").Cells(i, 2) cell_j = ThisWorkbook.Sheets("Sheet2").Cells(1, j) Cells(i, j) = Application.WorksheetFunction.Lookup(1, 0 / (cell_i = ThisWorkbook.Sheets("MV_Backtest").Columns("A:A")) * (cell_j = ThisWorkbook.Sheets("MV_Backtest").Columns("B:B")), ThisWorkbook.Sheets("MV_Backtest").Columns("C:C")) Next j Next i End Sub
请注意,一列中的每个值可能不是唯一的,但是将两个值组合在一起是唯一的。
在Excel中没关系,但是这里有什么问题吗?
顺便说一句,当两个条件都不匹配时Cells(i, j) = 0
我怎么能设置Cells(i, j) = 0
。
这是Excel公式:
=LOOKUP(1,0/(I28=I20:I22)*(J28=J20:J22),K20:K22)
cell_i
是I28
, I20:I22
是Columns A
, cell_j
是J28
, J20:J22
是Columns B
, K20:K22
是Columns C
(cell_i = ThisWorkbook.Sheets("MV_Backtest").Columns("A:A")) * (cell_j = ThisWorkbook.Sheets("MV_Backtest").Columns("B:B"))
虽然上面的代码看起来正确的Excel公式,它不是有效的VBA 。 在Excel中,它生成并倍增两个数组,但不能像VBA中那样生成一个数组(VBA不允许数组乘法,数组比较等)。
如果你有一个有效的Excel公式,你可以让Excel评估它,然后得到结果。 两种方式来做到这一点:
1-使用Application.Evaluate
:
Cells(i, j).value = Application.Evaluate("=Lookup(1,0/((" & cell_i & _ "= MV_Backtest!A:A) * (" & cell_j &_ "=MV_Backtest!B:B)), MV_Backtest!C:C)")
2-使用.Formula
Cells(i, j).Formula = "=Lookup(1,0/((" & _ cell_i & "=MV_Backtest!A:A) * (" & _ cell_j & "=MV_Backtest!B:B)), MV_Backtest!C:C)"
如果您想在此之后修复该值并删除该公式,则可以:
Cells(i, j).Value = Cells(i, j).Value2
编辑:
当不存在匹配时将单元格设置为零,通常的方法是用IFERROR(myformula, 0)
将公式括IFERROR(myformula, 0)
。 因此,例如:
Cells(i, j).value = Application.Evaluate("=IFERROR(Lookup(1,0/((" & cell_i & _ "= MV_Backtest!A:A) * (" & cell_j &_ "=MV_Backtest!B:B)), MV_Backtest!C:C)), 0")
或者,您可以检查(在VBA中) 初始公式的结果值是否为错误代码。 即
If IsError(Cells(i, j).Value) Then Cells(i, j).Value = 0