返回列表 上一主題 發帖

加權平均數VBA

加權平均數VBA

請問各位大大,如何寫出加權平均數的VBA

由於加權平均數循環計算,想要嘗試的寫,但是有很多語法不清楚,不會用特別專業只會簡單的語法使用。
想詢問以下語法在VBA要怎麼打

計算三年(365*3筆資料)的周一到周七算出一個加權平均數
1、如何抓出周一到周七數值的平均數
2、平均值在減掉原本的數算出絕對距離
3、抓出周一到周七最大值與最小值然後減去平均值
4、在VBA使用ln、Exp

回復 1# 518587


各位大大,拜託幫幫我~~

我已經寫好了!!!
但是很奇怪

可以跑但是一直出錯,也不知道是哪裡的原因

而且如果把工作表裡面的D到K欄的資料全刪掉,就完全不能跑了...

可否幫我看看到底是哪裡出問題了呢?!!!!
附件有檔案
問.rar (62.02 KB)

TOP

回復 2# 518587


    問題

為什麼每次點的答案都不一樣呢?!

TOP

回復 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

回復 4# GBKEE


  對不起,不太對!是我說明的不清楚...不好意思!!

那我說明整個流程好了!

要算出"週加權平均數"(星一到星期七)

1.先計算周一到周七的平均數=AvgOld                      (出現一個數)
2.將原本數量減掉AvgOld=Xik 加上絕對值                  (出現七個數)
3.找出週一到周七最大值減掉AvgOld=Dpk                  (出現一個數)
4.找出週一到周七最小值減掉AvgOld=Dnk (絕對值)      (出現一個數)
5.Dnk/Dpk=Ri                      (出現一個數)
6.ck=(-(Dpk^2)/ln(Ri))                      (出現一個數)
7.f=exp(-(Xik^2)/ck)                            (出現七個數)
8.W=f/f的加總                      (出現七個數)
9.AvgNew=SUMPRODUCT(W*原始數量)                               (出現一個數)
10.如果 AvgOld-AvgNew>0.1 (加上絕對值)的話 ,新的平均值就必須取代舊的,然後回到第二步重複計算到小於0.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

回復 6# GBKEE


以新算出來的加權平均取代原本的加權平均數
然後再繼續算新的加權數與數職的距離...等繼續算下去,最後又會有一個加權平均數算出來,
然後在與上次的加權數比較,誤差<0.1就停止,如果>0.1就在重複做

是這樣的意思!!!!

TOP

回復 6# GBKEE


  我最後改成這樣,但是為什麼沒有往回跑再重新計算呢?!是哪裡有錯嗎?!
請版大麻煩你幫我看看~~~~~!!!!

這是就是上一個回復的意思。

       If Abs(.Cells(1, 2) - .Cells(1, 10)) > 0.1 Then
            Cells(1, 11) = Abs(.Cells(1, 2) - .Cells(1, 10))
            Cells(1, 2) = Avg
             GoTo A
        End If


問D欄不適應該是Cells(X,4)嗎?!怎麼是Cells(X,2)呢?!

TOP

回復 6# GBKEE


不好意思,又出現了一些問題
請問一下
我將VBA程式碼貼到其他的地方無法執行,
怎麼樣才可以讓每個工作表都可以執行這段程式碼?!

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

        靜思自在 : 成功是優點的發揮,失敗是缺點的累積。
返回列表 上一主題