2017-05-14 2 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 :

    나는 예로서이

  • ,451,515,
  • tbTrkGalsPurch1 = 100.000

  • tbTrkGalsPurch2 = 93.000
  • tbTrkGalsPurch3 = 0.000
  • tbTrkGalsPurch4 = 0.000
  • tbTrkGalsPurch5 = 0.000
  • tbTrkGalsPurch6 = '정보를 바탕으로 0.000

이상 만 첫 번째 2 개 항목 (tbAdjCostPerGal)이 추가되고 항목 3-6이 0 값으로 끝나기 때문에 평균화됩니다. 1 갤런 당 평균 2.364 달러의 최종 결과.

요약하면, 나는 합계와 평균이 모두 tbAdjCostPerGal.text > 0 일 필요가 있습니다. 나는 내가 단지 tbAdjCostPerGal 항목을 평균한다면 이것은 내가 찾고있는 대답을 줄 것이라고 믿는다. 레코드 당 항상 6 개의 항목이 있습니다.

tbAdjCostPerGal 항목을 살펴볼 변수를 만드는 방법이 필요하다는 것을 알고 있으며, 0보다 큰 값을 가진 항목 만 합산하여 지식이 부족한 곳입니다. 누군가가이 포맷의 적절한 형식으로 나를 도울 수 있습니까?

+1

0은 합법적 인 가치입니다. 왜 그것이 작동하지 않습니까? – Plutonix

+1

평균 연료 가격 인 것 같습니다. 나는 연료 가격이 0.0 달러라고 추측하고 있는데, 연료 가격이 아니라 연료 가격이 무료라는 것을 의미합니다. (나는 그 연료로 가득 차서 가야합니까?) 따라서 평균 연료비를 계산할 경우 $ 0 값을 제외하고 싶습니다. 이 경우 더 나은 "기록 된 가격 없음"세마포어를 사용해야합니다 (SHOULD). 하지만 우리는 $ 0.0 세마포어로 작업해야합니다. – David

답변

1

총 가격을 갤런 수로 나눠야한다고 생각합니다. 예를 들어

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 값을 필터링 :

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이 값의 수로 합을 분할 할 수있다 :

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

당신의 추측은 정확할 것입니다. 예, 0.000 또는 0.000 달러는 해당 라인에서 가격이나 연료를 구입하지 않았 음을 의미합니다. 그렇지 않으면, 당신처럼, 나는 매일 거기에서 연료를 구입할 것입니다! 기본값은 항상 0이지만 나눌 수 없기 때문에 분배자는 항상 6이되고 그 곳에서 실패합니다. 값이 0보다 큰 숫자로 나누기 만하면됩니다. –

+0

이것은 한 가지 예외로도 잘 작동합니다 ... 레코드 구매시 연료가 전혀 없으면 코드가 충돌합니다 ... 제로 오류로 나누십시오. 그러므로 계산을하기 전에 어떤 것이 있는지 확인하기 위해 수표로 작업해야합니다. 나는 try 문장을 추가하려고 시도했다 : af1> 0이면 ....하지만 차이점이 없으며 여전히 0으로 나누기 오류가 발생한다. –

+0

@JohnEtling 따라서 나누기 전에 제수가 0인지 확인하십시오. – Slai