Excel VBA数组打印异常:为何部分循环代码无输出?
问题原因解析
你的weights变量实际上是单列二维数组(而非一维数组),这是导致三种循环表现不同的核心原因,具体拆解如下:
1. For Each循环能正常工作的原因
VBA的For Each循环会自动遍历数组的所有元素,无论数组是一维还是多维,它会"扁平化"处理数组结构,逐个取出元素值,因此不需要关心数组的维度和索引规则,直接就能打印所有内容。
2. 第一个索引循环无输出的原因
你犯了两个关键错误:
- 错误地对索引做了
i - 1的偏移:VBA中从单元格区域赋值得到的数组默认是1基索引(即LBound返回1),当i从1开始时,i - 1得到0,而数组第一维不存在0这个索引,导致访问不到有效元素。 - 忽略了数组的二维结构:二维数组必须使用
(行索引, 列索引)的格式访问,你只写了一个索引,即使去掉i - 1,weights(i)也无法正确访问二维数组的元素。
3. weights(i, 1)循环能正常工作的原因
因为你的数组是单列二维数组,第一维代表行号,第二维的列号固定为1。用i遍历第一维的LBound到UBound,再指定第二维为1,正好对应每一行的唯一元素,所以能正确打印内容。
补充验证代码
你可以用这段代码确认数组的维度:
Debug.Print "数组维度数:" & UBound(weights, 0) Debug.Print "第一维下界:" & LBound(weights, 1) Debug.Print "第一维上界:" & UBound(weights, 1) Debug.Print "第二维下界:" & LBound(weights, 2) Debug.Print "第二维上界:" & UBound(weights, 2)
执行后会看到第二维的上下界都是1,证明这是一个单列二维数组。
内容的提问来源于stack exchange,提问作者shresth
相关产品推荐
相关产品推荐

