• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL関数について)

EXCEL関数で集計表を作成する際の壁について

このQ&Aのポイント
  • 毎月、各曜日毎の集計表の作成をしていますが、第4週までと第5週までの曜日が異なり、祝日もあるため関数の組み方に困っています。
  • シートを月曜1、月曜2と名前を変更し、セルにAVERAGE関数と範囲指定するマクロを作りましたが、セル範囲無効エラーが出ます。
  • 存在するシートのみが反映される方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

>7月であれば1~31までのシートがあり、日にちをシート名にしてあります。 日ごとにシートが増えて、月ごとにファイルが増える構成でしょうか? どうしても、後から集計や分析を行うには適切でないデータの構成です。 とりあえずですが 別途、集計のシートを準備して 1行目に  日付 曜日 情報1 情報2・・・ と横方向に項目を準備 マクロで 各シートの情報が一つのシートにまとめられるようにします。 例えば Sub ボタン1_Click() Rows("2:1000").ClearContents For i = 2 To Worksheets.Count Range("A" & i).Value = Worksheets(i).Range("B1").Value'日付の情報 Range("B" & i).Value = Worksheets(i).Range("B2").Value'曜日の情報 ・・・・ Next End Sub とかを実行し見ては如何でしょうか。 出来上がったシートから集計や分析が行えると思います。 将来的には、データの入力方法から分析までを考えたシート構成に変更することをお勧めします。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 今仮に、各日毎のシートのシート名が、 1 2 3 4 ・ ・ ・ 30 31 という具合に、数字のみからなる名前となっていて、 各曜日毎のシートのシート名が、 月曜日 火曜日 ・ ・ ・ 日曜日 という具合に、シート名の最初の文字が、必ず月、火、水、木、金、土、日の内の何れかの文字であるものとします。  まず、適当な使用していないシート(ここでは仮に、そのシートは「補助」という名前のシートであるものとします)に、次の様な休日のリストを作成して下さい。(A列の休日の名称は、判り易くするためだけのものですので、必ずしも入力しなくてはならないものではありません)       A列          B列 1行目  休日の名称     年月日 2行目  元日        2011年1月1日 3行目  成人の日     2011年1月10日 4行目  建国記念の日  2011年2月11日 5行目  春分の日     2011年3月21日 6行目  昭和の日     2011年4月29日 7行目  憲法記念日    2011年5月3日 8行目  みどりの日     2011年5月4日 9行目  こどもの日     2011年5月5日 10行目  海の日       2011年7月18日 11行目  敬老の日     2011年9月19日 12行目  秋分の日     2011年9月23日 13行目  体育の日     2011年10月10日 14行目  文化の日     2011年11月3日 15行目  勤労感謝の日  2011年11月23日 16行目  天皇誕生日    2011年12月23日 17行目  社定休日1    2011年○月×日 18行目  社定休日2    2011年○月×日 19行目  社定休日3    2011年○月×日 20行目  社定休日4    2011年○月×日  上記のリストを作成する際には、次の参考URLのページを参照されると便利です。 【参考URL】  国立天文台 > 暦計算室 > 暦要項   http://eco.mtk.nao.ac.jp/koyomi/yoko/  国立天文台 > 暦計算室 > 暦要項 > 国民の祝日、日曜表 平成23年(2011)   http://eco.mtk.nao.ac.jp/koyomi/yoko/2011/rekiyou111.html  次に、補助シートのD1セルに 2011年7月 という具合に、集計を行う月を年から入力して下さい。  次に、補助シートのE1セルに次の数式を入力して下さい。 =IF(ISNUMBER($D$1),DATE(YEAR($D$1),MONTH($D$1),ROWS($1:1)),"")  次に、補助シートのF1セルに次の数式を入力して下さい。 =IF(ISNUMBER($E1),IF(OR(COUNTIF($B:$B,$E1)>0,MONTH($E1)<>MONTH($D$1),ISERROR(INDIRECT("'"&DAY($E1)&"'!A1"))),"",TEXT($E1,"aaa")),"")  次に、補助シートのG1セルに次の数式を入力して下さい。 =IF($F1="","",INDIRECT("'"&DAY($E1)&"'!A1"))  次に、補助シートのE1~G1の範囲をコピーして、補助シートのE2~G31の範囲に貼り付けて下さい。  次に、月曜日シートの「1シート~31シートの各A1セルの値」の平均値を表示させるセルに、次の数式を入力して下さい。(この数式中のA1と記されている箇所は、この数式を入力するセルのセル番号に合わせて、適時、変更した方が望ましいと思いますが、このままでも一応は正常に動作します) =SUMIF(補助!$F:$F,MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,1),補助!$G:$G)/COUNTIF(補助!$F:$F,MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,1))  次に、月曜日シートの「1シート~31シートの各A1セルの値」の平均値を表示させるセルをコピーして、火曜日シート~日曜日シートの「1シート~31シートの各A1セルの値」の平均値を表示させるセルに貼り付けて下さい。  後は、集計を行う年月に合わせて、補助シートの休日のリストと、D1セルに入力してある年月の値を、適時修正すれば、各曜日毎のA1セルの値の平均値が、自動的に計算されます。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

>各シートを「月曜1、月曜2・・・」と名前を変更し、セルに関数AVERAGE(月曜1!A1,月曜2!A1,・・・)と範囲指定するマクロを作りましたが、上にも書いた通り、毎月第4週までと第5週までの曜日が異なるため、6月の曜日に合わせたセル範囲を7月に適用させるといくつかセル範囲無効によるエラーが表示されます。(#REF!) シートの名前は「1,2,3,・・・・」とそのままにして、WEEKDAY関数やINDIRECT関数を使用して、その月の集計対象の日付を自動的に判断して対応するセルの集計をするのが簡単なように思えます。 例えば、D1セルに2010/7/1と入力してある場合、7月の第1月曜日のシートのA1セルは以下の数式で取得できます(1~5週のシートを単純に加算)。 =INDIRECT(7-MOD(WEEKDAY(D1)+4,7)&"!A1") >範囲指定したシートのうち、存在するシートのみが反映され、無いシートを無視することができれば私にとって理想なのですが、そのような方法はありますか? 上記の数式を利用すれば、同じテンプレートブックを使用して、どこかのセルにその月(あるいはその月の1日の日付)を入力すれば、対応するシートが限定されますので特定のシートを無視する心配は無用です。 ただし、ウィークデイが祝日などの場合はそれを除外する数式を入力する必要があるので、できれば祝日のシートは残しておいた方が簡便な式で対応できます。 ただし、第5週については月によってない場合もありますので、IF関数でその追記の第5週にあたる日が違う月なら加算しないという数式にする必要があります。 日付を入力するセルや集計したい曜日などのレイアウトを提示していただければ、具体的な数式が提示できると思います。