使用 VBA 范围到 Excel 中的列

Range to Column in Excel using VBA

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

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

例如,在输入

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 是一维的(因此,结果是行而不是列)的变体对我有用。所以,问题在于它是二维的。

此外,我知道减速有一个问题

Dim res(,) As Integer

但我不知道是什么问题。

提前致谢!

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

但是,您的代码目前正在 return 生成一个单行多列数组,因此在将其放入列中之前需要进行转置。

可以使用两种替代方法:


使用Excel数组公式

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

和代码return一行信息

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

注意:不需要 return 二维数组,因为 Excel 完成的 TRANSPOSE 将处理从行到列的转换。


使用Excel数组公式

{=toColumn(A1:D2)}

和 return 是一个 "two-dimensional" 数组的代码。

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

但是,我们必须 return 作为 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

试试这个

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

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

图1:输入公式

图片 2: 结果