VBAの勉強を始めてみた

色々試しています。

ひっそりとExcel関数のおさらい(ビット演算/基数変換)

なんとなく使いそうなExcel関数のまとめシリーズです。  

目次

 

 

基数変換を行う(進数表現の変換)

 2進数を8進数に変換(BIN2OCT関数)

=BIN2OCT(2進数,[桁数])[]内は省略可能な引数

引数の2進数から、8進数に変換します。なお、引数はセル参照とすることもできます。 

f:id:kouten0430:20180121152922j:plain

 

2進数を10進数に変換(BIN2DEC関数)

=BIN2DEC(2進数)

引数の2進数から、10進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153039j:plain

 

2進数を16進数に変換(BIN2HEX関数)

=BIN2HEX(2進数,[桁数])[]内は省略可能な引数

引数の2進数から、16進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153052j:plain

 

10進数を2進数に変換(DEC2BIN関数)

=DEC2BIN(10進数,[桁数])[]内は省略可能な引数

引数の10進数から、2進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153121j:plain

 

10進数を8進数に変換(DEC2OCT関数)

=DEC2OCT(10進数,[桁数])[]内は省略可能な引数

引数の10進数から、8進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153239j:plain

 

10進数を16進数に変換(DEC2HEX関数)

=DEC2HEX(10進数,[桁数])[]内は省略可能な引数

引数の10進数から、16進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153257j:plain

 

16進数を2進数に変換(HEX2BIN関数)

=HEX2BIN("16進数",[桁数])[]内は省略可能な引数

引数の16進数から、2進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153310j:plain

 

16進数を8進数に変換(HEX2OCT関数)

=HEX2OCT("16進数",[桁数])[]内は省略可能な引数

引数の16進数から、8進数に変換します。引数は""で囲みます。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153326j:plain

 

16進数を10進数に変換(HEX2DEC関数)

=HEX2DEC("16進数")

引数の16進数から、10進数に変換します。引数は""で囲みます。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153341j:plain

 

8進数を2進数に変換(OCT2BIN関数)

=OCT2BIN(8進数,[桁数])[]内は省略可能な引数

引数の8進数から、2進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153358j:plain

 

8進数を10進数に変換(OCT2DEC関数)

=OCT2DEC(8進数)

引数の8進数から、10進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153417j:plain

 

8進数を16進数に変換(OCT2HEX関数)

=OCT2HEX(8進数,[桁数])[]内は省略可能な引数

引数の8進数から、16進数に変換します。なお、引数はセル参照とすることもできます。

f:id:kouten0430:20180121153432j:plain

 

 

ビット演算を行う

 ビット演算(AND)

=BITAND(数値1,数値2)

数値1と数値2のビット演算(AND)を行います。数値は10進数で指定します。

引数と戻り値を2進数で扱う場合は、次のようにします=DEC2BIN(BITAND(BIN2DEC(1100),BIN2DEC(1010))) 

f:id:kouten0430:20180121151255j:plain

 

ビット演算(OR)

=BITOR(数値1,数値2)

数値1と数値2のビット演算(OR)を行います。数値は10進数で指定します。

引数と戻り値を2進数で扱う場合は、次のようにします=DEC2BIN(BITOR(BIN2DEC(1100),BIN2DEC(1010))) 

f:id:kouten0430:20180121151443j:plain

 

ビット演算(XOR)

=BITXOR(数値1,数値2)

数値1と数値2のビット演算(XOR)を行います。数値は10進数で指定します。

引数と戻り値を2進数で扱う場合は、次のようにします=DEC2BIN(BITXOR(BIN2DEC(1100),BIN2DEC(1010)))

f:id:kouten0430:20180121151504j:plain

ひっそりとExcel関数のおさらい(三角関数に関するもの)

最近、自分が本当にやりたいことは何なのか自問自答してしまうことがあります。
承認欲求を満たすために何かを行うのは気が重く、自分の勉強のために何かを行うのは気が楽です。でも、他人の目を「気にしすぎない」のは単なる独りよがりにも繋がります。
その辺のバランスが難しいと思いつつも、やっぱり、せっかく何者にも縛られることのない自由なブログライフなのだから、自由にやろう、ということで今回もExcel関数についておさらいをします。


目次

 

 

角度の単位変換に必要な関数(PI関数、RADIANS関数、DEGREES関数)

まず前提として、Excel三角関数を扱う場合は、ラジアンで表された角度を引数にすることを覚えておきましょう。下表はラジアン単位と、°単位の対比です。

度(°) ラジアン
0 0
30 π/6
45 π/4
60 π/3
90 π/2
180 π
270 1.5π
360

 

例えば、cos30°をExcelで計算する場合は、=COS(30)ではなく、=COS(PI()/6)とします。
下記に三角関数を使用するうえで便利な関数を紹介します。 

PI関数
=PI() 引数はありません。
円周率(15桁まで)を取得します。

 

RADIANS関数

=RADIANS(角度)
°単位の角度を、ラジアン単位の角度に変換します。引数には°単位の角度を使用します。
この関数を使用して、=COS(PI()/6)は、=COS(RADIANS(30))とすることもできます。

 

DEGREES関数

=DEGREES(角度)
ラジアン単位の角度を、°単位の角度に変換します。引数にはラジアン単位の角度を使用します。

 

 

正弦、余弦正接を求める(SIN関数、COS関数、TAN関数)

SIN関数

=SIN(角度)
引数に指定した角度の正接を求めます。sin30°であれば、=SIN(RADIANS(30))等とします。

f:id:kouten0430:20180120165113j:plain

 

COS関数

=COS(角度)
引数に指定した角度の余弦を求めます。cos30°であれば、例えば=COS(RADIANS(30))等とします。

f:id:kouten0430:20180120165136j:plain

 

TAN関数
=TAN(角度)
引数に指定した角度の正接を求めます。tan30°であれば、例えば=TAN(RADIANS(30))等とします。

f:id:kouten0430:20180120165147j:plain

 

 

逆正弦、逆余弦、逆正接を求める(ASIN関数、ACOS関数、ATAN関数)

ASIN関数
=ASIN(数値)
正弦の値から角度を求めます。戻り値はラジアン単位なので、°単位に直すときは、=DEGREES(ASIN(数値))等とします。
例として、ASIN関数の引数にsin30°の値を使用して、戻り値が30になることを確認してみましょう。

f:id:kouten0430:20180120165246j:plain

 

ACOS関数
=ASIN(数値)
余弦の値から角度を求めます。考え方は逆正弦と同じなので省略します。

 

ATAN関数
=ATAN(数値)
正接の値から角度を求めます。考え方は逆正弦と同じなので省略します。

 

 

計算結果には誤差があることをお忘れなく

三角関数の計算には小数以下が無限に続く円周率を使用しますが、Excelで扱うことができる有効桁数は15桁までなので打切り誤差が生じてしまいます。実運用上、問題ないかもしれませんが、特にcos90°など値が「0」になるべきものが「0」にならなかったりするので注意が必要です。 

kouten0430.hatenablog.com

 

ひっそりとExcel関数のおさらい(日付/時刻に関するもの)

今回は日付/時刻に関する関数について、おさらいをします。と、同時に新たな気づき、アイデアに繋がればいいなーと思ってます。
Excel関数に関しては、既に多くのウェブサイト・書籍等で解説しつくされていますが、自分の頭を整理するためになるべく自分の言葉で書き、表現したいと思います。(結果、既存のものと似たような書きぶりになっている場合もあります・・・)

チョイスする関数は個人的に使用頻度の高いもの、今後使用しそうなもの、または単なる好みだったりするので、ご了承ください。

目次

 

 

日付、時刻を表すシリアル値とは?

シリアル値とは、1日を整数の「1」として表現し、1900年1月1日の「1」から始まり9999年12月31日の「2958465」まで続く値のことです。たとえば、2018年1月13日であればシリアル値は「43113」であり、1900年1月1日から43113日が経過していることを意味しています。1日のうちの時刻は、小数点以下の数値で表され、2018年1月13日の14時30分であればシリアル値は「43113.6041666667」となります。
このようにシリアル値で管理することによって、Excel上で日付の計算を容易に行うことができるようになっています。

 

 

現在の日付、時刻を取得する(TODAY関数、NOW関数)

TODAY関数

該当のセルに現在日付を表示する場合は=TODAY()と入力します。引数はありませんが、()が必要です。

f:id:kouten0430:20180114141014j:plain

 

NOW関数

該当のセルに現在日付と時刻を表示する場合は=NOW()と入力します。引数はありませんが、()が必要です。

f:id:kouten0430:20180114141217j:plain

 

なお、先ほども述べましたが「日付」のシリアル値は整数で、「時間」のシリアル値は小数で表されます。
関数で取得した日付・時間を「標準」書式に変更して見てみると、シリアル値がどうなっているか確認することができます。

 

・TODAY関数で取得したシリアル値

f:id:kouten0430:20180114141355j:plain

 

・NOW関数で取得したシリアル値

f:id:kouten0430:20180114141938j:plain

 

 

シリアル値から年、月、日、時、分、秒、曜日を求めて表示する(YEAR関数、MONTH関数、DAY関数、HOUR関数、MINUTE関数、SECOND関数、WEEKDAY関数)

YEAR関数
=YEAR(シリアル値)
引数のシリアル値から「年」に該当する1900~9999の範囲の整数を返します。

なお、引数はシリアル値以外に日付文字列(要するにExcelが日付と認識できる文字列"2018/1/13"など)とすることもできます。また、シリアル値・日付文字列が入ったセル参照とすることも可能です。

f:id:kouten0430:20180114142748j:plain

 

MONTH関数
=MONTH(シリアル値)
引数のシリアル値から「月」に該当する1~12の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114142916j:plain

 

DAY関数
=DAY(シリアル値)
引数のシリアル値から「日」に該当する1~31の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114142940j:plain

 

HOUR関数
=HOUR(シリアル値)
引数のシリアル値から「時」に該当する0~23の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114142955j:plain

 

MINUTE関数
=MINUTE(シリアル値)
引数のシリアル値から「分」に該当する0~59の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114143013j:plain

 

SECOND関数
=SECOND(シリアル値)
引数のシリアル値から「秒」に該当する0~59の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114143029j:plain

 

WEEKDAY関数
=WEEKDAY(シリアル値,[種類])[]内は省略可能な引数
引数のシリアル値から「曜日」に該当する1~7の範囲の整数を返します。なお、引数は日付文字列・セル参照とすることもできます。

f:id:kouten0430:20180114143106j:plain


このままでは、数値として表示されるだけなので、曜日として表示するには表示形式の変更が必要です。

表示形式のユーザー定義に「aaa」を追加し、OKします。

f:id:kouten0430:20180114143132j:plain

f:id:kouten0430:20180114143148j:plain

第2引数の種類で、始まりを何曜日にするかの指定ができますが、個人的には省略でよいかと思います。省略の場合は1(日曜)~7(土曜)になります。

 

 

2つの日付から経過年数・月数・日数を求めて表示する(DATEDIF関数)

=DATEDIF(開始日,終了日,"単位")
なお、開始日・終了日は、シリアル値・日付文字列・セル参照とすることができます。

 

・単位をYとした場合

開始日から終了日までの経過年数(月日は切り捨て)を取得します。

f:id:kouten0430:20180114144026j:plain

 

・単位をMとした場合

開始日から終了日までの経過月数(日は切り捨て)を取得します。

f:id:kouten0430:20180114144047j:plain

 

・単位をDとした場合

開始日から終了日までの経過日数を取得します。

f:id:kouten0430:20180114144127j:plain

 

・単位をYMとした場合

開始日から終了日までの1年未満の月数を取得します。

f:id:kouten0430:20180114144151j:plain

 

・単位をYDとした場合

開始日から終了日までの1年未満の日数を取得します。

f:id:kouten0430:20180114144215j:plain

 

・単位をMDとした場合

開始日から終了日までの1ヶ月未満の日数を取得します。

f:id:kouten0430:20180114144231j:plain


・YM,YD,MDの使い方の例
例えば、開始日から終了日までの経過年・月・日数を表示したい場合などは、Yで年数を取得し、YMおよびMDで1年未満の月数・日数を取得するとよいと思います。
下記画像では
A5セルに、=DATEDIF(A2,B2,"Y")
A6セルに、=DATEDIF(A2,B2,"YM")
A7セルに、=DATEDIF(A2,B2,"MD")
を入力し、経過年・月・日数を表示しています。

f:id:kouten0430:20180114144303j:plain

ひっそりとExcel関数のおさらい(SUMIFS、COUNTIFS、AVERAGEIFS)

Excelを使っていると、VBAを組むという行為そのものが非効率であるといった場合もあったりします、そういう時にはExcel関数だけで仕事の効率化が図れることもあります。また、Excel関数を覚えておくと、VBAの中でも使うことができるので便利です(ワークシート関数として組み込んであるものだけであり、すべてではない)。VBA関数では出来なかったり、名前は同じ、または似ていても処理結果が違うものもあるので上手に活用していきたいものです。
Excel関数とVBA関数は名前が同じだったり、似ていたりするものがありますが、厳密にはまったく別のものなので、その辺も機会があったら記事に纏めてみたいと思います。

チョイスする関数は私が個人的によく使用したり、好みだったりするので、ご了承ください。

目次

 

複数の条件を満たす数値を合計する(SUMIFS関数)

=SUMIFS(合計対象範囲,条件範囲1,条件1,[条件範囲2,条件2],[条件範囲3,条件3],・・・・・・)
[]内は省略可能な引数

条件1(かつ条件2、かつ条件3・・・・・・)を満たす行の合計対象範囲の数値を合計します。
ちょっと試しにやってみます。
D17セルに、支店が「東支店」で、かつ商品が「ポーション」の売り上げの合計を求めてみます。

 

D17セルに下記の数式を入力します。
=SUMIFS(D2:D15,B2:B15,"東支店",C2:C15,"ポーション")

f:id:kouten0430:20180111134433j:plain

 

これで、条件を満たす行の合計対象範囲の数値が合計されます。

f:id:kouten0430:20180111134613j:plain

 

条件には文字列以外にも、条件式(">0"など)を使うこともできます。また、条件に「文字列」や「条件式」を直接書く以外に、条件の入った「セル」を指定することもできます。
上記の例で、条件を条件の入ったセル指定にした場合は下記のようになります。
=SUMIFS(D2:D15,B2:B15,B17,C2:C15,C17)

 

複数の条件を満たすデータ数をカウントする(COUNTIFS関数)

=COUNTIFS(検索条件範囲1,検索条件1,[検索条件範囲2,検索条件2],[検索条件範囲3,検索条件3],・・・・・・)
[]内は省略可能な引数

条件1(かつ条件2、かつ条件3・・・・・・)を満たす行数をカウントします。
D17セルに、支店が「東支店」で、かつ商品が「ポーション」の数を求めてみます。

 

D17セルに下記の数式を入力します。

=COUNTIFS(B2:B15,"東支店",C2:C15,"ポーション")

f:id:kouten0430:20180111134910j:plain

 

これで、条件を満たす行の数がカウントされます。

f:id:kouten0430:20180111134927j:plain

 

また、SUMIFSと同じように、条件には文字列以外にも、条件式(">0"など)や、条件の入った「セル」を指定することもできます。

 

複数の条件を満たす数値の平均値を求める(AVERAGEIFS関数)

=AVERAGEIFS(平均対象範囲,条件範囲1,条件1,[条件範囲2,条件2],[条件範囲3,条件3],・・・・・・)
[]内は省略可能な引数

条件1(かつ条件2、かつ条件3・・・・・・)を満たす行の平均対象範囲の平均値を求めます。
D17セルに、支店が「東支店」で、かつ商品が「ポーション」の売り上げの平均値を求めてみます。

 

D17セルに下記の数式を入力します。
=AVERAGEIFS(D2:D15,B2:B15,"東支店",C2:C15,"ポーション")

f:id:kouten0430:20180111135126j:plain

 

これで、条件を満たす行の平均対象範囲の平均値が求められます。

f:id:kouten0430:20180111135141j:plain

 

また、SUMIFSと同じように、条件には文字列以外にも、条件式(">0"など)や、条件の入った「セル」を指定することもできます。

 

○○IFと○○IFSの使い分け

条件を満たすものを集計する関数として、○○IFというのもありますが、これは単一条件しか指定できません。○○IFSであれば条件2以降の引数を省略することで、単一条件での集計も可能なので、あえてIFとIFSの使い分けをする必要はないかなーと思ったりします。(IFとIFSでは引数の順序が異なり、ややこしいというのも理由のひとつ)

年始に同窓会なるものに行ってみた(雑記-9)

明けましておめでとうございます。最近、雑記ブログ化していますが、VBAの勉強もせずに正月休み中に同窓会なるものに行ったので、感想等を超手短に書きます。

 

疲れた

同級生の見た目の変化、誰が今何をしている等、目から・耳から入ってくる情報量が多すぎて、「楽しい」を遥かに通り過ぎて、疲れた。それに加えて、行く前からアレやコレや妄想しすぎたせいで、輪をかけて疲れた。

 

ヤマアラシのジレンマ?

全部が全部じゃないけど、仲良かった人が意外とそっけなかったり、逆に、仲が良くなかった人がフレンドリーだったりする不思議な現象、あれはなぁに?

 

ゲストで呼ばれる先生も大変だね

教師にとっては何千人(?)いる教え子の一部に過ぎないのだろうけど、毎年、盆正月あたりにゲストで呼ばれてるんだろうなと思うと大変だな~と思ふ。

 

期待しすぎると肩透かしを食う

全員と話すとか、全員と楽しく過ごそうとか期待して行くと400%肩透かしを食うので、軽い「情報収集」「経験値稼ぎ」くらいの気分で行けば楽しめるんじゃないかと思ふ。

 

急な無茶振りもあるよ

みんなの前で面白いスピーチを~とか、主催者の趣味でやらされる場合もあるので、それなりの心の準備が必要!

 

ドラマのような展開

はありません。

 

総評

疲れた。

投稿数を77で終わるため、ちょっと無理やり今年を振り返ってみる(雑記-8)

ちーん Ωヽ(-"-;)南無南無。。。。煩悩が256ある好天です。今年も残すところあと僅かです。
今年の投稿数が77で終われば縁起が良い感じがするので、急きょ書きますヽ(‘ ∇‘ )ノ恥ずかしながら、今年の自分を振り返ってみます。

 

環境の変化に強い自分を作る

今年は自分の知識や技術を標準的・汎用的にするといったことを念頭に置いて仕事をしました。要するに、Aという現場では使えるノウハウだけど、Bという現場では全然使えないノウハウという偏りのあるものではなく、TPOを選ばずに使える資産を自分の中に蓄積するということです。
その具体的手段のひとつとしてVBAの勉強を始めてみました。JavaScriptでもなく、Cでもなく、Pythonでもなく、VBAであるのには意味があります。過去の記事でも書きましたが、費用対効果が最も大きかったからです(自分の場合には)。これが、やり始めると結構おもしろく、基本的な部分は独学ですんなり習得できましたし、仕事もかなり効率化できました。VBAのネタのために、仕事が宝の山に見えてきたほどです(ホントに)( ー人ー)|||~~~ ナムナム

  • 達成率:80%
  • 来年は?:仕事を効率化するためのツールをもっと増やしたい(ただしツール作りに時間をかけない)
  • 課題:(VBAが本業ではないので)VBAの技術面を追求する必要があるのかわからなくなってきた。他の何かに移行するのか、VBAにとどまるのか思案中。

 

健康の増進

ジジイか?と思われそうですが、人間である以上、健康は大事です!才能やら経験値よりも健康が大事だと思い始めてます。体の調子が良いと、心の調子も良くなるし、心の調子が良いと自然に良いアイデアも生まれてきます。
とくに決まったスポーツはしていないので、TPOを選ばないウォーキングを毎日してます(やっぱりジジイ?)。ランニングだと毎日続かないので、あえてウォーキングです。ウォーキングをすると、驚くほど頭の中がクリアになるし、自律神経が整っていくのが、ありありと感じられます。
あと当たり前ですが、栄養のあるものを食べ、睡眠をきちんと取ってきたつもりデス。が、たまに睡眠時間を削って何かに没頭することがあるので、それがたまにキズです。

  • 達成率:70%
  • 来年は?:睡眠時間を削らない
  • 課題:趣味と睡眠時間をのせた天秤がたまに壊れます。定期的にメンテナンスを。

 

スキマ時間の活用

気分が乗っている時に、物事を集中して進めてしまいたくなったり、物事を途中で区切ることが自分のなかで許せなかったりする時があります。自分自身を制御不能に陥ったりするのは、人間のサガなのかも知れませんが・・・、これが原因で睡眠時間の減少につながったりもしてます。
なので、今、コレをやるのは「何時何分まで」と決めて、時間になったら強制的に終わりにし、他の時間が余ったトコロへ、分散する。ということを習慣づけるようにしました。が、本人の意識づけだけでは効力が弱く、何かしら形のある仕組みが必要と思いつつも、自分にあった方法を思いつかず現在に至る。

  • 達成率:55%
  • 来年は?:環境に大きな変化がある可能性が大。趣味を継続するならさらに時間の有効活用が必要。ムリなら極小化。
  • 課題:気分にムラがある。これを補うために何かしら形のある策が必要

 

まとまりがありませんが、この辺で終わります。ほかにも書きたいことがあった気がするけど、忘れましたヽ(‘ ∇‘ )ノ
今年は初めてブログというものをやってみました、が、本当に読んでる人がいるのかどうか、もしかしてただの独り言になっているのではないか・・・。アクセス数はもしかしたら運営のサクラなのではないか?などと、被害妄想はとどまるところを知りません。
読んでいる人がいるかどうかわかりませんけど、来年も宜しくお願いします(o・・o)/~

年度はどうして4月始まりなの?

年を越しても、3月末までは変わらない「年度」・・・。今回は、なぜか年の瀬に「年度」について、調べたり考えたりしたことをまとめてみました。ついでに、エクセルのピボットテーブルを年度単位で作るための補助的マクロを掲載しちゃいます。

目次

 

国によって違う「年度」

日本では、企業や学校など、4月1日~翌年3月31日までを一つの年度として扱うことが一般的になってますが、国によっては年度の期間が異なったりします。

公共機関における各国の「会計年度」の違いを見てみましょう。

会計年度 採用国
1月~12月 中国・韓国・フランス・ドイツなど
4月~3月 日本・イギリス・インドなど
7月~6月 フィリピン・ノルウェースウェーデンなど
10月~9月 アメリカ・ミャンマー・ハイチなど

 

日本では会計年度の期間(何月始まりにするか)を企業が自由に決められるけれど、国や地方自治体に合わせたほうが都合がいいため、企業の大半が4月始まりとしてます。

子会社が海外にある企業では、グループ内で会計年度を一緒にするため、1月始まりとしているところもあるそうですよ。

 

年度で区切るメリットはなぁに?

公共機関や企業の経営状況・収支状況を把握するためには、一定の期間を定めてその期間内の収入・支出を算出する必要がある。このために設定された期間が会計年度である。会計年度は、予算を執行するための一定期間ということもできる。会計年度が存在しない場合、予算の執行に期限がないので、決算を立てることが不可能となり、予算・決算を行うことが無意味となってしまう。会計年度は、会計上非常に重要な要素である。

引用元:Wikipedia

うーん。分かったような、分からないような感じですが、要するにどこかで区切らないと管理ができなくなってしまうということですね。例えば、20××年度に比べて、20×△年度は赤字になったとかね。

 

エイプリルフールと年度の意外な関係

日本では明治19年に現在の会計年度が始まりました。
そもそも暦年が1月から12月なのに、なんで年度は4月からにするのさ。ということでいろいろ調べてみたら、エイプリルフールと年度との意外な関連なんかが見えてきて面白いです。

会計年度が4月始まりとなった、理由は2つあるといいます。

  • 米の収穫時期に合わせた(米をお金に換え、予算編成をするのに1月では間に合わなかった)
  • 当時の先進国であるイギリスの4月始まりをならった

では、イギリスはなぜ4月始まりなの?ということで、ちょっと歴史を遡ってみます。
昔のヨーロッパは年初を3月25日としていました・・・。

  • 1752年:イギリスでグレゴリウス暦を採用し年初を3月25日から1月1日に変更。しかし、会計の区切り等々いっぺんに1月1日としてしまうと都合が悪いということで、会計期間を区切りのよい4月始まりに(←イギリスが4月始まりの理由)
  • 1564年:フランスでグレゴリウス暦を採用し年初を3月25日から1月1日に変更。しかし、それに反発した民衆が4月1日を「嘘の新年」として馬鹿騒ぎを起こす(当時は3月25日~4月1日にかけて新年のお祭りを行っていた)。馬鹿騒ぎを起こした民衆は王の逆鱗に触れ、片っ端から処刑される・・・。以後、処刑された者たちの鎮魂と、王への抗議のため、4月1日には「嘘の新年」を祝う風習が続いた・・・。

ってなことでエイプリルフールの風習が、会計年度を4月とすることに少なからず、1ミリくらいは、関連しているハズ!・・・というのは私の幼稚なこじつけです。そもそもエイプリルフールの由来は仮説ですしおすし。

 

ピボットテーブルを4月始まりの年度単位で作る

エクセル(ピボットテーブル)には4月始まりの概念がありません。なので、標準機能では4月始まりとする年度(および半期・四半期・月)のグループ分けができず、年度(半期・四半期・月)でグループ分けする際は、元データを細工するなどの一工夫が必要です。
今回のマクロを使えば、ワンクリックでピボットテーブルの元データに年度・半期・四半期・月フィールドを追加できちゃいますヽ(‘ ∇‘ )ノ
(以前、同じことをやりましたが「半期」の概念が抜けていたので、修正し再掲する形になります。以前の記事はこちら

 

マクロの使い方を簡単に説明しますね。まず、ピボットの元データとなるシートの「日付」フィールドのどこでもいいので、選択して、マクロを実行します。

f:id:kouten0430:20171230184113j:plain

 

そうしたら、自動で年度・半期・四半期・月フィールドが作成されるので、このシートを用いてピボットテーブルを作成します。

f:id:kouten0430:20171230184357j:plain

 

年度・半期・四半期・月を列にドラッグしましょう。元々あった「日付」は使わなくてもいいです。

f:id:kouten0430:20171230184549j:plain

 

こんな感じで、4月始まりの年度単位のピボットテーブルが簡単にできちゃいます。

f:id:kouten0430:20171230184734j:plain

H:Half(ハーフ)の略
Q:Quarter(クォーター)の略

 

Sub 年度半期四半期月フィールド作成()
    '日付データが入ったフィールドの1セルを選択(どれでも良い)して実行
    Dim X As Long
    Dim YS As Long
    Dim YE As Long
    
    If TypeName(ActiveCell.Value) = "Date" Then
        X = ActiveCell.Column
        YS = ActiveCell.CurrentRegion.Row
        YE = ActiveCell.CurrentRegion.Rows(ActiveCell.CurrentRegion.Rows.Count).Row

        Range(Columns(ActiveCell.Column), Columns(ActiveCell.Column + 3)).Insert xlShiftToRight, _
        xlFormatFromLeftOrAbove
    
        Cells(YS, X).Value = "年度"
        Range(Cells(YS + 1, X), Cells(YE, X)).FormulaR1C1 = _
        "=IF(RC[4]="""","""",IF(MONTH(RC[4])<=3,YEAR(RC[4])-1&""年度"",YEAR(RC[4])&""年度""))"
        
        Cells(YS, X + 1).Value = "半期"
        Range(Cells(YS + 1, X + 1), Cells(YE, X + 1)).FormulaR1C1 = _
        "=IF(RC[3]="""","""",IF(AND(MONTH(RC[3])>=4,MONTH(RC[3])<=9),""1H"",""2H""))"

        Cells(YS, X + 2).Value = "四半期"
        Range(Cells(YS + 1, X + 2), Cells(YE, X + 2)).FormulaR1C1 = _
        "=IF(RC[2]="""","""",IF(MONTH(RC[2])<=3,""4Q"",IF(MONTH(RC[2])<=6,""1Q"",IF(MONTH(RC[2])<=9,""2Q"",""3Q""))))"
    
        Cells(YS, X + 3).Value = "月"
        Range(Cells(YS + 1, X + 3), Cells(YE, X + 3)).FormulaR1C1 = _
        "=IF(RC[1]="""","""",MONTH(RC[1])&""月"")"
        
    Else
        MsgBox "日付データの入ったセルを選択して下さい"
        
    End If
End Sub

※SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら