2017-05-14 10 views
0

6つの項目の全体平均を計算しようとしています。これらのアイテムの中には、平均を計算するときにゼロになるものがあるため、その一部が再生されないものもあります。平均化は完全に私を混乱させ、これを処理するのに苦労しています。配列に基づいてAVGを計算する

マイコード私は現在、それを持っているように:

 Dim a, 
     af1, af2, af3, af4, af5, af6, 
     t7, t8, t9, t10, t11, t12 As Decimal 

     'Adjusted Fuel Cost per line 
    af1 = CDec(IIf(tbAdjCostPerGal1.Text.Trim = "", 0D, tbAdjCostPerGal1.Text.Trim)) 
    af2 = CDec(IIf(tbAdjCostPerGal2.Text.Trim = "", 0D, tbAdjCostPerGal2.Text.Trim)) 
    af3 = CDec(IIf(tbAdjCostPerGal3.Text.Trim = "", 0D, tbAdjCostPerGal3.Text.Trim)) 
    af4 = CDec(IIf(tbAdjCostPerGal4.Text.Trim = "", 0D, tbAdjCostPerGal4.Text.Trim)) 
    af5 = CDec(IIf(tbAdjCostPerGal5.Text.Trim = "", 0D, tbAdjCostPerGal5.Text.Trim)) 
    af6 = CDec(IIf(tbAdjCostPerGal6.Text.Trim = "", 0D, tbAdjCostPerGal6.Text.Trim)) 

      'Truck Gallons Purchased Related 
    t7 = CDec(IIf(tbTrkGalsPurch1.Text.Trim = "", 0D, tbTrkGalsPurch1.Text.Trim)) 
    t8 = CDec(IIf(tbTrkGalsPurch2.Text.Trim = "", 0D, tbTrkGalsPurch2.Text.Trim)) 
    t9 = CDec(IIf(tbTrkGalsPurch3.Text.Trim = "", 0D, tbTrkGalsPurch3.Text.Trim)) 
    t10 = CDec(IIf(tbTrkGalsPurch4.Text.Trim = "", 0D, tbTrkGalsPurch4.Text.Trim)) 
    t11 = CDec(IIf(tbTrkGalsPurch5.Text.Trim = "", 0D, tbTrkGalsPurch5.Text.Trim)) 
    t12 = CDec(IIf(tbTrkGalsPurch6.Text.Trim = "", 0D, tbTrkGalsPurch6.Text.Trim)) 

      'Calculate ADJUSTED Average Cost of ALL Fuel plus Fuel Card fee and any Fuel Discounts this Load 
    Try 
     If af1 > 0 Then 
      a = (af1 + af2 + af3 + af4 + af5 + af6)/(t7 + t8 + t9 + t10 + t11 + t12) 
      tbFuelCostAdj.Text = a.ToString("C3") 
     Else 
      a = 0D 
      tbFuelCostAdj.Text = a.ToString("C3") 
     End If 
    Catch ex As Exception 
     'If a calculation error occurs, show Error message box 
     Dim frm As New MeMsgCalcError(ex, "'Adjusted Cost of Fuel this Load' Calculation Error." & vbCrLf & "Lines 644-652") 
     frm.Show() 
    End Try 

これは私が平均値を取得しようとしています私のコードの関連部分です。私は例として持つ

  • tbAdjCostPerGal1 = $ 2.259
  • tbAdjCostPerGal2 = $ 2.469
  • tbAdjCostPerGal3 = $ 0.000
  • tbAdjCostPerGal4 = $ 0.000
  • tbAdjCostPerGal5 = $ 0.000
  • tbAdjCostPerGal6 = $ 0.000

  • tbTrkGalsPurch1 =上記情報に基づい100.000

  • tbTrkGalsPurch2 = 93.000
  • tbTrkGalsPurch3 = 0.000
  • tbTrkGalsPurch4 = 0.000
  • tbTrkGalsPurch5 = 0.000
  • tbTrkGalsPurch6 = 0.000

、のみアイテム3〜6は0の値で終わるので、最初の2つのエントリ(tbAdjCostPerGal)が加算されて平均化されます。 1ガロン当たりの費用は$ 2.364です。

要約すると、私は合計して平均する必要がありますtbAdjCostPerGal.text > 0tbAdjCostPerGalの項目を平均してみると、これは私が探している答えを私に与えるだろうと私は信じています。レコードごとに6つのエントリが常に存在します。

tbAdjCostPerGalのエントリを調べるための変数を作成する方法を作成する必要があることがわかります。値が0より大きい項目のみを集計しています。これは知識が不足しています。誰かがこれの適切なフォーマットで私を助けてくれますか?

+1

ゼロは正当な価値です - それはなぜ機能しませんか? – Plutonix

+1

平均燃料価格のようです。私は燃料のための$ 0.0の価格を推測しているが、燃料が無料ではなく、記録された価格がないことを意味する。 (どこでその燃料でいっぱいに行かなければならないのですか?)平均燃費を計算する場合は、実際に$ 0値を除外します。この場合、より良い「記録された価格はありません」セマフォが使用されるべきです(SHOULD)。しかし、それはないので、$ 0.0のセマフォで作業する必要があります。 – David

答えて

1

合計金額をガロン数で割った値が必要であると推測しています。例えば:

Total Price = $2.259 * 100.000 + $2.469 * 93.000 + $0.000 * 0.000 + ... = $455.517 

Average per Gallon = Total Price/# of Gallons = 455.517/(100 + 93 + ...) = 2.36019170984 

0でない値の平均のために、あなたが0でない値の数で和を分割することができる:

Dim array = { af1, af2, af3, af4, af5, af6 } 

Dim count = array.Count(Function(d) d <> 0) 

Dim average = IIF(count = 0, 0, array.Sum()/count) 

または0の値を除外し:

tbFuelCostAdj.Text = array.Where(Function(d) d <> 0).Average.ToString("C3") 
+0

あなたの推測は正しいでしょう。はい、0.000または0.000ドルは、そのラインで価格または燃料が購入されなかったことを意味します。そうでなければ、あなたのように、私は毎日燃料を購入しています!デフォルト値は常に0ですが、分周器は常に6になり、それが失敗しているためです。私は値が0より大きい数で分けることだけが必要です。 –

+0

これは1つの例外でうまくいきます...レコードが購入された燃料がない場合は、コードがクラッシュします...ゼロ誤差で除算します。だから、計算の前に何かが存在することを確認するために小切手で作業する必要があります。私はtry文の中に追加しようとしました:もしaf1> 0なら...しかし、それは差がなく、まだゼロで除算されます。 –

+0

@JohnEtling除算前に除数が0かどうかをチェックする – Slai

関連する問題