Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
VBA Excel在两个数组上执行操作_Excel_Vba_Multidimensional Array - Fatal编程技术网

VBA Excel在两个数组上执行操作

VBA Excel在两个数组上执行操作,excel,vba,multidimensional-array,Excel,Vba,Multidimensional Array,我的程序中的for循环有问题。现在我有两个数组,其中填充了任意数字。这两个数组大小相同。基本上,我希望用户指定他们希望在数组上执行什么类型的操作,然后我将执行它们(假设数组的维度相同)。下面是我尝试使用原始两个数组之间的差异填充应答数组的代码: If (LCase(diffOrPercent = "difference")) Then For iRow = 1 To totalRow For iCol = 1 To totalCol answerA

我的程序中的for循环有问题。现在我有两个数组,其中填充了任意数字。这两个数组大小相同。基本上,我希望用户指定他们希望在数组上执行什么类型的操作,然后我将执行它们(假设数组的维度相同)。下面是我尝试使用原始两个数组之间的差异填充应答数组的代码:

If (LCase(diffOrPercent = "difference")) Then
    For iRow = 1 To totalRow
        For iCol = 1 To totalCol
            answerArray(iRow, iCol) = s2Array(iRow, iCol) - s3Array(iRow, iCol)
        Next iCol
    Next iRow
End If
我遇到的问题是,当我试图打印出answerArray时,它是完全空白的。有人知道发生了什么事吗

注意:当我放置以下内容时,如果for循环从0到结束-1,则会发生相同的错误:

answerArray(iRow, iCol) = s2Array(iRow, iCol).Value2 - s3Array(iRow, iCol).Value2
以及当我将Value而不是Value2放入时

谢谢,


Jesse Smotheron

首先跳出来的是假设数组的起始索引为1。除非您明确声明了某个地方(在声明数组时或使用时),否则数组中的第一个项的索引将为0

如果直到运行时才知道数组边界,则通常使用
LBound
UBound
函数以编程方式确定边界更安全:

If (LCase(diffOrPercent) = "difference") Then
    For iRow = LBound(s2Array, 1) To UBound(s2Array, 1)
        For iCol = LBound(s2Array, 2) To UBound(s2Array, 2)
            answerArray(iRow, iCol) = s2Array(iRow, iCol) - s3Array(iRow, iCol)
        Next iCol
    Next iRow
End If

请注意,我在这里假设
s2Array
s3Array
answerArray
都具有相同的维度。因此,我只检查了
s2Array

的边界,我发现if语句写得不正确,因此代码的操作部分甚至没有被命中。我把LCase上的括号弄错了,下面是更正

If (LCase(diffOrPercent) = "difference") Then
    For iRow = 1 To totalRow
        For iCol = 1 To totalCol
            answerArray(iRow, iCol) = s2Array(iRow, iCol) - s3Array(iRow, iCol)
        Next iCol
    Next iRow
End If

这使得变量differPercent都是小写的,而不是。。。。。我认为当我的原始if语句被实现时不会发生任何事情,这是有意义的,因为if语句中没有任何内容被命中。很抱歉,我在这个问题上完全浪费了大家的时间,但我真的很感激所有的快速响应

您是否验证了s2Array和s3Array中确实存在值?阵列的数据类型是什么?使用本地窗口查看正在使用哪些值并将其分配给数组。是的,我有另一个for循环,它会给出答案,并且s2Array和s3Array的单元格中都有正确的值。目前的数据类型只是int,但我想可能会有double参与其中。现在我只是将这三个数组声明为Dim s2Array(),实际上,我只是做了一个测试,在ActiveCells上执行这个表达式,而不是生成一个answerArray,结果正确。我仍然想知道这里的问题是什么,因为它困扰着我。谢谢you@Jesse如何定义这3个数组?@David At declaration刚刚Dim s2Array()Dim s3Array()Dim answerArray()。。。稍后在代码体s2Array=ActiveSheet.Range(“A1”).CurrentRegion中,与s3Array和AnswerArrayI相同。正确的假设是,它们都是相同的维度。我得到了相同的空白输出,所以我开始认为我的if语句是错误的,这意味着当我将它推过调试器时,它甚至没有命中代码的操作部分。different的值为“Difference”。。。。但是这不应该把事情搞砸,因为LCase?好吧。。。。这是完全的问题,我再次运行它,用户输入“差异”而不是“差异”,它工作得很好。但我认为LCase应该能做到,这样程序就不会担心是否有什么东西被资本化了。它的工作方式是否与我的想法不同?
(LCase(differorpercent)=“difference”)
@大卫哈哈,是的,我也发现了这一点,我不得不在我之前的项目中摸索。感谢您的快速回复,很高兴听到您的回复。您可以通过单击此答案上的上/下箭头旁边的空心复选标记来接受自己的答案。@Otaku,一旦他们允许,我也会这样做。显然,你不能在发布后的前两天内接受自己的答案。很可能与声誉有关