令人惊讶的是,搜索Google的答案以及此网站,对此问题没有明显的答案,所以我想我会发布它。
我试图创建一个宏(可能是UDF),它将2维单元格范围(如A1:C3)转换为1维范围(列或行等) A1:A10)。当需要2d阵列时,这将用于诸如MATCH()
之类的功能。查找A1:C3中的特定值。但我希望这个功能是多功能的,这样我就可以把它绕过任何2D阵列来使它成为1D。与=INDEX(ARRAYDIMENSION(A1:C1),4)
或=MATCH("hello",ARRAYDIMENSION(A1:C1),0)
我已经想出了一个讨厌的方法;我在一张新工作表中拍下我的数组的每一列(对于A1:C3
A1:A3
,B1:B3
,C1:C3
),并将其复制到A2新表格中,C3复制到A9,B1到A4等。)
然后我返回我的新数组(Sheet2!A1:A9
)的引用,以便MATCH()
或INDEX()
或现在看起来的任何内容。
它有效,但有一些明显的缺陷;添加新工作表对于宏来说是耗时的并且丑陋,将各个列堆叠在彼此之上可能不是最有效的方法。但是特别是,宏编辑工作表因此不能成为UDF(我不这么认为)意味着我必须将其用作Worksheet_Calculate Sub,它不仅仅是将其置于任何公式需求中它
我认为相对比较清楚,请帮助/建议最好的方法,我只有几周VBA,所以我还不是超级光滑。
答案 0 :(得分:2)
这将帮助您入门:
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
第二个标准是对其进行排序的方法:
0 =逐行 1 =逐列
答案 1 :(得分:0)
或许这样的事情?
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