Hello, I have a worksheet that has all weekday dates in column 1 and values in column 2. I want to create a 30-day moving average based on the last (non-zero) value in the column 2. Since every month has a different amount of days, I want it to search the date that has the last value (since I don't get a chance to update it daily) and go back thirsty days from that date and give an average of all the column 2 values skipping and values that are null or zero.
Any ideas?
Thanks,
Gimi
Assume your last row is 1000
Then your average of the value in the second column for the last 30 days
would be:
=Average(Offset(B1000,0,0,-30,1))
"gimiv" wrote:
>
> Hello, I have a worksheet that has all weekday dates in column 1 and
> values in column 2. I want to create a 30-day moving average based on
> the last (non-zero) value in the column 2. Since every month has a
> different amount of days, I want it to search the date that has the
> last value (since I don't get a chance to update it daily) and go back
> thirsty days from that date and give an average of all the column 2
> values skipping and values that are null or zero.
>
> Any ideas?
>
> Thanks,
>
> Gimi
>
>
> --
> gimiv
> ------------------------------------------------------------------------
> gimiv's Profile: http://www.excelforum.com/member.php...o&userid=35726
> View this thread: http://www.excelforum.com/showthread...hreadid=558670
>
>
gimiv wrote:
> Hello, I have a worksheet that has all weekday dates in column 1 and
> values in column 2. I want to create a 30-day moving average based on
> the last (non-zero) value in the column 2. Since every month has a
> different amount of days, I want it to search the date that has the
> last value (since I don't get a chance to update it daily) and go back
> thirsty days from that date and give an average of all the column 2
> values skipping and values that are null or zero.
The solution might be a lot simpler than you might think. But your
description leaves me with several questions, so I am not sure. Does
the following paradigm work for you?
Assume your data starts in B2. The first 30 days of data are in
B2:B31, some cells of which might be zero presumably because you "did
not get a chance to update it daily". It appears that you want the
following average, entered into C31 perhaps:
=sumif(B2:B31,"<>0") / countif(B2:B31,"<>0")
If you copy that down the column, the range will automatically be a
moving 30-day period; for example, B3:B32, B4:B33, etc. Thus, it
creates a trailing simple moving average, ignoring cells with zero.
Assuming that Column B contains the data, try...
=AVERAGE(IF(ROW(B2:B1000)>=LARGE(IF(B2:B1000,ROW(B2:B1000)),30),IF(B2:B10
00,B2:B1000)))
....confirmed with CONTROL+SHIFT+ENTER, not just ENTER.
Hope this helps!
In article <gimiv.2ahr7o_1152134702.9106@excelforum-nospam.com>,
gimiv <gimiv.2ahr7o_1152134702.9106@excelforum-nospam.com> wrote:
> Hello, I have a worksheet that has all weekday dates in column 1 and
> values in column 2. I want to create a 30-day moving average based on
> the last (non-zero) value in the column 2. Since every month has a
> different amount of days, I want it to search the date that has the
> last value (since I don't get a chance to update it daily) and go back
> thirsty days from that date and give an average of all the column 2
> values skipping and values that are null or zero.
>
> Any ideas?
>
> Thanks,
>
> Gimi
joeu2...@hotmail.com wrote:
> gimiv wrote:
> > values skipping and values that are null or zero.
> [....]
> =sumif(B2:B31,"<>0") / countif(B2:B31,"<>0")
I just realized that you said skipping cells that are zero __or_null__.
In that case, you might want:
=sumif(B2:B31,"<>0") / (counta(B2:B31) - countif(B2:B31,"=0"))
However, so far none of these have worked. More specifically, My moving average formula will reside on another worksheet and should change every time I add a new row. I want to avoid a static calculation that I have to re-reference every time.
Thanks again,
Gimiv
On the sheet with the data (or elsewhere, depends on what you want), put the following:Originally Posted by gimiv
D1: Last Date
D2: =DMAX(A:B,"Date",E1:E2)
E1: Value
E2: >0
F1: Date
F2: ="<="&D2
G1: Date
G2: =">"&D2-30
H1: 30-Day Average
H2: =DAVERAGE(A:B,"Value",E1:G2)
Then, on the sheet you want to know the 30-Day Average, just reference this sheet's H2 cell.
Scott
In article <gimiv.2aj0th_1152193886.3656@excelforum-nospam.com>,
gimiv <gimiv.2aj0th_1152193886.3656@excelforum-nospam.com> wrote:
> However, so far none of these have worked.
1) Did you confirm the formula with CONTROL+SHIFT+ENTER, not just ENTER.
2) Are you receiving an error message or an incorrect result? If the
former, what type of error value are you getting?
> More specifically, My moving
> average formula will reside on another worksheet and should change
> every time I add a new row. I want to avoid a static calculation that I
> have to re-reference every time.
For this you can use a dynamic named range. Do you need help with this?
For this you can use a dynamic named range. Do you need help with this?[/QUOTE]
Inserting it into an OFFSET in your equation? yes. = ) thanks again for your help guys.
Assuming that Sheet1, Column B, starting at B2, contains the data, try
the following...
1) Define the following dynamic named range:
Insert > Name > Define
Name: Values
Refers to:
=Sheet1!$B$2:INDEX(Sheet1!$B$2:$B$65536,MATCH(9.99999999999999E+307,Sheet
1!$B$2:$B$65536))
Click Ok
Change the references accordingly.
2) Then try the following formula, which needs to be confirmed with
CONTROL+SHIFT+ENTER...
=AVERAGE(IF(ROW(Values)>=LARGE(IF(Values,ROW(Values)),30),IF(Values,Value
s)))
Hope this helps!
In article <gimiv.2ajab0_1152206103.7843@excelforum-nospam.com>,
gimiv <gimiv.2ajab0_1152206103.7843@excelforum-nospam.com> wrote:
> For this you can use a dynamic named range. Do you need help with this?
>
> Inserting it into an OFFSET in your equation? yes. = ) thanks again for
> your help guys.
Note to the OP:
If you have less than 30 values <> 0 you'll get a #NUM! error.
Biff
"Domenic" <domenic22@sympatico.ca> wrote in message
news:domenic22-DC909E.13595406072006@msnews.microsoft.com...
> Assuming that Sheet1, Column B, starting at B2, contains the data, try
> the following...
>
> 1) Define the following dynamic named range:
>
> Insert > Name > Define
>
> Name: Values
>
> Refers to:
>
> =Sheet1!$B$2:INDEX(Sheet1!$B$2:$B$65536,MATCH(9.99999999999999E+307,Sheet
> 1!$B$2:$B$65536))
>
> Click Ok
>
> Change the references accordingly.
>
> 2) Then try the following formula, which needs to be confirmed with
> CONTROL+SHIFT+ENTER...
>
> =AVERAGE(IF(ROW(Values)>=LARGE(IF(Values,ROW(Values)),30),IF(Values,Value
> s)))
>
> Hope this helps!
>
> In article <gimiv.2ajab0_1152206103.7843@excelforum-nospam.com>,
> gimiv <gimiv.2ajab0_1152206103.7843@excelforum-nospam.com> wrote:
>
>> For this you can use a dynamic named range. Do you need help with this?
>>
>> Inserting it into an OFFSET in your equation? yes. = ) thanks again for
>> your help guys.
Thanks Biff! Where do I send my cheque... <VBG>
In article <OTsslySoGHA.1248@TK2MSFTNGP05.phx.gbl>,
"Biff" <biffinpitt@comcast.net> wrote:
> Note to the OP:
>
> If you have less than 30 values <> 0 you'll get a #NUM! error.
>
> Biff
Wow, this worked perfectly. Hate to be a pain, but can you explain how you went about the logic to achieve this statement or does that just come with years and years of experience. I mean, to be able to identify the problem and match it to the right complex formula?Originally Posted by Biff
In article <gimiv.2ajl6o_1152220204.6771@excelforum-nospam.com>,
gimiv <gimiv.2ajl6o_1152220204.6771@excelforum-nospam.com> wrote:
> Wow, this worked perfectly. Hate to be a pain, but can you explain how
> you went about the logic to achieve this statement or does that just
> come with years and years of experience. I mean, to be able to identify
> the problem and match it to the right complex formula?
Basically, I watch and learn from others who are more experienced. It's
amazing what one can learn by frequenting these newsgroups, forums,
etc...
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks