Excel将2d范围转换为1d范围,以便在函数

时间:2016-12-13 17:20:10

标签: arrays excel vba excel-vba user-defined-functions

令人惊讶的是,搜索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:A3B1:B3C1:C3),并将其复制到A2新表格中,C3复制到A9,B1到A4等。)

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

它有效,但有一些明显的缺陷;添加新工作表对于宏来说是耗时的并且丑陋,将各个列堆叠在彼此之上可能不是最有效的方法。但是特别是,宏编辑工作表因此不能成为UDF(我不这么认为)意味着我必须将其用作Worksheet_Calculate Sub,它不仅仅是将其置于任何公式需求中它

我认为相对比较清楚,请帮助/建议最好的方法,我只有几周VBA,所以我还不是超级光滑。

2 个答案:

答案 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 =逐列

![enter image description here

答案 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
相关问题