[[20251030224114]] 『シートにまたがるデータの平均を求めるマクロは』(Noz) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『シートにまたがるデータの平均を求めるマクロは』(Noz)

1月〜12月までの12枚のシートがあり、そこには日付とその日の売り上げを入力します(Aのセルには日 Bのセルにはその日の売り上げ)
そして13枚目のシートに任意の10日間の売り上げ平均を表示したいと考えています。同じ月内(同一シート)の10日間の平均を求める場合と次の月(次のシート)にまたがる10日間(たとえば10月25日から11月3日までの10日間の平均)がありますが、これを表示できるマクロを教えてください。
よろしくお願いします。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


どのへんで詰まってますか?
単純に考えれば
 1日目と10日目が同じ月か
     SUMIFS関数で1〜10日目の合計値を求めて10で割る
 ちがうなら
     SUMIFS関数で1日目の月のシートを対象に1〜10日目の合計値を求める
     SUMIFS関数で10日目の月のシートを対象に1〜10日目の合計値を求める
     上記を合算して10で割る
 分岐処理終了
 結果出力

上記のような感じで考えればよいとおもいます。
(マクロ以外だったらもっと妙案ありそうですが、思いつきませんでした。)

(もこな2) 2025/10/31(金) 08:20:35


Vstackでまとめて、用心の為sortかけてFilterで抽出後アベレージで求める
のも一案かもですね。。。(*^^*)
外してましたらお許しを。。。m(__)m
(隠居Z) 2025/10/31(金) 09:31:13

月別のシートの表を、1つの表にまとめちゃえば、
その後は難しく考えなくてもいいのでは?
年や年度も跨ぐ場合もありますよね???
(まっつわん) 2025/10/31(金) 09:53:35

 関数なら
 =LET(sday,DATEVALUE("2025/10/4"),eday,DATEVALUE("2025/10/14"),
     AVERAGE(
     FILTER('1月'!B:B,('1月'!A:A>=sday)*('1月'!A:A<=eday),""),
     FILTER('2月'!B:B,('2月'!A:A>=sday)*('2月'!A:A<=eday),""),
         ・
         ・
         ・             
     FILTER('12月'!B:B,('2月'!A:A>=sday)*('12月'!A:A<=eday),"")
    )
 )
 と、シートの分だけFILTER関数を使うとできそうです。
 2021なので便利な関数が使えないのが痛いですね。

 マクロなら地道にセルの値を拾っていけば良さそう
(´・ω・`) 2025/10/31(金) 11:04:38

 雰囲気はこんな感じですが、B列が空だと0として扱われるので、AVERAGE関数とはちょっと違います。

 Function Average10Days(sday As Date)
   Dim eday As Date
   Dim S As Double, Ccount As Double
   eday = sday + 10
   S = 0
   For m = 1 To 12
     With Worksheets(Format(m, "0月"))
        For r = 1 To 40
          If .Cells(r, 1) >= sday And .Cells(r, 1).Value <= eday Then
             S = S + .Cells(r, 2)
             count = count + 1
          End If
        Next
     End With
   Next
   Average10Days = S / count
 End Function

(´・ω・`) 2025/10/31(金) 11:25:53


4名の方ご教示ありがとうございます。当方はまだまだエクセルの奥深さについていけない初心者に毛がはえた程度のものですので、もこな2さんの「どこで詰まっているのか」という問いにすべてと言うしかありません。勉強しながらやっていきたいと思います。
(Noz) 2025/10/31(金) 11:37:45

>もこな2さんの「どこで詰まっているのか」という問いにすべてと言うしかありません。
それなら、いきなりVBAのコードを考えるのではなく、
まずは、自分が手作業ですることを箇条書きで書き上げてみてください。

質問の例:「10月25日から11月3日までの10日間の平均」
で考えてみます。

 1、平均を表示するシートに日付(いつから)と日付(いつまで)を入力する
 2、日付(いつから)と日付(いつまで)の間が何日あるか計算しておく(今回の例ではは10日)
 3、日付(いつから)、10日間を足して月末日付を超える場合、日付(いつから)から月末まで何日あるか計算しておく
 4、10日間−(日付(いつから)から月末まで何日あるか)で翌月の何日分を取ればよいか計算しておく
 5、日付(いつから)の月のシートを選択する
 6、日付(いつから)の日のセルを選択する
 7、その日から10日分のB列(売り上げ)をのセルを選択する
   ただし、日付(いつから)から10日分が月末日付を超える場合、3で計算された分の売り上げを足す
 8、日付(いつから)から10日分が月末日付を超える場合、次の月のシートを選択する
 9、日付(いつから)から10日分が月末日付を超える場合、次の月の4で計算された日数分の売り上げを足す
10、足された売り上げを2で計算された日数(今回は10日間)で割る

という感じです。
これってExcelのスキルとしては、シートの選択、セルの選択、セルの範囲を指定する
というくらいですよね。
>「初心者に毛がはえた程度」
でも可能ですよね。

そして、これら1つずつをVBAのコードで書いてみる。
2でつまづいているのなら、2の部分だけを質問してみる。
2がうまくいったら3をやってみる。
3でつまづいたら、また3の部分だけを質問してみる



という様にやってみてください。
そうすれば、自分がどこでつまづいているか明確になりますし、
まず日本語で箇条書きにするという習慣をつけてみてください。

こんなことを繰り返していると、自然とある程度できるようになりますよ。

(匿名) 2025/10/31(金) 13:51:32


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.