Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: idnoidno

[已解决]請教用數組方式要怎樣處理

[复制链接]
发表于 2017-4-23 09:38 | 显示全部楼层    本楼为最佳答案   
  1. Sub CalSum()
  2. Dim i, j As Integer, arr, brr, crr(), drr()
  3.     With Sheets("統計表")
  4.         .Activate
  5.         .Range("n1:n" & Rows.Count).ClearContents
  6.         .Cells(1, 14) = "合計"
  7.         arr = .Range("D6:M" & Cells(Rows.Count, 3).End(xlUp).Row)
  8.         brr = .Range("D2:M3")
  9.     End With
  10.     ReDim crr(1 To UBound(arr), 1 To 10)
  11.     ReDim drr(1 To UBound(arr))
  12.     For i = 1 To UBound(arr)
  13.         For j = 1 To 10
  14.             If arr(i, j) > brr(2, j) * 0.8 Then
  15.                 crr(i, j) = arr(i, 1) * brr(1, j)
  16.             ElseIf arr(i, j) > brr(2, j) * 0.6 And arr(i, j) <= brr(2, j) * 0.8 Then
  17.                 crr(i, j) = arr(i, 1) * brr(1, j) * 0.8
  18.             ElseIf arr(i, j) > brr(2, 1) * 0.4 And arr(i, j) <= brr(2, j) * 0.6 Then
  19.                 crr(i, j) = arr(i, 1) * brr(1, j) * 0.6
  20.             ElseIf arr(i, j) > brr(2, 1) * 0.3 And arr(i, j) <= brr(2, j) * 0.4 Then
  21.                 crr(i, j) = arr(i, 1) * brr(1, j) * 0.4
  22.             ElseIf arr(i, j) <= brr(2, 1) * 0.3 Then
  23.                 crr(i, j) = arr(i, j) * brr(1, j) * 0.15
  24.             End If
  25.             drr(i) = drr(i) + crr(i, j)
  26.         Next j
  27.     Next i
  28.     With Sheets("統計表")
  29.         .[n6].Resize(UBound(drr)) = Application.Transpose(drr)
  30.     End With
  31. End Sub
复制代码

注释没写
由于没指定小于10%时应该如何处理,把条件“10%≦儲存格≦30%”改成“儲存格≦30%”了,请自行修正
清测试
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2017-4-23 19:45 | 显示全部楼层
感謝您的回覆,執行了您的ˋ代碼,可以解決,只是可以就教您一些語法上的問題嗎
回复

使用道具 举报

发表于 2017-4-23 22:46 | 显示全部楼层
idnoidno 发表于 2017-4-23 19:45
感謝您的回覆,執行了您的ˋ代碼,可以解決,只是可以就教您一些語法上的問題嗎

很基本的一个原则是尽量不要去直接操作单元格,这是vba速度能占优的原因之一。
语法没啥啊,挺简单的循环嵌套,重要的是实现功能的思路,
两个数组分别存放数据(arr)和基准(brr),再定义一个数组(crr)做中转,只要arr和brr的大小(行和列)确定了,crr才能确定(本题就是arr的行和列)。最终结果也是先放在一个数组(drr)里,drr就是arr的行数数量的一维数组,因为结果是只有一列。所以循环前就能确定crr和drr(用redim)
每比较一个元素就存进drr里,每比较完一行,就能得到drr的一个元素,循环完成后就是把drr转置后输出到单元格得到最终结果。
回复

使用道具 举报

 楼主| 发表于 2017-4-24 21:55 | 显示全部楼层
本帖最后由 idnoidno 于 2017-4-24 21:58 编辑

樓上的大大,謝謝您的回復與指導,經您一說,觀念又有增進了
特別是您提到的思路,我想這是學習過程中很重要得一個關鍵課題
希望有機會可以多跟您請教
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 21:36 , Processed in 0.210598 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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