0

我正在尝试创建如下函数:

输入:范围
输出:包含范围内所有非空单元格的列。

例如,在输入

A | B | C | D
--------------
1 | 2 |   | 3 
4 |   | 5 |  

输出应该是

A
--
1
2
3
4
5

这是我的试验:

Function toColumn(range As range) As Integer()

Dim res(,) As Integer, i As Integer
i = 0

For Each Row In range.Rows
    For Each cel In Row.Cells
            If Not IsEmpty(cel) Then
                ReDim Preserve res(0, i)
                res(0, i) = cel
                i = i + 1
           End If
    Next cel
Next Row

toColumn = res

End Function

我知道 res 是一维的(因此,结果是一行而不是一列)对我有用。所以,问题在于它是二维的。

另外,我知道 decleration 存在具体问题

Dim res(,) As Integer

但我不知道有什么问题。

提前致谢!

4

2 回答 2

0

您的代码无法正常工作,因为该Dim语句需要Dim res() As Integer.

但是,您的代码当前返回的是单行多列数组,因此需要先对其进行转置,然后才能将其放入列中。

这可以通过两种替代方法来完成:


使用 Excel 数组公式

{=TRANSPOSE(toColumn(A1:D2))}

和只返回一行信息的代码

Function toColumn(range As range) As Integer()

    Dim res() As Integer, i As Integer
    i = 0

    For Each cel In range.Cells
         If Not IsEmpty(cel) Then
             ReDim Preserve res(i)
             res(i) = cel
             i = i + 1
        End If
    Next cel

    toColumn = res

End Function

注意:不需要返回二维数组,因为TRANSPOSEExcel 会处理从行到列的转换。


使用 Excel 数组公式

{=toColumn(A1:D2)}

和返回“二维”数组的代码。

但是,因为ReDim Preserve只能增加第二维(通常是“列”维),这需要我们使用一个以列作为第一维,以行作为第二维的数组,以便我们可以增加行。然后,代码将需要执行 aTranspose以将行/列切换回应有的状态。但是由于Transpose会将一维数组转换为多行单列数组,所以我们也可以在内部使用一维数组。

但是,我们必须将结果作为Variant数组返回,因为这Transpose将给我们。

Function toColumn(range As range) As Variant()

    Dim res() As Integer, i As Integer
    i = 0

    For Each cel In range.Cells
         If Not IsEmpty(cel) Then
             ReDim Preserve res(i)
             res(i) = cel
             i = i + 1
        End If
    Next cel

    toColumn = Application.Transpose(res)

End Function
于 2017-09-16T08:29:25.110 回答
0

尝试这个

Function ToColumn(rng As range) As Variant
    Dim arr
    Dim cel As range
    Dim str As String

    For Each cel In rng
        If Len(cel) > 0 Then
            If str = "" Then
                str = cel
            Else
                str = str & "," & cel
            End If
        End If
    Next cel
    arr = Split(str, ",")
    ToColumn = Application.Transpose(arr)
End Function

如何使用此功能:
首先选择您认为适合您的数据的范围,然后键入=ToColumn(A1:D2)并按Ctrl+ Shift+ Enter。请参阅图片以供参考。

图 1:输入公式

在此处输入图像描述

图 2:结果

在此处输入图像描述

于 2017-09-16T08:38:50.803 回答