您的功能存在一些问题:
- 公式返回一个值。它不用于更改工作表的其他属性/单元格。
-
Dim k, l, m As Integer 仅将 m 声明为 Integer、k 和 l 未指定,因此它们将被声明为变体。
- 构造的数组将是水平的。如果你希望结果是垂直的,你需要
Transpose它,或者最初创建一个二维数组。
- Option Base 1 是不必要的,因为您明确声明了下限
假设您想在工作表上使用此功能,TestIt 进行设置。
注意 2:工作表上的公式假定您拥有带有动态数组的 Excel。如果您使用的是早期版本的 Excel,则需要使用不同的工作表公式
查看修改后的函数和TestIt:
在工作表公式中添加了转置修改
Option Explicit
Function Takseer(Rg As Variant)
Dim NewArray() As Variant
Dim StrEx As String
Dim k As Long, l As Long, m As Long
StrEx = Rg
StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
m = Len(StrEx)
For k = 1 To m
ReDim Preserve NewArray(1 To m)
NewArray(k) = Mid(StrEx, k, 1)
Next k
Takseer = NewArray
End Function
Sub TestIt()
[a1] = "abcdefg"
[c1].EntireColumn.Clear
[c1].Formula2 = "=Transpose(Takseer(A1))"
End Sub
修改为创建二维垂直阵列
不能在这个数组上真正使用redim preserve。由于开销,我更愿意避免它
Option Explicit
Function Takseer(Rg As Variant)
Dim NewArray() As Variant, col As Collection
Dim StrEx As String
Dim k As Long, l As Long, m As Long
StrEx = Rg
StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
m = Len(StrEx)
Set col = New Collection
For k = 1 To m
col.Add Mid(StrEx, k, 1)
Next k
ReDim NewArray(1 To col.Count, 1 To 1)
For k = 1 To col.Count
NewArray(k, 1) = col(k)
Next k
Takseer = NewArray
End Function
Sub TestIt()
[a1] = "abcdefg"
[c1].EntireColumn.Clear
[c1].Formula2 = "=Takseer(A1)"
End Sub
注意:
-
TestIt 只是为了测试功能。您应该自己手动或以编程方式将适当的公式输入到目标范围中。
- 如果您没有动态数组,则需要在目标范围内输入数组公式;或使用
INDEX 函数的公式返回数组的每个元素。
- 在
TestIt 中,您可能会将将公式放入工作表的行更改为Range(Cells(1, 3), Cells(Len([a1]), 3)).FormulaArray = "=Takseer(a1)",但同样,预计您将手动或以编程方式将正确的公式输入工作表。李>