Arrays 在VBA中创建具有参数动态数组的函数,其输出也是动态数组
以下是我想做的: 假设您有一个动态数组,其维度可以从0x6到10x6(这意味着我们可以在0到10之间的任意位置拥有行,但列始终是6)。我一直在拼命尝试创建一个函数(然后将其绑定到宏),该函数将使用第一个数组作为参数,并将创建第二个数组作为输出,其元素将是第一个数组的返回。例如,如果我们有1x6的简单情况,那么输出数组的元素是五个,并且在每种情况下由公式Arrays 在VBA中创建具有参数动态数组的函数,其输出也是动态数组,arrays,vba,dynamic,Arrays,Vba,Dynamic,以下是我想做的: 假设您有一个动态数组,其维度可以从0x6到10x6(这意味着我们可以在0到10之间的任意位置拥有行,但列始终是6)。我一直在拼命尝试创建一个函数(然后将其绑定到宏),该函数将使用第一个数组作为参数,并将创建第二个数组作为输出,其元素将是第一个数组的返回。例如,如果我们有1x6的简单情况,那么输出数组的元素是五个,并且在每种情况下由公式(x_i+1-x_i)/x_i,i=1,2,…,6给出。此外,该函数必须能够绕过输入数组中任何缺失的值,并忽略相应的不存在的返回值。整个过程必须在
(x_i+1-x_i)/x_i,i=1,2,…,6
给出。此外,该函数必须能够绕过输入数组中任何缺失的值,并忽略相应的不存在的返回值。整个过程必须在VBA脚本中完成
我已经两天没有疯狂地寻找帮助了,但问题是我对VBA编程一无所知(我通常使用其他语言,如MATLAB或Mathematica),所以这对我来说非常困难。我发现的任何解决方案都无法组合起来并实现我的目标。非常感谢您提供的任何帮助。因为您没有提供任何代码,所以我无法确切确定您想要做什么,但下面是一个传递数组并返回数组的示例,您应该能够推断该数组 编辑:只是为了好玩,更新了它,使其适用于最多3维数组
Public Sub Test()
'Defines testArray as Variant 0 to 10
Dim testArray(0 To 1, 0 To 6) As Long
Dim returnArray() As Long
Dim i As Long
Debug.Print UBound(testArray, 2)
'Populates testArray with Longs
For i = 0 To UBound(testArray, 1)
For j = 0 To UBound(testArray, 2)
testArray(i, j) = (i + j) * 2
Next
Next
'Passes testArray and returns ParseArray
returnArray = addOne(testArray)
End Sub
Public Function addOne(arrValues() As Long) As Variant
Dim arrCopy() As Long
Dim dimensionNum As Long, ErrorCheck As Long
On Error Resume Next
For dimensionNum = 1 To 60000
ErrorCheck = LBound(arrValues, dimensionNum)
If Err.Number <> 0 Then
dimensionNum = dimensionNum - 1
Exit For
End If
Next
Dim i As Long, j As Long, k As Long
'Copies passed array to avoid updating passed array directly
arrCopy = arrValues
'Adds 1 to each element of the array.
If dimensionNum = 1 Then
For i = LBound(arrCopy) To UBound(arrCopy)
arrCopy(i) = arrCopy(i) + 1
Next
ElseIf dimensionNum = 2 Then
For i = LBound(arrCopy) To UBound(arrCopy)
For j = LBound(arrCopy, 2) To UBound(arrCopy, 2)
arrCopy(i, j) = arrCopy(i, j) + 1
Next
Next
ElseIf dimensionNum = 3 Then
For i = LBound(arrCopy) To UBound(arrCopy)
For j = LBound(arrCopy, 2) To UBound(arrCopy, 2)
For k = LBound(arrCopy, 3) To UBound(arrCopy, 3)
arrCopy(i, j, k) = arrCopy(i, j, k) + 1
Next
Next
Next
Else
MsgBox "Add function only works for three dimensions or fewer arrays"
End If
addOne = arrCopy
End Function
公共子测试()
'将testArray定义为变量0到10
变暗测试阵列(0到1,0到6)的长度为
Dim returnArray()的长度为
我想我会坚持多久
调试。打印UBound(testArray,2)
“用long填充testArray
对于i=0到UBound(测试阵列,1)
对于j=0至UBound(测试阵列,2)
测试阵列(i,j)=(i+j)*2
下一个
下一个
'传递testArray并返回ParseArray
returnArray=addOne(testArray)
端接头
公共函数addOne(arrValues()的长度)作为变量
Dim arrCopy()尽可能长
Dim dimensionNum尽可能长,ErrorCheck尽可能长
出错时继续下一步
对于尺寸num=1至60000
ErrorCheck=LBound(arrValues,dimensionNum)
如果错误号为0,则
dimensionNum=dimensionNum-1
退出
如果结束
下一个
我长,j长,k长
'复制传递的数组以避免直接更新传递的数组
arrCopy=arrCopy值
'向数组的每个元素添加1。
如果dimensionNum=1,则
对于i=LBound(arrCopy)到UBound(arrCopy)
arrCopy(i)=arrCopy(i)+1
下一个
ElseIf dimensionNum=2,则
对于i=LBound(arrCopy)到UBound(arrCopy)
对于j=LBound(arrCopy,2)到UBound(arrCopy,2)
arrCopy(i,j)=arrCopy(i,j)+1
下一个
下一个
ElseIf dimensionNum=3,则
对于i=LBound(arrCopy)到UBound(arrCopy)
对于j=LBound(arrCopy,2)到UBound(arrCopy,2)
对于k=LBound(arrCopy,3)到UBound(arrCopy,3)
arrCopy(i,j,k)=arrCopy(i,j,k)+1
下一个
下一个
下一个
其他的
MsgBox“添加函数仅适用于三维或更少的数组”
如果结束
addOne=arrCopy
端函数
谢谢您的回复。您的代码确实有助于理解一些事情。但不幸的是,我最终没能解决我的问题。如果您愿意,我可以将原始excel文件(不超过20kb)发送给您,您可以自己查看问题。无论如何,非常感谢您的快速回复。我想这是有道理的。。。我的回答并没有真正解决您的整个问题,它只是一个提示,告诉您如何在函数之间传递数组。