Daily Averages 2
Revision as of 11:30, 1 August 2008 by 137.229.71.165 (talk)
Copy and paste the text in the box into the visual basic editor that comes with Excel. To get access to personal.xls in the visual basic editor check out this article: Save Macros in Excel
This macro and collection of subroutines creates daily averages from hourly data. It's a pretty general one. I used it originally with soil temperature strings where there are several columns of data that need to be changed from hourly to daily. So, there are a couple flags to assist with this. You can report the day if you'd like and also the number of samples in the 'daily' average for example. The first subroutine you can use to call the second one which does all the work for you.
Any questions check with Bob.
Option Explicit
Public Sub daily_avg()
Dim daycol As Integer
Dim inputcol As Integer
Dim outcol As Integer
Dim worksheetz As Integer
Dim startrow As Long
Dim outputday As Boolean
Dim outputcount As Boolean
Dim columnincr As Integer
' stuff that should be set just initially
daycol = 1
worksheetz = 9
startrow = 32
outputcount = False
outputday = True
inputcol = 3
outcol = 16
Call avg_column(daycol, inputcol, outcol, worksheetz, startrow, outputday, outputcount)
outputday = False
For columnincr = 0 To 10
inputcol = 4 + columnincr
outcol = 18 + columnincr
Call avg_column(daycol, inputcol, outcol, worksheetz, startrow, outputday, outputcount)
Next
End Sub
Public Sub avg_column(daycol As Integer, inputcol As Integer, outcol As Integer, worksheetz As Integer, startrow As Long, outputday As Boolean, outputcount As Boolean)
Dim row As Long
Dim count As Integer
Dim theday As Integer
Dim curdata As Double
Dim daysum As Double
Dim outrow As Integer
outrow = startrow
row = startrow
theday = Int(Worksheets(worksheetz).Cells(row, daycol).Value)
curdata = Worksheets(worksheetz).Cells(row, inputcol).Value
If Abs(curdata) < 6999 Then
daysum = curdata
count = 1
End If
row = row + 1
Do While Worksheets(worksheetz).Cells(row, daycol).Value <> ""
If theday = Int(Worksheets(worksheetz).Cells(row, daycol).Value) Then
' same day
curdata = Worksheets(worksheetz).Cells(row, inputcol).Value
If Abs(curdata) < 6999 Then
daysum = daysum + curdata
count = count + 1
End If
Else:
' new day, do some outputting
If outputday = True Then
' output the day
Worksheets(worksheetz).Cells(outrow, outcol).Value = theday
If count > 0 Then
' output daily average
Worksheets(worksheetz).Cells(outrow, outcol + 1).Value = daysum / count
End If
If outputcount = True Then
' output the count if the boolean is true
Worksheets(worksheetz).Cells(outrow, outcol + 2).Value = count
End If
Else:
' don't output the day
If count > 0 Then
' output daily average
Worksheets(worksheetz).Cells(outrow, outcol).Value = daysum / count
End If
If outputcount = True Then
' output the count if the boolean is true
Worksheets(worksheetz).Cells(outrow, outcol + 1).Value = count
End If
End If
outrow = outrow + 1
' okay, done outputting. Now to ingest the new data as before.
' first reset the vars.
count = 0
daysum = 0
theday = Int(Worksheets(worksheetz).Cells(row, daycol).Value)
curdata = Worksheets(worksheetz).Cells(row, inputcol).Value
If Abs(curdata) < 6999 Then
daysum = curdata
count = 1
End If
End If
row = row + 1
Loop
' drop in the stuff for the last day of year.
' new day, do some outputting
If outputday = True Then
' output the day
Worksheets(worksheetz).Cells(outrow, outcol).Value = theday
If count > 0 Then
' output daily average
Worksheets(worksheetz).Cells(outrow, outcol + 1).Value = daysum / count
End If
If outputcount = True Then
' output the count if the boolean is true
Worksheets(worksheetz).Cells(outrow, outcol + 2).Value = count
End If
Else:
' don't output the day
If count > 0 Then
' output daily average
Worksheets(worksheetz).Cells(outrow, outcol).Value = daysum / count
End If
If outputcount = True Then
' output the count if the boolean is true
Worksheets(worksheetz).Cells(outrow, outcol + 1).Value = count
End If
End If
End Sub