将VBA数组传递给公式

我有两行数据看起来像这样:

数据

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

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

但是,只要我search的ID不是列A中的第一个,就会失败。(我的确尝试对列A进行sorting,但没有运气)。

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

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

其中positions是一个VBA函数,返回与指定ID相匹配的行数组。 functionpositions被编码,以便返回一个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:这是所需的输出

在这里输入图像描述

把这个数组公式放在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将在公式周围放置{}

然后复制足够覆盖所有的数据。

在这里输入图像描述


编辑#1

如果你可以sorting数据,那么你可以避免数组公式,并使用这个正常的公式:

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

在这里输入图像描述

绘图是否可以使用符合特定条件的行号填充数组而不循环? ,你可以用array和VBA来做到这一点:

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

A2的“1”,“4”,“7”,“10”

  1. 这行[e2].Offset(lngCnt - 1, 1).Resize(1, UBound(x) + 1) = Split(Join(x, "|"), "|")将string放到每个数组

 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 

在这里输入图像描述