将VBA数组传递给公式

时间:2017-01-05 17:07:25

标签: arrays excel vba excel-vba

我有两行数据,如下所示:

Data

我正在尝试返回数组中每个ID的所有位置编号。我试过了

={IF(A2:A562=E2,B2:B562)}

但只要我搜索的ID不是A列中的第一个,它就会失败。(我确实尝试对A列进行排序而没有运气)。

所以我想出了这个解决方法:相反,我会使用这个公式

={INDEX(B2:B562,positions(E2))}

其中positions是一个VBA函数,它返回与指定ID匹配的行数组。功能positions已编码,以便返回Variant。但似乎VBA阵列没有传递给excel中的公式。当我评估公式时,positions(E2)等于0.(我已检入VBA,并且我的数组已正确填充)。

那么如何让我的公式正确解释VBA数组?

更新:这是我的代码:

Function positions(idrange As Range) As Variant
Dim V As Variant
Dim l, nb As Integer
Dim id As Double

nb = 4
ReDim V(nb) As Variant

id = idrange.Value
Set cible = Sheet2.Range("B1")
For l = 1 To nb
    Set cible = Sheet2.Columns(2).Find(What:=id, After:=cible, _
                LookIn:=xlValues)

    V(l) = cible.Row - 1   
Next l
positions = Application.Transpose(V)

End Function

更新2:这是所需的输出

enter image description here

2 个答案:

答案 0 :(得分:3)

将此数组公式放在F2:

=IFERROR(INDEX($B$2:$B$562,MATCH(1,($A$2:$A$562=$E2)*(COUNTIF($E$2:E2,$B$2:$B$562)=0),0)),"")

使用Ctrl-Shift-Enter而不是Enter确认。如果操作正确,那么Excel会将{}放在公式周围。

然后上下复印足以覆盖所有数据。

enter image description here

编辑#1

如果您可以对数据进行排序,那么您可以避免使用此常规公式:

=IF(COLUMN(A:A) <= COUNTIF($A:$A,$E2),INDEX($B:$B,MATCH($E2,$A:$A,0)+COLUMN(A:A)-1),"")

enter image description here

答案 1 :(得分:2)

Is it possible to fill an array with row numbers which match a certain criteria without looping?上绘图,您可以使用数组和VBA执行此操作:

  1. 此行Filter(Application.Transpose(Application.Evaluate("=IF(A2:A100=OFFSET(E2," & lngCnt - 1 & ",0), (B2:B100),""x"")")), "x", False)返回匹配B值的字符串
  2.   A2的

    “1”,“4”,“7”,“10”

    1. 此行[e2].Offset(lngCnt - 1, 1).Resize(1, UBound(x) + 1) = Split(Join(x, "|"), "|")将字符串放入每个数组
    2. Sub GetEm()
      
      Dim lngCnt As Long
      'range of your codes from E2 down
      y = [E2:E4]
      
      For lngCnt = 1 To UBound(y)
           x = Filter(Application.Transpose(Application.Evaluate("=IF(A2:A100=OFFSET(E2," & lngCnt - 1 & ",0), (B2:B100),""x"")")), "x", False)
          [e2].Offset(lngCnt - 1, 1).Resize(1, UBound(x) + 1) = Split(Join(x, "|"), "|")
      Next
      End Sub
      

      enter image description here