2016-09-19 10 views
0

データが散発的に入力されたシートの週平均が必要なので、以下のコードを思いついた。これは丸めを除いて動作します。セルに丸めが表示されない

Sub Sort_em() 
Dim dhold As Date 

Dim src As Worksheet 
Dim dst As Worksheet 
Dim rowCounter As Long 
Dim ztorage() As Variant 
Dim holdDate As Date 
Dim startDate As Date 
Dim endDate As Date 
Dim rng As Range 
Dim lst As Long 
Dim holdrack As String 
Dim avehold As Single 
Dim ztorRow As Integer 
Dim ztorCol As Integer 
Dim endSrch As String 
Dim startSrch As String 
Set src = Sheets("Readings") 
Set dst = Sheets("Weekly_Avg") 


rowCounter = 2 

holdDate = src.Cells(rowCounter, 1) 
startDate = src.Cells(rowCounter, 1).Text 
startDate = Format(startDate, "d-mmm-yy") 
holdrack = src.Cells(rowCounter, 1).Text 
endDate = src.Cells(rowCounter, 1).Text 
endSrch = Format(endDate, "d-mmm-yy") 
Do While src.Cells(rowCounter, 1) <> "" 
    endDate = src.Cells(rowCounter, 1).Text 
    lst = Get_Last(1, dst.Cells) + 1 
    Do Until WeekdayName(Weekday(endDate)) = "Wednesday" Or DateDiff("d", startDate, endDate) > 7 
     endDate = DateAdd("d", 1, endDate) 
    Loop 
    endSrch = Format(endDate, "d-mmm-yy") 
    Set rng = src.UsedRange.Find(endSrch, LookIn:=xlValues, LookAt:=xlWhole) 
    Do Until Not rng Is Nothing 
     endDate = DateAdd("d", -1, endDate) 
     endSrch = Format(endDate, "d-mmm-yy") 
     Set rng = src.UsedRange.Find(endSrch, LookIn:=xlValues, LookAt:=xlWhole) 
    Loop 


    ztorage = src.Range(Cells(rowCounter, 1).Address, Cells(rng.Row, 12).Address) 
    dst.Cells(lst, 1) = ztorage(1, 1) 
    dst.Cells(lst, 2) = ztorage(1, 2) 
    For ztorCol = 3 To UBound(ztorage, 2) 
     For ztorRow = 1 To UBound(ztorage, 1) 
      avehold = avehold + ztorage(ztorRow, ztorCol) 
     Next ztorRow 

avehold "avehold" 変数が正しく小数第1位(73.8)

 avehold = Round(avehold/(ztorRow - 1), 1) 

が、セルに割り当てられたときに、丸めが無視さに丸め番号が含まれています。 (73.8000030517578)

 dst.Cells(lst, ztorCol) = avehold 

     avehold = 0 
    Next ztorCol 
    rowCounter = rowCounter + ztorRow - 1 
    If src.Cells(rowCounter, 1) = "" Then Exit Do 
    startDate = src.Cells(rowCounter, 1).Text 
    startSrch = Format(startDate, "d-mmm-yy") 

Loop 

End Sub 

私は間違っていますか?

+2

これはExcelの問題ではなく、浮動小数点表現の問題です。まともな答えと、「各コンピュータ科学者が浮動小数点演算について知っておくべきこと」についての説明は、http://stackoverflow.com/a/30954047/509840を参照してください。VBAをスクラップし、割り当てられたセルを小数点以下1桁を表示します。 – rajah9

+0

@ rajah9ありがとうございます。私は脳卒中のために長い間業界外に出ていて、ずっと忘れていました。これは非常に役に立ちました。 –

+1

迅速かつ完全な復旧を希望します。 – rajah9

答えて

0

さて、私はそれを理解しました、aveholdはダブルではなく、単一であると宣言されるべきでした。

+3

あなたはそれを把握することができてうれしいです。 VBAのラウンド関数は、通常のExcelセルのラウンド関数とまったく同じように動作しないことを指摘したいと思います。それは "偶数に丸めます"ロジックを使用します。たとえば、73.85という数字がある場合、期待どおりに73.9に丸められません。この関数は実際には73.8を返します。過去に使用した回避策の1つは、丸め前の数値に非常に小さな数値(たとえば0.000001)を追加することです。丸めを行うと、丸められます。 – DGulledge

+0

@DGulledgeはチップをありがとう、私は将来の参考のためにそれを保存します! –

関連する問題