本帖最后由 香川群子 于 2014-6-27 15:18 编辑
mfk1288 发表于 2014-6-26 17:42
求解,求答案啊!
答案不是早就明确了……
① 除了一维数组和二维数组以外,都不能直接把数组内容直接输出到工作表单元格。
原因很简单,因为工作表单元格区域本身就是二维数组结构,
所以可以直接把单元格区域一次性读入VBA内存数组、如: arr= Range("A1:C5")
或直接把VBA内存数组结果输出到单元格区域,如:Range("A1:C5") = arr
而一维数组视作二维数组的特殊形态、仅可作为 单行多列单元格区域的输出。
如 :
arr = Array(1, 2, 3, 4)
[a1:d1] = arr
除此以外都不可行。
② 一维数组的补充说明:
单元格区域的单行读入数组时,得到1行n列的二维数组,而不是一维数组。形式如: arr(1, 1) to arr(1, n)
单元格区域的单列读入数组时,得到m行1列的二维数组,而不是一维数组。形式如: arr(1, 1) to arr(m, 1)
上述二维数组,可以通过 WorksheetFunction.Transpose()来转换为一维数组。
但是VBA中认为一维数组本质上相当于单行多列的二维数组,
所以一维数组使用WorksheetFunction.Transpose()来转换时,只能交替得到多行单列的二维数组和单行多列的一维数组。
即:
Sub test1()
arr = [a1:a4] '从工作表多行单列得到一个二维数组
brr = WorksheetFunction.Transpose(arr) '转换得到一维数组 (实际上相当于单行多列的二维数组)
crr = WorksheetFunction.Transpose(brr) '再次转换得到多行单列的二维数组
drr = WorksheetFunction.Transpose(crr) '转换得到一维数组 (实际上相当于单行多列的二维数组)
End Sub
Sub test2()
arr = [a1:d1] '从工作表单行多列得到一个二维数组
brr = WorksheetFunction.Transpose(arr) '转换得到多行单列的二维数组
crr = WorksheetFunction.Transpose(brr) '再次转换得到一维数组 (实际上相当于单行多列的二维数组)
drr = WorksheetFunction.Transpose(crr) '转换得到多行单列的二维数组
End Sub
因此,结论如下:
一维数组可作为单行多列区域直接输出到工作表单行。(一维数组事实上被默认为等效于单行多列的二维数组。)
如需输出到多行单列的区域,则必须使用 WorksheetFunction.Transpose(arr) 转换为二维数组、然后再输出到工作表。
③ 三维及以上的数组 无法直接输出到工作表区域。
只能通过For……Next循环进行逐个赋值。
…………
为提高输出效率,可以采取以下方法:
方法-1:
1. 定义临时二维数组 arr(1 to m, 1 to n)
2. 要输出部分内容、通过VBA内的For循环赋值到临时二维数组
3. 把临时二维数组结果输出到工作表
方法-2:
一开始就不要定义三维数组
但为了快速高效或理解方便,可以采取使用嵌套数组的方法。
代码例子:
- Sub test1()
- Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组
-
- For i = 1 To 3
- For j = 1 To 5
- For k = 1 To 10
- m = m + 1
- arr(i, j, k) = m
- Next
- Next
- Next
- '以上为三维数组赋值
- ' Cells.Clear
- For i = 1 To 3
- For j = 1 To 5
- For k = 1 To 10
- Cells((i - 1) * 6 + 1 + j, k) = arr(i, j, k) '循环逐个输出
- Next
- Next
- Next
- End Sub
- Sub test2()
-     Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组arr
-     
-     For i = 1 To 3
-         For j = 1 To 5
-             For k = 1 To 10
-                 m = m + 1
-                 arr(i, j, k) = m
-             Next
-         Next
-     Next
-     '以上为三维数组赋值
- '    Cells.Clear
-     Dim brr(1 To 5, 1 To 10) '定义一个输出用的临时二维数组brr
-     For i = 1 To 3
- '        Erase brr
-         For j = 1 To 5
-             For k = 1 To 10
-                 brr(j, k) = arr(i, j, k) '把三维数组中内容转移到临时二维数组中
-             Next
-         Next
-         [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = brr '多阶段一次性输出结果到工作表
-     Next
- End Sub
- Sub test3()
- Dim crr(1 To 3) '定义嵌套数组
- Dim trr(1 To 5, 1 To 10) '定义可输出结果的二维数组
- For i = 1 To 3
- crr(i) = trr '完成嵌套数组的定义
- Next
-
- For i = 1 To 3
- For j = 1 To 5
- For k = 1 To 10
- n = n + 1
- crr(i)(j, k) = n
- Next
- Next
- Next
- '以上为嵌套数组赋值 实际用法和三维数组也很类似的
- ' Cells.Clear
- For i = 1 To 3
- [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = crr(i)
- '这样就可以把嵌套的二维数组部分内容直接输出了。
- Next
- End Sub
复制代码呵呵。