セル書式の"aaa"は使用上の注意をよくお読みください

問題1:時系列データから土日を除外して平均を出したい

まず、このスプレッドシートの平均Aと平均Bを見て欲しい。同じ数字が表示されている。しかし、平均Aは土日を除外したセルが対象で、平均Bはすべてのセルが対象となっている。

 

フォーミュラは以下のとおり。なぜAVERAGEIFSは期待通りの結果を返さないのか分かりますか? ちょっと考えてみてください。

 

平均A: =AVERAGEIFS(C13:C999, $A13:$A999, "<>土", $A13:$A999, "<>日")

平均B: =AVERAGE(C13:C999)

 

 

f:id:gungnir46:20210624103948p:plain

 

 

回答

A列の曜日は、実はB列を参照しており、セル書式で "aaa" としているので 表示フォーマットは曜日だが、あくまでもはシリアル値となっている。AVERAGEIFSの条件式は "<>土"となっているので問題なさそうだが、あくまでも値を見に行くのでヒットするはずがない。よって、両者ともに同じ数字を返してしまう。

 

解決方法:

 A列を泣く泣く月~日の文字にするか、CHOOSE関数を使ってセルの値を文字にするしかない。なぜなら、AFERAGEIFの条件式には条件付き書式のような形式では記述できないからです。

=CHOOSE(WEEKDAY(B13), "日", "月", "火", "水", "木","金", "土")

 

 

 

問題2: 条件付き書式で土日を赤く表示

ルールの種類を「数式を使用して、書式設定するセルを決定」にして、指定日付セルが 土日の場合は赤くしたい場合もセル書式の "aaa"は注意が必要です。

 

単純に次のように書いてしまうと、赤く表示されません。もちろん、①文字で月~日、または②CHOOSE関数で曜日列を設定すればこの書き方で問題ありません。

=OR(A18="土", A18 = "日")

 

じゃあ、どうすればいいかというと・・・TEXT関数をかませてやればいいわけです。

=OR(TEXT(A18, "aaa")="土", TEXT(A18, "aaa") = "日")

 

 

応用編 

週末だけではなく国民祝日も赤くしたい場合はどうすればいいでしょうか? 簡単な方法はVBAで関数を書いて、その中で国民祝日もチェックすればいいでしょう。

=IsHoliday(A18)

 

当然ですが、国民祝日を管理するシートも必要になります。 

 

 

Public Function IsHoliday(ParamArray pParameter() As Variant) As Boolean

    Dim iDay    As Long
    Dim sDate   As String
 
    IsHoliday = True
    sDate = pParameter(0)
    iDay = Weekday(sDate)
    If iDay = vbSunday Or iDay = vbSaturday Then Exit Function

    Dim vMatch As Variant

    On Error GoTo Unmatch
    vMatch = Application.WorksheetFunction.Match(CLng(CDate(sDate)), wksCalendar.Range("K:K"), 0)
    IsHoliday = (vMatch > 0)
    Exit Function

Unmatch:
    IsHoliday = False

End Function

 

 

 

 

 

 

 

余談:
サンプルに使ったシートは、実はあるパチンコホールでの時間帯別大当たり回数を集計したものです。14:30から16:00までの時間帯が一番出しており、夜の部はそれほどでもないということが分かります。条件書式で平均の-10%、-5%、+5%、+10%で背景色を設定すればどの曜日で回収しているのか、7が付く日は出ているのかどうなのか、新台導入した週はどうなっているのか、なんてことが分かります。