Excel精英培训网

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

[已解决]學習數組(array),就教!

[复制链接]
发表于 2017-4-15 15:04 | 显示全部楼层 |阅读模式
T
100
20
30
1
1
1
150
2
2
2
3
3
3
5
3
4
12
3
5
18
3
6
25
3
7
1
5
8
2
12
9
3
18
10
5
25
11
12
25
12
18
25
13
25
25
14
2
25
15
2
25
16
2
25
17

算法:甲乙丙丁......的每一列都乘上固定第一列(b2*$b$1+c2*$c$1+d2*$d$1),加總寫入e2,類推.......
假如要用數組方式,把甲 e2、乙e3、丙e3.........結果寫進新的工作表,可否賜教,謝謝
最佳答案
2017-4-15 15:09
先把E列清空一下。
  1. Sub aaa()
  2. Dim arr, i&, j&, n&
  3. arr = [a1].CurrentRegion
  4. ReDim Preserve arr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
  5. For i = 2 To UBound(arr)
  6.   For j = 2 To UBound(arr, 2) - 1
  7.     n = n + arr(i, j) * arr(1, j)
  8.   Next j
  9.   arr(i, UBound(arr, 2)) = n
  10.   n = 0
  11. Next i
  12. [e1].Resize(UBound(arr)) = Application.Index(arr, , UBound(arr, 2))
  13. End Sub
复制代码
发表于 2017-4-15 15:09 | 显示全部楼层    本楼为最佳答案   
先把E列清空一下。
  1. Sub aaa()
  2. Dim arr, i&, j&, n&
  3. arr = [a1].CurrentRegion
  4. ReDim Preserve arr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
  5. For i = 2 To UBound(arr)
  6.   For j = 2 To UBound(arr, 2) - 1
  7.     n = n + arr(i, j) * arr(1, j)
  8.   Next j
  9.   arr(i, UBound(arr, 2)) = n
  10.   n = 0
  11. Next i
  12. [e1].Resize(UBound(arr)) = Application.Index(arr, , UBound(arr, 2))
  13. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-4-15 20:21 | 显示全部楼层
大灰狼1976大大
先感謝,小弟鑽研一下您的資料
不知道可以私訊請教嗎
回复

使用道具 举报

发表于 2017-4-15 20:27 | 显示全部楼层
可以,现在我有时间
回复

使用道具 举报

 楼主| 发表于 2017-4-15 20:37 | 显示全部楼层
本帖最后由 idnoidno 于 2017-4-15 22:43 编辑

請問,我使用的是繁體,若是語意上與您使用有差別,請多包涵
第一、arr中,您的第二個參數,UBound(arr, 2) + 1,理由?
第二、到loop中,您的j反而是UBound(arr, 2) - 1
第三、n=0的位置,可以在其他地方,直覺好像可以擺在09之前?第四、[e1].Resize(UBound(arr)) = Application.Index(arr, , UBound(arr, 2))。可否請解釋一下。
以上問題,等待您指導,謝謝
回复

使用道具 举报

发表于 2017-4-16 09:42 | 显示全部楼层
本帖最后由 大灰狼1976 于 2017-4-16 09:46 编辑

1、E列是结果输出列,我让你清空(当然自动也行)后,数据区域只有4列,但我要5列的数组(通俗说法),所有第二维下标必须+1,不然出错,如果没清空E列时可能不影响运行,但不严谨;
2、由于1的原因,数组最后一列是空的,数据只到倒数第二列结束,所以反而-1;
3、09要用到n的值,用完后归0,所以不能放在09行前,不然结果会得到一串0,你的直觉是错的;
4、就说下application.index吧,它可以输出二维数组的一行或一列,我用来输出E列结果,不会影响其他列。如果全数组输出也可以,但是如果原数据中有公式的话就全转换成值了。
回复

使用道具 举报

发表于 2017-4-16 12:31 | 显示全部楼层
ub aaa()
Dim arr, i&, j&, n&
arr = [a1].CurrentRegion
ReDim Preserve arr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
For i = 2 To UBound(arr)
  For j = 2 To UBound(arr, 2) - 1
    n = n + arr(i, j) * arr(1, j)
  Next j
  arr(i, UBound(arr, 2)) = n
  n = 0
Next i
[e1].Resize(UBound(arr)) = Application.Index(arr, , UBound(arr, 2))
End Sub



牛人
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:45 , Processed in 0.248246 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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