Arrays VBA数组输出到Excel工作表
我遇到了一个问题,虽然很简单,但很棘手,我有一个单元格中的字符串,我使用Mid函数将字符串拆分为字符,并将其存储到数组中。现在我想将数组打印到不同的范围,但我无法执行此操作。我试过很多不同的密码,但都是用静脉注射的。 请帮忙 我的代码是Arrays VBA数组输出到Excel工作表,arrays,excel,vba,Arrays,Excel,Vba,我遇到了一个问题,虽然很简单,但很棘手,我有一个单元格中的字符串,我使用Mid函数将字符串拆分为字符,并将其存储到数组中。现在我想将数组打印到不同的范围,但我无法执行此操作。我试过很多不同的密码,但都是用静脉注射的。 请帮忙 我的代码是 Option Base 1 Function Takseer(Rg As Variant) Dim NewArray() As Variant Dim StrEx As String Dim k, l, m As Integer
Option Base 1
Function Takseer(Rg As Variant)
Dim NewArray() As Variant
Dim StrEx As String
Dim k, l, m As Integer
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
Range("C1:C12") = NewArray
End Function
假设您获得的数组是“苹果”、“橘子”、“葡萄”、“榴莲”,为了写入工作表,您不能直接调用变量。写入值的一种方法是首先获取变量的长度,然后从索引0开始从数组中写入值,下面是我如何执行的:
Sub test1()
Dim NewArray() As Variant
Dim i As Long, arrayLoop As Long
Dim StrEx As String
Dim k, l, m As Integer
StrEx = "Hello today is my first day"
StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
m = Len(StrEx)
For k = 0 To m - 1
ReDim Preserve NewArray(m - 1)
NewArray(k) = Mid(StrEx, k + 1, 1)
Next k
i = UBound(NewArray) - LBound(NewArray) + 1
For arrayLoop = 0 To i - 1
Sheet1.Range("A" & arrayLoop + 1).Value = NewArray(arrayLoop)
Next
End Sub
执行数组循环时请注意,必须将长度减1,否则将超出范围,原因是数组索引始终从零开始(0)
并查看如何获取数组长度的帖子您必须将数组转置以将值放入列中
选项显式
选项基数1
子测试()
呼叫Takseer(“ABCDEFGHUIJKL”)
端接头
函数Takseer(StrEx作为字符串)
Dim NewArray()作为变量,s作为字符串,m作为整数,k作为整数
s=替换(StrEx,“,”)
m=Len(s)
如果m=0,则退出函数
ReDim新阵列(m)
对于k=1到m
新数组(k)=中间(s,k,1)
下一个k
“一排
表1.范围(“C1”)。调整大小(1,m)=新数组
"一栏,
Sheet1.Range(“C2”).Resize(m,1)=工作表函数.Transpose(新数组)
端函数
您的功能存在一些问题:
- 公式返回一个值。它不用于更改工作表的其他属性/单元格。
- 因此,您应该将结果设置为函数;不要尝试写入范围
仅声明Dim k、l、m作为整数
为m
,Integer
和k
未指定,因此它们将被声明为变量l
- 构建的阵列将是水平的。如果希望结果垂直,则需要对其进行转置,或者最初创建一个二维数组
- 选项Base 1是不必要的,因为您显式声明了下限
TestIt
进行设置
注2:工作表上的公式假设您有带动态数组的Excel。如果您有早期版本的Excel,则需要使用不同的工作表公式
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
查看修改后的函数和测试:
修改,将转置添加到工作表公式中
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
。无论如何,我宁愿避免它,因为它的开销
注意:
只是测试功能。您应该自己手动或以编程方式将适当的公式输入目标范围TestIt
- 如果没有动态数组,则需要在目标范围中输入数组公式;或者使用
函数返回数组的每个元素的公式INDEX
- 在
中,您可以将放置公式到工作表上的行更改为TestIt
,但是,您仍然可以手动或编程方式将正确的公式输入工作表范围(单元格(1,3),单元格(Len([a1]),3))。FormulaArray=“=Takseer(a1)”
子部分,而不是函数中。如果是这种情况,它可能与公式2
属性有关。如果是这样,您可能没有动态数组。请重新阅读我的笔记2,以及我的最后一张,刚刚在我答案底部添加的笔记。另外,请阅读Excel版的Microsoft帮助以了解数组公式。非常感谢,现在它可以正常运行了。但是当我手动操作时,它只打印第一个字母是的,错误就在sub中,而不是在函数中。