在vba中查找的两个标准

时间:2017-05-10 08:29:20

标签: excel vba excel-vba

我想查找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_iI28I20:I22Columns Acell_jJ28J20:J22Columns BK20:K22Columns C

1 个答案:

答案 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