★★★★★★Access2000VBA・Excel2000VBA独学~★★★日付の列から、好きな基準で・特定の「独自期間」でグループ化し「その期間名」を出す・付ける関数式~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※関連記事
『 ★★★★★★Access2000VBA・Excel2000VBA独学~★★★日付の列から、「年度」や「月度」を出す関数式~ 』
★ はじめに
Excelで不便なのは「任意の期間の扱い=特に任意の期間のグループ化」です。
例えば「第××四半期」という表示ではなく、「4~6月」とか「7~9月」といった表示を、日付データをもとに自動的に処理してくれる機能がありません。
「1週目~3週目」とか、「20日締めの5月度~11月度の6か月間分」とか、そういったことも「簡単には」できません。ウィザードで設定することもできない(ウィザード自体が無い)ですから、当然自動的にはやれません・・・。
SQLのように、「Between 開始日 And 終了日」みたいな分かりやすい指定すらもできないです・・・。
たとえば ピボットの場合でも、任意の期間の期間のグループ化ができません。
ここでも「独自の基準日による期間のグループ化」。
できません。
どうしても、秒、分、時、日、月、年、四半期、などに分かれてしまいます。
ピボットでも「4~6月」とか「7~9月」といった表示を、自動的に行ってくれる機能がありません。
「4~6月」とか「7~9月」といった表示なら、4半期で出して「1~3、4~6、・・・」と書き換えればいいかもしれませんが、そのような期間区分ばかりじゃないのでとても困ります。
「カスタム期間指定」みたいなボタンがあるといいのですが、ありません。
Excelでは、このような処理を初心者の方でも行える機能もウィザードもありません。
不便です。
そして、何十年も放置のままです。
ワークシート関数においても、そのような処理の「専用の関数」がありません。
初心者の方が手軽に使えるやつが・・・。
これも何十年も放置のままです。
なので、自分でつくるしかありません。
でも僕のようなド素人には、とても面倒くさいです・・・。
しかし・・・
そもそも「集計するソフト」なのに、「期間」をいちいち関数やVBAで指定しないとイケナイこと自体が意味不明です。そしてそれが何十年も放置される意味が分かりません・・・。
「独自期間列の作成」みたいなメニューがあって、ワンクリックでポチっと何かを選択するだけで、やれてもいいはずなんですが・・・。
基本、独自期間の処理は、ソースの表に新しい列を作って、で、その列にて、ワークシート関数で、日付データの列をもとに、「4~6月」とか「7~9月」といった表示を生成すればのちのちが作業しやすいと思います。
そして、ワークシート関数を扱うには、方法は大きくは2つあると思います。
自作関数(ユーザー定義関数)を作るか、普通にワークシート関数で処理するか、です。
見た目的には、VBAのほうが理解しやすいです。
ワークシート関数でやるとアホみたいに長くなるので本当に理解が難しいです。
★ 自作関数(ユーザー定義関数)を作る方法
VBAで値を返す自作関数(=ユーザー定義関数)を作ると、ワークシート関数として使えます。
今回の想定ですと、例えば以下のような自作関数になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
' ' Function Kikan01(d_Day01 As Date) As String If #5/1/2015# <= d_Day01 And d_Day01 <= #6/30/2015# Then Kikan01 = "5~6月" ElseIf #7/1/2015# <= d_Day01 And d_Day01 <= #9/30/2015# Then Kikan01 = "7~9月" ElseIf #10/1/2015# <= d_Day01 And d_Day01 <= #12/31/2015# Then Kikan01 = "10~12月" ElseIf #1/1/2016# <= d_Day01 And d_Day01 <= #3/31/2016# Then Kikan01 = "1~3月" Else End If End Function ' ' |
1年間分なら、上記のような感じでいいと思いますが、数年に渡る場合なら、事前に、年度を出す列をシートのほうに作ります。月度も同じです。
年や年度、月度、はそれで出して、「4~6月」とか「7~9月」といった表示文言は、上記のコードを作り変えればOKかと思います。プログラム内容的にも、年を無視して月だけで条件分岐するようなコードに書き換えればOKだと思います。
あとは、ピボットで年度をアイテムとして使ったり、ワークシート関数でなら年度の列と「4~6月」とか「7~9月」みたいな列を結合するなどして、利用すればいいと思います。
★ 普通にワークシート関数で処理する方法
以下のように、あらかじめ、
1 2 3 4 5 6 7 8 9 10 11 |
' ' =IF(AND(B2>=DATE(2015,4,1),B2<=DATE(2015,6,30)),"4~6月","") =IF(AND(B2>=DATE(2015,7,1),B2<=DATE(2015,9,30)),"7~9月","") =IF(AND(B2>=DATE(2015,10,1),B2<=DATE(2015,12,31)),"10~12月","") =IF(AND(B2>=DATE(2016,1,1),B2<=DATE(2016,3,31)),"1~3月","") ' ' |
と書き出しておいて、
あとは、IF関数の第3引数のところ、「""」のところに、
各式を、順次、埋めていって、ネストさせればOKです。
以下のようになります。
1 2 3 4 5 |
' ' =IF(AND(B2>=DATE(2015,4,1),B2<=DATE(2015,6,30)),"4~6月",IF(AND(B2>=DATE(2015,7,1),B2<=DATE(2015,9,30)),"7~9月",IF(AND(B2>=DATE(2015,10,1),B2<=DATE(2015,12,31)),"10~12月",IF(AND(B2>=DATE(2016,1,1),B2<=DATE(2016,3,31)),"1~3月","")))) ' ' |
でも、長いので、正直、意味不明な感じになってしまいます。
僕のようなド素人にとっては気が狂いそうになります。
世界で一番有名な「表計算」のソフトのはずなのに、なんで、こんな長い式をいちいち書かなければ独自期間の処理ができないのでしょう・・・? 理解に苦しみます。
なお、年度ごとにやる=月だけを見てやる、ということなら、「月」「月度」の列を新設し、Monthで月だけ出すとか、TEXT・・・・で月度だけ出すとか、してから、IFとANDを使ったほうが式が複雑にならなくて済むかもです。
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, AccessVBA, Accessの独学, Access操作の基礎, Accesの独学, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, SQL, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化