Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 12986|回复: 7

[已解决]能把三维数组的值直接赋值给单元格吗?

[复制链接]
发表于 2014-6-26 15:30 | 显示全部楼层 |阅读模式
Sub tt()
Dim arr( 1 To 10, 1 To 10)
Sheet1.Select
    For i = 1 To 10
        For j = 1 To 10
            arr( i, j) = Cells(i, j)
        Next
    Next
    Sheet2.Range("A1:J10") = arr
End Sub

以上的代码很简单,相信大家都以看明白。最终就是把数组直接赋值给单元格。现在如果改为三维数组
Sub tt()
Dim arr(1 To 10, 1 To 10, 1 To 10)
Sheet1.Select
    For i = 1 To 10
        For j = 1 To 10
            arr(i, i, j) = Cells(i, j)
        Next
    Next
    for i=1 to 10
Sheets(i+1).Range("A1:J10") = ????
next
End Sub

现在就是请问????能否象第一段代码一样。一句就可以把arr(1,1,1)到arr(1,10,10)直接赋值给表的Range("A1:J10") (我循环10次,就直接赋值给10个表的Range("A1:J10") )



最佳答案
2014-6-27 15:10
本帖最后由 香川群子 于 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:
一开始就不要定义三维数组
但为了快速高效或理解方便,可以采取使用嵌套数组的方法。

代码例子:
  1. Sub test1()
  2.     Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组
  3.    
  4.     For i = 1 To 3
  5.         For j = 1 To 5
  6.             For k = 1 To 10
  7.                 m = m + 1
  8.                 arr(i, j, k) = m
  9.             Next
  10.         Next
  11.     Next
  12.     '以上为三维数组赋值

  13. '    Cells.Clear
  14.     For i = 1 To 3
  15.         For j = 1 To 5
  16.             For k = 1 To 10
  17.                 Cells((i - 1) * 6 + 1 + j, k) = arr(i, j, k) '循环逐个输出
  18.             Next
  19.         Next
  20.     Next
  21. End Sub

  22. Sub test2()
  23.     Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组arr
  24.     
  25.     For i = 1 To 3
  26.         For j = 1 To 5
  27.             For k = 1 To 10
  28.                 m = m + 1
  29.                 arr(i, j, k) = m
  30.             Next
  31.         Next
  32.     Next
  33.     '以上为三维数组赋值

  34. '    Cells.Clear
  35.     Dim brr(1 To 5, 1 To 10) '定义一个输出用的临时二维数组brr
  36.     For i = 1 To 3
  37. '        Erase brr
  38.         For j = 1 To 5
  39.             For k = 1 To 10
  40.                 brr(j, k) = arr(i, j, k) '把三维数组中内容转移到临时二维数组中
  41.             Next
  42.         Next
  43.         [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = brr '多阶段一次性输出结果到工作表
  44.     Next
  45. End Sub


  46. Sub test3()
  47.     Dim crr(1 To 3) '定义嵌套数组
  48.     Dim trr(1 To 5, 1 To 10) '定义可输出结果的二维数组
  49.     For i = 1 To 3
  50.         crr(i) = trr '完成嵌套数组的定义
  51.     Next
  52.    
  53.     For i = 1 To 3
  54.         For j = 1 To 5
  55.             For k = 1 To 10
  56.                 n = n + 1
  57.                 crr(i)(j, k) = n
  58.             Next
  59.         Next
  60.     Next
  61.     '以上为嵌套数组赋值 实际用法和三维数组也很类似的

  62. '    Cells.Clear
  63.     For i = 1 To 3
  64.         [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = crr(i)
  65.         '这样就可以把嵌套的二维数组部分内容直接输出了。
  66.     Next
  67. End Sub
复制代码
呵呵。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-26 15:50 | 显示全部楼层
三维数组不能像一维或二维数组那样一次性赋值给单元格的,不过你的这个目的貌似不用三维数组吧。
直接
for i=1 to 10
sheets(i).range("A1:J10")=二维数组
next
这样不是更简单点吗?
回复

使用道具 举报

发表于 2014-6-26 16:34 | 显示全部楼层
用三维多难理解。
就用2楼的方法就成了。
回复

使用道具 举报

 楼主| 发表于 2014-6-26 16:41 | 显示全部楼层
hwc2ycy 发表于 2014-6-26 16:34
用三维多难理解。
就用2楼的方法就成了。

我举例只是用一个简单的二维数组与三维数组,实际上的三维数组arr(100,1000,16),我已经生成了一个三维数组,如何把100个1000行*16列的数据填入100个表里,用循环是可以达到最终的结果,但是想能不能直接写入赋值,而不需要循环才能达到目的。

点评

循环就挺好。  发表于 2014-6-27 08:42
回复

使用道具 举报

 楼主| 发表于 2014-6-26 17:42 | 显示全部楼层
求解,求答案啊!
回复

使用道具 举报

发表于 2014-6-27 15:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 香川群子 于 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:
一开始就不要定义三维数组
但为了快速高效或理解方便,可以采取使用嵌套数组的方法。

代码例子:
  1. Sub test1()
  2.     Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组
  3.    
  4.     For i = 1 To 3
  5.         For j = 1 To 5
  6.             For k = 1 To 10
  7.                 m = m + 1
  8.                 arr(i, j, k) = m
  9.             Next
  10.         Next
  11.     Next
  12.     '以上为三维数组赋值

  13. '    Cells.Clear
  14.     For i = 1 To 3
  15.         For j = 1 To 5
  16.             For k = 1 To 10
  17.                 Cells((i - 1) * 6 + 1 + j, k) = arr(i, j, k) '循环逐个输出
  18.             Next
  19.         Next
  20.     Next
  21. End Sub

  22. Sub test2()
  23.     Dim arr(1 To 3, 1 To 5, 1 To 10) '定义多维数组arr
  24.     
  25.     For i = 1 To 3
  26.         For j = 1 To 5
  27.             For k = 1 To 10
  28.                 m = m + 1
  29.                 arr(i, j, k) = m
  30.             Next
  31.         Next
  32.     Next
  33.     '以上为三维数组赋值

  34. '    Cells.Clear
  35.     Dim brr(1 To 5, 1 To 10) '定义一个输出用的临时二维数组brr
  36.     For i = 1 To 3
  37. '        Erase brr
  38.         For j = 1 To 5
  39.             For k = 1 To 10
  40.                 brr(j, k) = arr(i, j, k) '把三维数组中内容转移到临时二维数组中
  41.             Next
  42.         Next
  43.         [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = brr '多阶段一次性输出结果到工作表
  44.     Next
  45. End Sub


  46. Sub test3()
  47.     Dim crr(1 To 3) '定义嵌套数组
  48.     Dim trr(1 To 5, 1 To 10) '定义可输出结果的二维数组
  49.     For i = 1 To 3
  50.         crr(i) = trr '完成嵌套数组的定义
  51.     Next
  52.    
  53.     For i = 1 To 3
  54.         For j = 1 To 5
  55.             For k = 1 To 10
  56.                 n = n + 1
  57.                 crr(i)(j, k) = n
  58.             Next
  59.         Next
  60.     Next
  61.     '以上为嵌套数组赋值 实际用法和三维数组也很类似的

  62. '    Cells.Clear
  63.     For i = 1 To 3
  64.         [a1].Offset((i - 1) * 6 + 1).Resize(5, 10) = crr(i)
  65.         '这样就可以把嵌套的二维数组部分内容直接输出了。
  66.     Next
  67. End Sub
复制代码
呵呵。
回复

使用道具 举报

发表于 2014-6-27 15:19 | 显示全部楼层
显然嵌套数组的方法最好。

推荐楼主今后就这么用吧。没必要使用三维数组的。

回复

使用道具 举报

发表于 2016-9-6 22:13 | 显示全部楼层
本帖最后由 laoau138 于 2016-9-6 22:14 编辑
香川群子 发表于 2014-6-27 15:10
答案不是早就明确了……

① 除了一维数组和二维数组以外,都不能直接把数组内容直接输出到工作表单元格 ...

解析好专业,你可以去写书,准备发行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 13:15 , Processed in 0.293682 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表