返回列表 上一主題 發帖

加權平均數VBA

回復 2# 518587

試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, First_1 As String
  4.     Range("D:G") = ""
  5.     Set Rng = Range("b:b").Find(1, lookat:=xlWhole) 'B欄中尋找 週一.
  6.     First_1 = Rng.Address
  7.     Do
  8.         With Rng(1).Offset(, 1).Resize(7)
  9.             .Cells(1, 2) = Application.WorksheetFunction.Average(.Cells)
  10.             .Cells(1, 3) = "" '平均值在減掉原本的數算出絕對距離 公式??
  11.             .Cells(1, 4) = (Application.WorksheetFunction.Max(.Cells) + Application.WorksheetFunction.Min(.Cells)) - Application.WorksheetFunction.Average(.Cells)
  12.         End With
  13.         Set Rng = Range("B:B").FindNext(Rng(1)) '尋找下一個週一
  14.     Loop Until First_1 = Rng(1).Address         '下一個週一的位置=第一個週一的位置(回到第一個週一的位置)
  15. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-4-13 19:32 編輯

回復 5# 518587
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 2) As Range, i As Integer
  4.     Dim f(1 To 7), Xik(1 To 7)
  5.     Dim ii As Integer
  6.     On Error Resume Next   '程式碼有錯誤時 繼續下一行程式碼(不理會)
  7.     With ActiveSheet       '指定工作表
  8.         .Range("D:k") = ""
  9.         .Range("b:b").Cells.Replace 1, "=aaa", lookat:=xlWhole        '範圍中的儲存格值 = 1, 修改為不存在的公式,造成錯誤值
  10.         Set Rng(1) = .Range("b:b").SpecialCells(xlCellTypeFormulas, xlErrors)  '設定變數為這範圍中有錯誤值的特殊儲存格
  11.         Rng(1).Value = 1    '特殊儲存格的值恢復 = 1
  12.     End With
  13.     With Rng(1)
  14.         For i = 1 To .Areas.Count        'Areas 屬性 傳回 Areas 集合,此集合代表多重範圍中的所有範圍
  15.             With .Areas(i).Cells(1, 2).Resize(7)      '一週次數量範圍
  16.                 '.Cells(1,2) 'D欄 ** 1.先計算周一到周七的平均數 = AvgOld
  17.                 .Cells(1, 2) = Application.Average(.Cells)
  18.                 'AvgOld
  19. A:
  20.                 '.Cells(1,3) 'E欄 ** 2.將 原本數量 減掉AvgOld=Xik 加上絕對值(出現七個數)
  21.                 For ii = 1 To 7   '.Cells(ii, 1) C欄: 原本數量
  22.                     '.Cells(1,7) 'I欄 ** 6.ck=(-(Dpk^2)/ln(Ri))       (出現一個數)
  23.                     .Cells(ii, 3) = Abs(.Cells(ii, 1) - .Cells(1, 2))
  24.                     'Xik
  25.                     Xik(ii) = .Cells(ii, 3)   '
  26.                 Next
  27.         
  28.                 '.Cells(1,4) 'F欄 ** 3.找出週一到周七最大值減掉AvgOld=Dpk   (出現一個數)
  29.                 .Cells(1, 4) = Application.Max(.Cells) - .Cells(1, 2)
  30.                 'Dpk
  31.                
  32.                 '.Cells(1,5) 'G欄 ** 4.找出週一到周七最小值減掉AvgOld=Dnk (絕對值)  (出現一個數)
  33.                 .Cells(1, 5) = Abs(Application.Min(.Cells) - .Cells(1, 2))
  34.                 'Dnk
  35.                
  36.                 '.Cells(1,6) 'H欄 ** 5.Dnk/Dpk=Ri   (出現一個數)
  37.                 .Cells(1, 6) = .Cells(1, 5) / .Cells(1, 4)
  38.                 'Ri
  39.             
  40.                 '*** 到 A578 時 H578 = 1 Ln(.Cells(1, 6))=0
  41.                 '*** 分母=0 不可除 的錯誤  ***************
  42.                 '*** 接下的數字會有錯誤    ***************
  43.                 '.Cells(1,7) 'I欄 ** 6.ck=(-(Dpk^2)/ln(Ri))       (出現一個數)
  44.                 .Cells(1, 7) = -(.Cells(1, 4) ^ 2) / Application.Ln(.Cells(1, 6))
  45.                 'ck
  46.                
  47.                 '.Cells(1,8) 'J欄 ** 7.f=exp(-(Xik^2)/ck)          (出現七個數)
  48.                 For ii = 1 To 7
  49.                     .Cells(ii, 8) = Application.Evaluate("Exp(" & -(Xik(ii) ^ 2) / .Cells(1, 7) & ")")
  50.                     'f
  51.                     'VBA 不支援 工作表函數 Exp
  52.                     'Evaluate 方法 將 Microsoft Excel 名稱轉換成物件或者值。
  53.                     f(ii) = .Cells(ii, 8)
  54.                 Next
  55.         
  56.                 '.Cells(1,9) K欄 ** 8.W=f/f的加總         (出現七個數)
  57.                 For ii = 1 To 7
  58.                     .Cells(ii, 9) = f(ii) / Application.Sum(f)
  59.                     'W
  60.                 Next
  61.                 '.Cells(1,10) L欄 ** 9.AvgNew=SUMPRODUCT(W*原始數量)    (出現一個數)
  62.                 Set Rng(2) = .Cells(1, 9).Resize(7)     'W 的範圍
  63.                 .Cells(1, 10) = Application.SumProduct(Rng(2), .Cells)     'AvgNew
  64.                 '10.如果 AvgOld-AvgNew>0.1 (加上絕對值)的話 ,新的平均值就必須取代舊的,然後回到第二步重複計算到小於0.1
  65.                 'If Abs(.Cells(1, 2) - .Cells(1, 9)) > 0.1 Then GoTo A:  '回到第2步驟
  66.                 '*********?????????????????????
  67.                 '然後回到第二步重複計算到小於0.1
  68.                 '如何計算到小於0.1??
  69.                 '*******************************
  70.             End With
  71.         Next
  72.     End With
  73. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 9# 518587

沒有加 .
  1. If Abs(.Cells(1, 2) - .Cells(1, 10)) > 0.1 Then
  2.     .Cells(1, 11) = Abs(.Cells(1, 2) - .Cells(1, 10))
  3.     .Cells(1, 2) = Avg
  4.     GoTo A
  5. End If
複製代碼
問D欄不適應該是Cells(X,4)嗎?!怎麼是Cells(X,2)呢?!
  1. Set Rng(1) = .Range("b:b").SpecialCells(xlCellTypeFormulas, xlErrors)
  2.     With Rng(1) -> Range("b:b")為 B欄
  3.         For i = 1 To .Areas.Count-> For i = 1 To Rng(1).Areas.Count
  4.            With .Areas(i).Cells(1, 2).Resize(7)   ->With Rng(1).Areas(i).Cells(1, 2).Resize(7)
  5.           ' 所以    .Cells(X,1)  -> C 欄
  6.         '所以    .Cells(X,2)  -> D 欄
複製代碼
怎麼樣才可以讓每個工作表都可以執行這段程式碼?!
  1.     Sub Ex()
  2.        With ActiveSheet   '(作用中的工作表)
  3.        '這裡有指定工作表為作用中的工作表,每張工作表可以使用的
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-4-14 06:24 編輯

回復 12# 518587
要認識VBA ,程式區的主題要多看.

  1. '10.如果 AvgOld-AvgNew>0.1 (加上絕對值)的話 ,新的平均值就必須取代舊的,然後回到第二步重複計算到小於0.1
  2.                 If Abs(.Cells(1, 2) - .Cells(1, 10)) > 0.1 Then
  3.                     .Cells(1, 11) = Abs(.Cells(1, 2) - .Cells(1, 10))
  4.                     .Cells(1, 2) = Avg   'Avg的公式???
  5.                     GoTo A
  6.                 End If
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 16# 518587
6# 中有註解
  1.                '*** 到 A578 時 H578 = 1 Ln(.Cells(1, 6))=0

  2. 41.                '*** 分母=0 不可除 的錯誤  ***************

  3. 42.                '*** 接下的數字會有錯誤    ***************
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 19# 518587
  1. .Cells(1, 11) = Abs(.Cells(1, 2) - .Cells(1, 10))
  2. Debug.Print .Cells(1, 11).Address & " : " & .Cells(1, 11)  '加上這行查看.Cells(1, 11)的值
  3. GoTo A
複製代碼


Debug.Print 察看到 前段到M410 一直是>0.1
跳不出 If .Cells(1, 11) > 0.1 Then 的判斷
  1. $M$410 : 1.11185372875004
  2. $M$410 : 1.11185372875005
  3. $M$410 : 1.11185372875006
  4. $M$410 : 1.11185372875006
  5. $M$410 : 1.11185372875006
  6. $M$410 : 1.11185372875006
  7. $M$410 : 1.11185372875004
  8. $M$410 : 1.11185372875005
  9. $M$410 : 1.11185372875006
  10. $M$410 : 1.11185372875006
  11. $M$410 : 1.11185372875006
  12. $M$410 : 1.11185372875006
  13. $M$410 : 1.11185372875004
  14. $M$410 : 1.11185372875005
  15. $M$410 : 1.11185372875006
  16. $M$410 : 1.11185372875006
  17. $M$410 : 1.11185372875006
  18. $M$410 : 1.11185372875006
  19. $M$410 : 1.11185372875004
  20. $M$410 : 1.11185372875005
  21. $M$410 : 1.11185372875006
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 21# 518587
Ln(1)=0的那�堙A為什麼還可以算出值?!

程式碼開頭有   On Error Resume Next   '程式碼有錯誤時 繼續下一行程式碼(不理會)

接下有註解  '*** 到 A578 時 H578 = 1 Ln(.Cells(1, 6))=0
                '*** 分母=0 不可除 的錯誤  ***************
                '*** 接下的數字會有錯誤    ***************
                '.Cells(1,7) 'I欄 ** 6.ck=(-(Dpk^2)/ln(Ri))       (出現一個數)
                .Cells(1, 7) = -(.Cells(1, 4) ^ 2) / Application.Ln(.Cells(1, 6))
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 做該做的事是智慧,做不該做的事是愚癡。
返回列表 上一主題