Excel精英培训网

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

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

[复制链接]
发表于 2017-4-22 18:18 | 显示全部楼层 |阅读模式
本帖最后由 idnoidno 于 2017-4-24 22:39 编辑

附件是工作表數據

條件
第六列後,每一列的每一個儲存格(D:M)都和同一欄的相對應儲存格(D3:M3)做下列比較,EX:D6介於D3的60%~80@之間,D6的費率就是打八折,
所以,D6*D2(費率)*0.8,每一列的儲存格都依循這樣判斷,然後統計每一列小計{(D2:M2*D6:M6))到最右一欄,再將所有小計再總計到最下一列
D6*D2+E6*E2+F6*F2+G6*G2+H6*H2+I6*I2+J6*J2+K6*K2+L6*L2+M6*M2=N6
D6….M6依據表格的級距各乘上對應的百分比
類推
N6+N7+…………………………………………………………………………………………………..=N225

希望文字表達,路過的高手可以明白

  
10%≦儲存格≦30%
  
原始費額×15%
30%<儲存格≦40%
原始費額×40%
40%<儲存格≦60%
原始費額×60%
60%<儲存格≦80%
原始費額×80%
儲存格>80%
原始費額×100%


小弟自己的語法,但是好像不太對,望請指點

Sub CalSum()
Dim irow, jcol, i, j As Integer
Dim ts1, ts2, ts3, ts4, ts5, ts6 As Long

Worksheets("統計表").Range("a1").Select
irow = ActiveCell(Rows.Count, 1).End(xlUp).Row
jcol = ActiveCell(1, Columns.Count).End(xlToLeft).Column
Worksheets("統計表").Cells(1, jcol + 1) = "合計"
For i = 6 To irow
Cells(i, jcol + 1) = 0
ts1 = 0
ts2 = 0
ts3 = 0
ts4 = 0
ts5 = 0
ts6 = 0

   For j = 4 To jcol
            If Cells(i, j) >= Cells(3, j) * 0.8 Then
            ts1 = ts1 + Cells(i, j) * Cells(2, j)
        ElseIf Cells(i, j) >= Cells(3, j) * 0.6 Then
            ts2 = ts2 + Cells(i, j) * Cells(2, j) * 0.8
        ElseIf Cells(i, j) >= Cells(3, j) * 0.4 Then
            ts3 = ts3 + Cells(i, j) * Cells(2, j) * 0.6
        ElseIf Cells(i, j) >= Cells(3, j) * 0.3 Then
            ts4 = ts4 + Cells(i, j) * Cells(2, j) * 0.4
        ElseIf Cells(i, j) >= Cells(3, j) * 0.1 Then
            ts5 = ts5 + Cells(i, j) * Cells(2, j) * 0.15
        Else
            ts6 = ts6 + Cells(i, j) * 0
    End If
  Next j
    Cells(i, jcol + 1) = ts1 + ts2 + ts3 + ts4 + ts5 + ts6    Cells(irow + 1, jcol + 1) = Cells(irow + 1, jcol + 1) + Cells(i, jcol + 1)
Next i
End Sub







最佳答案
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%”了,请自行修正
清测试

TESTVBA2.rar

22.58 KB, 下载次数: 8

发表于 2017-4-22 19:29 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2017-4-22 20:18 | 显示全部楼层
回复

使用道具 举报

发表于 2017-4-22 21:53 | 显示全部楼层
看不懂
回复

使用道具 举报

发表于 2017-4-22 22:04 | 显示全部楼层
本帖最后由 大灰狼1976 于 2017-4-22 22:38 编辑

刚才的说明错误,不是if用法造成的,我有时间再看看
回复

使用道具 举报

 楼主| 发表于 2017-4-22 22:37 | 显示全部楼层
謝謝,剛剛把自己的代碼執行後,真如你說的,IF從頭到尾跑,我的小筆電,一執行就卡住,要一分鐘後才會還我控制,謝謝您的指導,我試試用SELECT CASE(學習)
回复

使用道具 举报

发表于 2017-4-22 22:43 | 显示全部楼层
idnoidno 发表于 2017-4-22 22:37
謝謝,剛剛把自己的代碼執行後,真如你說的,IF從頭到尾跑,我的小筆電,一執行就卡住,要一分鐘後才會還我 ...

不对,是我误导了,仔细看了IF和SELECT CASE的说明,并打开电脑作了测试,确定用法是没有问题的,刚才的错误说明非常抱歉!
选择用IF还是SELECT CASE基本只是方式不同而已。
你的问题可能是逻辑造成的,我下载附件后看一下吧。
回复

使用道具 举报

发表于 2017-4-22 22:57 | 显示全部楼层
根据你的说明,D6原来不是10,而是一个介于D3值的60%~80%之间的值,但现在D6是10,那么这个10是D2*0.8计算得到的。也就是说,你要把D6到M最后一行的数字全部改写一遍,再求和?
那么你的代码确实有问题,因为自始至终你只是取得了ts1~ts6几个变量的值,而没有对单元格数据进行任何修改。
回复

使用道具 举报

发表于 2017-4-22 23:00 | 显示全部楼层
另外,大家看不懂你说明的原因基本上是由于术语的错用:
1、你所说的列其实是行;
2、你所说的栏其实是列。
回复

使用道具 举报

 楼主| 发表于 2017-4-22 23:13 | 显示全部楼层
很慚愧,基本功沒做好,不過您懂我的意思嗎,基本上每一筆數據(共有10個水質項目)代表一個公司的水質資訊,每一個項目數值都要分別比對是不是有折扣的存在,然後再去算每一家公司的費用後,再總加,我的這樣說明會比較容ˋ易懂嗎
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 08:54 , Processed in 0.330425 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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