我想查找Sheets的Columns C
(“MV_Backtest”)s.t cell_i match 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
。
以下是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
。
答案 0 :(得分:2)
(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)
将公式括起来。因此,例如:
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