Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在VBA中创建具有参数动态数组的函数,其输出也是动态数组_Arrays_Vba_Dynamic - Fatal编程技术网

Arrays 在VBA中创建具有参数动态数组的函数,其输出也是动态数组

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给出。此外,该函数必须能够绕过输入数组中任何缺失的值,并忽略相应的不存在的返回值。整个过程必须在

以下是我想做的: 假设您有一个动态数组,其维度可以从0x610x6(这意味着我们可以在0到10之间的任意位置拥有行,但列始终是6)。我一直在拼命尝试创建一个函数(然后将其绑定到宏),该函数将使用第一个数组作为参数,并将创建第二个数组作为输出,其元素将是第一个数组的返回。例如,如果我们有1x6的简单情况,那么输出数组的元素是五个,并且在每种情况下由公式
(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)发送给您,您可以自己查看问题。无论如何,非常感谢您的快速回复。我想这是有道理的。。。我的回答并没有真正解决您的整个问题,它只是一个提示,告诉您如何在函数之间传递数组。