Excel将2d范围转换为1d范围以用于function

令人惊讶的是,search谷歌的答案 ,以及这个网站,导致这个问题没有明显的答案,所以我想我会张贴它。

我试图创build一个macros(可能是一个UDF)将2维单元格范围(如A1:C3)转换为1维范围(像A1:A10列或行)。 当需要二维数组时,这将用于诸如MATCH()函数,例如在A1:C3中查找特定值。 但是我希望这个function是多function的,这样我就可以把它放在任何二维数组中,使它成为一维。 如=INDEX(ARRAYDIMENSION(A1:C1),4)=MATCH("hello",ARRAYDIMENSION(A1:C1),0)

我已经想出了一个讨厌的方法 。 我在一个新的工作表中为我的数组(对于A1:C3 ,即A1:A3B1:B3C1:C3 )的每一列进行拍打(所以A2被复制到新工作表的A2中,C3被复制到A9,B1 A4等)

然后返回我的新数组( Sheet2!A1:A9 )的引用,所以MATCH()INDEX()或任何现在看起来那里。

它工作但有一些明显的缺陷; 添加一个新的表是macros观和丑陋的时间消耗,堆叠在一起的单个列不能是最有效的方法。 但特别是,macros编辑工作表,所以不能成为一个UDF(我不认为),这意味着我不得不使用它作为一个Worksheet_Calculate子,这是不是只是把它放在任何公式需要它。


我认为这是相对清楚的,请帮助/build议最好的方法,我只有几个星期的VBA,所以我还没有超级光滑。

这会让你开始:

 Function ArrayDim(rn As Range, dir As Integer) Dim test() As Variant Dim rng() As Variant Dim cell As Range Dim i As Long rng = rn.Value ReDim test(1 To UBound(rng, 1) * UBound(rng, 2)) i = 1 If dir = 0 Then For r = 1 To UBound(rng, 1) For c = 1 To UBound(rng, 2) test(i) = rng(r, c) i = i + 1 Next c Next r Else For c = 1 To UBound(rng, 2) For r = 1 To UBound(rng, 1) test(i) = rng(r, c) i = i + 1 Next r Next c End If ArrayDim = test End Function 

第二个标准是sorting的方法:

0 =逐行1 =逐列

![在这里输入图片描述

也许这样的事情?

 Function OneDimArray(rng As Excel.Range) As Variant() Dim v() As Variant Dim b As Boolean Dim a() As Variant Dim irow As Integer Dim icol As Integer Dim r As Range Set r = Range("a1:c2") v = r.Value ReDim a(0) For icol = 1 To r.Columns.Count For irow = 1 To UBound(v) a(UBound(a)) = v(irow, icol) ReDim Preserve a(UBound(a) + 1) Next irow Next icol OneDimArray = a End Function