Excelの関数とかマクロ って、やっぱむず過ぎ
と改めて思いました。という話
--
(言いたい事)
Excelの関数とかVBAの組み込みメソッドって..
引数がむずい。
①: 引数の仕様が独特なやつがあったりする
②:読みづらい
すでに書いてある数式やコードを読んでも、実際にそこに書いてあるのはセルの座標番号が書いてあるだけだったりするので、
ぱっと見では何をやっているのかよく分からない感じで、理解がむずい
その引数が一体何を指定しているのかはパッと見では分からない
書かれている数式やコードを読んでも、
その関数をちょっと違うパターンで他で使いたいときに、どの引数をどんな値を指定すばいいのかが、引数見ただけでは予想つかないのが多くて、理解しづらい
--
Excel関数の引数がむずい例:
その1
NETWORKDAYS.INTL関数
この関数は、指定した日付期間中の「実稼働日」を計算して日数を返す。
Excelで「今月の土日祝を除いた日数」を得たかったときに調べて使った
解説ページ:
【Excel】締め切りまで実質何日? 実働日を一発で計算する方法 - 窓の杜
以下、☝️のページに書いてある内容
→ NETWORKDAYS.INTL関数を使って計算できる(結論)
↓
NETWORKDAYS.INTL関数の仕様:
週末の曜日とその日数を示すパラメーターを使用して、2 つの日付の間の稼働日数を返します。
NETWORKDAYS.INTL関数の構文:
=NETWORKDAYS.INTL( 開始日 、 終了日 、 |週末| 、 |休日| )
使い方、数式の具体例は↓こんな感じです
例):A2〜B2期間中の「稼働日数(土、日、祝日)を除いた日数」を求める場合
=NETWORKDAYS.INTL(A2,B2,,B5:B19)
https://scrapbox.io/files/696af59c34fd233f77789bf6.png
この例は、右下の「稼働日数 (セルE18)」のところで稼働日数を求めています。
↑上の例に書いた数式 の引数指定の場合、
動作は以下のようになる
A2~B2期間の日数のうちから「非稼働日を除いた日数を数値で返す。
非稼働日とする条件:
①:曜日が「土曜か日曜」なら非稼働日
②:日付がB5付近の「祝日リスト」のセル範囲内の日付のいずれかと一致するなら非稼働日
(引数の仕様)
開始日と終了日: 必ず指定します。 日数を計算する 2 つの日付を指定します。 開始日は、終了日より前の日付、同じ日付、後の日付のいずれでもかまいません。
|週末|:省略可能です。 開始日と終了日の間の稼働日数に含めない、週末の曜日を指定します。 "週末" は、週末を示す週末番号または文字列で指定します。
|休日|:省略可能です。 稼働日の予定表から除外する日付のセットです。 休日の日付は、セルの範囲またはシリアル値の配列定数として指定できます。 休日の日付またはシリアル値は、任意の順序で指定できます。
https://scrapbox.io/files/696af5a1c3aba1bc1bf65e88.png>(引数の仕様)
開始日と終了日: 必ず指定します。 日数を計算する 2 つの日付を指定します。 開始日は、終了日より前の日付、同じ日付、後の日付のいずれでもかまいません。
|週末|:省略可能です。 開始日と終了日の間の稼働日数に含めない、週末の曜日を指定します。 "週末" は、週末を示す週末番号または文字列で指定します。
|休日|:省略可能です。 稼働日の予定表から除外する日付のセットです。 休日の日付は、セルの範囲またはシリアル値の配列定数として指定できます。 休日の日付またはシリアル値は、任意の順序で指定できます。
https://scrapbox.io/files/696af5a1c3aba1bc1bf65e88.png
(言いたいこと)
仕様難しくない?
とりあえずヘルプとか解説読んでみて
ヘルプ読んでも最初よくわからなかった
特に、"数値で指定する"方の仕様
ちゃんと 読んだら理解できたけど
自分ははじめ 関数のヘルプや解説を読んでみてもあまりピンと来ず、悩みながら何回か読み直してようやく理解できました
(「週末」の引数の正解:)
週末番号
→これは下の表を見て、
「,>土日」を指定したかったら"1"。
「日月」を指定したかったら"2"。... 
って指定するって意味
https://scrapbox.io/files/696af5b19e5fbfc463447e8c.png
文字列
→ 0000011 みたいに指定
週末の文字列値は 7 文字で、文字列内の各文字は月曜日から始まる各曜日を表します。
1 は非稼働日を表し、0 は稼働日を表します。 文字列に使用できる文字は、1 および 0 のみです。 1111111 と指定すると、常に 0 が返されます。
たとえば、0000011 と指定すると土曜日と日曜日が週末になります。
これはつまり、0=稼働日、1=非稼働日 という意味で月曜~日曜のどの曜日を非稼働曜日にするかを0と1の7桁で指定する。例えば「月水金が稼働日」とする場合、→ 0101011 のように書く
ということでした
↓
まとめ
むずくね
解説とかヘルプの説明を最後までちゃんと読んだら理解できたけど、
理解するのに自分はヘルプとか解説を全部読んで、よく分からないところを何回か読み返したりして、 なんやかんやで30分くらい悩んでやっと理解できました。
悩ポイント
→web検索して調べる手間
自分は関数のヘルプの出し方(Excelの操作方法)からよく分からなかったので「ヘルプを表示する操作方法」のレベルから調べないと分からなかったり、情報を見つけるために不明点を整理して検索するにしても、関数自体の情報をWebで調べてみても「知りたいポイントについての情報自体があまり見つからずページがあまりヒットせずに、参考情報がとくに見つからなくて苦労するパターンになったりすることもありますよね。
→とりあえず検索してみて、見つかった出てきたページのなかから、知りたい情報が分かりやすく載ってそうないいページを見つけるために、いったん良さそうなページをいくつか探して、内容を読んでみる手間と時間。
どの情報だったら信用して良さそうか?とかを何となく気にしながら、参考になりそうなページを見つけるのは
けっこう大変だったりする
(なんなら、)多少時間がかかっても、毎回一応念のために、何ページか開いて読むのを癖にする くらいでいい
あるページだけ他のページと違う事が書いてあったりしないか、とか、確認するのを癖に
良い見つけたページに書かれている情報が正しい情報なのか?をいったん疑って
確認する「癖」をつける
みたいなのは
できるだけ、なんか調査のときは一応念のために他のページもいくつか開いて、他のページの情報も見てみるくらいで
他のページでも
そこに載っている内容と同じ情報が書かれているのかを
あるページだけ、他のページとは違うことが書いてある
載っていない事が違うが書かれていたりしないか、参考に)くらいのほうが良いと思うけど
実際に調べる作業をやってみると
謎を調べ確認読む必要のある文章量が多くて単純に読むのが大変、何が不明なのか調べたり、読む必要のある量が多すぎ
→引数の仕様が特殊すぎ
例えば NETWORKDAYS.INTL(A2,B2,5)とか NETWORKDAYS.INTL(A2,B2,"0000011") と書いてあるとして、
もし仕様を何も知らない人がこのコードを読んだときに、毎回皆が'5'って何? '0000011ってどういう意味?ということを疑問に思って、調べようか 繰り返されます
いわゆるマジックナンバーというやつ
あと、仕様を知らない人からすると
マジックナンバーに出会うと
余計なタスクが増えます。→「引数で指定している 5 や 0000011 は何?を確認する」というタスクが生まれる
ちょっと面倒
(タスクとして本当にやる必要があるのかは別として)何かしら アクションが必要な対応のタスクが生まれてしまう。
何かしら とは
大半は「不明だけどとりあえず今は調べなくていい」事にして終了。かと思う
でも、実際やる必要アリだったとき
以下みたいなパターンがある
誰かに何かを質問して回答をもらって、教えてもらいながら進めなきゃいけなくなる(タスク)
誰もそれについて知ってる人は居なくて
さらに他の人のところに誰だったらそれを知っていそうか(誰に相談したらよさそうですか)
から聞いて行かなくちゃいけなくなったりする。
誰に相談したらいいのか?から全然見当がつかなくてよく分からなかったりするので、知ってそうな人を教えてもらってその人に質問して…をやっていくパターン
悲しいパターンだと、周りの人に聞いてみてもそれについては誰も分からなくて、「誰だったら分かりそうか、誰に相談すればよさそうか?」聞いてみたりいけなくなったり する
その引数がそのメソッドの内部でどう使われているのかを確認するために、その人がそのメソッドの内部のコードまで見ないといけなくなったり、
---
いわゆるマジックナンバー
既存コード中に書かれているけど、そのコードが実行時の処理動作に一体どういう意味を持つのかは誰にもわからない
みたいなナンバー。
ソースのどこにも説明が無かったり、意味が分からない状態で書いてあるような、何かを表す値とか特定の文字列とか
のこと。
マジックナンバーが使用されている部分だけを見つけてもそれが何を指定しているのか不明なので、定義の意味や説明がソースのどっかにコメントとして書いて無いかを探す時間がかかったり、
値を変えると動作にどう影響するのか?を調べるために、実際にPGを実行して動作結果を検証したりする必要が出たり
コード一体どんな意味
仕様を知らない人が見たら、そのコードが作られた当初は一体どんな意味を持ってその値を指定して書いてあるのか?今書かれているこのコードは一体どんな内容を指定しているのか?が絶対分からないね
→ なので、コード中にマジックナンバーは書かないようにしましょう!という話
(マジックナンバーの話 おわり)
--