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:A3
, B1:B3
, C1: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