使用 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: 结果
我正在尝试创建如下函数:
输入:范围
输出: 包含范围内所有非空单元格的列。
例如,在输入
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: 结果