ノンプログラマーがExcelで試行錯誤した話

こんにちは!釣りが趣味のデザイナー・森田です。

コロナ禍で最近はめっきり行けておらず寂しい日々を過ごしております。
釣りのゲームでもやろうかと、ブラウザゲームをたまに開いてはちょこちょこ遊んでいました。

釣ろうぜ1000! - ゲームの窓
(Flashが終了した今、ブラウザゲームもHTML5に移行されているんですね。)

それはさておき、このゲーム日付と時間、釣り場によって釣れるものが変わるんです。
図鑑を見ると、いつ釣れるか日時とレア度が確認できます。
どうせなら、レア度の高いものが釣りたいな、今日しか釣れない魚がいるのかも?図鑑をいちいち見るのは大変...

\今何が釣れるか把握できるチートシートが欲しい!/

ということで、早速Excelを立ち上げました。
この時の私のExcelレベルはというと、簡単な表計算ができるという程度の初心者。(今も)

とりあえず1000種類ある図鑑の内容を転記するところから始めようとコツコツ入力作業を行い......行い......

......あー面倒くさい!
人は効率化を求める(ラクしようと思う)生き物なんだなぁ...と実感(笑)

そこで、私が学んだExcelのテクニックをご紹介します。

【目次】

ドラッグなしで大量連続コピーする方法(オートフィル)

まず、番号の列。No.0001からNo.1000まで一気に入力したい。
右下の十字マークのドラッグコピーでもいけるけど、1000コは多いなぁ...と思っていたところ、ありました!解決方法

ノンプログラマーがExcelで試行錯誤した話_01.png

画像のように、A2のセルにNo.0001を入力し、F5キーでジャンプ機能を開きます。
参照先にコピーしたい範囲のセル(今回はA1001)を入力し、shiftキーを押しながら、OKまたはEnterを押します。
A1001まで選択状態になりました。

ノンプログラマーがExcelで試行錯誤した話_02.png

ホームタブ>フィル>連続データの作成 を開き、

ノンプログラマーがExcelで試行錯誤した話_03.png

種類:オートフィルを選択し、OKを押すと一括でコピーできます。

プルダウンの作成方法(データの入力規則)

続いて釣り場。
5種類の釣り場がありますが、一つ一つ入力するのは面倒...選択できれば簡単かも。こちらもありました!解決方法

ノンプログラマーがExcelで試行錯誤した話_04.png

データタブ>データの入力規則>データの入力規則 を開き、

ノンプログラマーがExcelで試行錯誤した話_05.png

条件の設定>入力値の種類をリスト、元の値に5種類の釣り場(太平洋側の船上,太平洋側の南の島,日本海側の船上,日本海側の岩場,森の渓流)を入力します。
プルダウンリストが作成できました。

作成したリストのセルをコピーし、ジャンプ機能でコピー範囲のセル(今回はB1001)を入力、shiftキーを押しながら、OKまたはEnterを押します。
B1001まで選択状態になったら、右クリック>貼り付けでプルダウンリストも一括コピーできました。

レア度も同様に対応。
条件の設定>入力値の種類をリスト、元の値に☆1~5(1,2,3,4,5)を入力します。
一括コピーし、レア度のプルダウンリストが作成できました。



次に日付の入力。開始日と終了日を入力します。
ここで問題になったのが、期間を判定するための材料として、ただ日付を入力しただけでは、西暦まで入ってしまい、その年しか使えないシートとなってしまうこと。
そこで、日付ではなく数値として入力し、計算しやすい情報に置き換えることにしました。例)1/1→101、9/15→915など

また、期間には年をまたぐもの(例えば、10/1~3/31などのようなものです。)があり、
この場合は、10/1~12/31と1/1~3/31という考え方をすることで、その後の判定材料に生かすことができました。

ノンプログラマーがExcelで試行錯誤した話_06.png

Excel上はこのような感じ。

ある程度入力したところで気づく。この真ん中の1231と101手入力が面倒...入力する内容は同じだし、条件で自動化できるのでは?ここで登場!IF関数です。

条件により処理を分けるIF関数

=IF(論理式,真の場合の処理,偽の場合の処理)

条件としては、
論理式 :開始日が終了日より大きい場合 E2>H2
真の場合:1231(101)を入力する 1231(101)
偽の場合:条件に該当しない場合は空欄 ""

[F2セル]
=IF(E2>H2,1231,"")
[G2セル]
=IF(E2>H2,101,"")

うおおお自動で入る(感動)

時間も同じく開始時間と終了時間を入力。

ノンプログラマーがExcelで試行錯誤した話_07.png

日付をまたぐ期間の場合も同様に、
論理式 :開始時間が終了時間より大きい場合 I2>L2
真の場合:23:59(0:00)を入力する TIME(23,59,0)/TIME(0,0,0)
偽の場合:条件に該当しない場合は空欄 ""

[J2セル]
=IF(I2>L2,TIME(23,59,0),"")
[K2セル]
=IF(I2>L2,TIME(0,0,0),"")

こちらは時間データとして扱うため、TIME関数を使っています。

時刻の形式に変換するTIME関数

=TIME(時,分,秒)
※「時」「分」「秒」には、それぞれ数字または数字を表す数式が入ります。


各数式のセルも連続コピーし、これで入力作業が効率化されました。
あとはひたすら黙々と入力。

データがそろい、いよいよ「今何が釣れる?」の判定づくりです。

現在の日時を取得できるNOW関数

ノンプログラマーがExcelで試行錯誤した話_08.png

まずは今現在の日時。自動で取得したいため「NOW関数」を使用します。A1セルに入力します。

=NOW()

日時から時間だけを抜き出す方法(INT関数)

A1のデータを細分化、日付と時間に分けます。

時間だけにする場合、考え方としては以下になります。
時間 = 日時 - 日付
=A1-INT(A1)
これをB1セルに入力します。

=INT(対象日付)
※「対象日付」で、日付となる数式またはセルを指定します。

日付を数値に変換する方法(TEXT関数/VALUE関数)

=TEXT(値,表示形式)
=VALUE(文字列)

日付は一度文字列で抽出し数値化しました。

・TEXT関数でA1のmm(月)とdd(日)を抽出 TEXT(A1,"mm")&TEXT(A1,"dd")
・VALUE関数で数値化

=VALUE(TEXT(A1,"mm")&TEXT(A1,"dd"))
これをC1セルに入力します。



これで、釣れる期間の開始日・終了日・現在の、日付と時間の比較ができるようになりました。

IF関数と組み合わせて使うAND関数・OR関数

AND(条件1,条件2,条件3,...)
※AND関数は「なおかつ」を表します。

まず、日付の判定。

条件としては、
論理式 :開始日より現在が大きく(または同じ) E4<=$C$1
     なおかつ AND
     終了日より現在が小さいとき(または同じ) $C$1<=H4
真の場合:
偽の場合:条件に該当しない場合×

=IF(AND(E4<=$C$1,$C$1<=H4),"○","×")

いい感じに判定できてる!...と思いましたが1つ問題が。
年をまたぐ期間の場合、この判定だけだと条件を満たせないことがわかりました。

そこで、年をまたぐ期間は、開始日~12/31と1/1~終了日に分け、その中で現在が該当するかを判断させました。

まず、開始日と終了日を比較し、
論理式 :開始日より終了日が大きい(または同じ)場合 E4<=H4
真の場合:先ほどの比較をする IF(AND(E4<=$C$1,$C$1<=H4),"○","×")
偽の場合:条件に該当しない場合、開始日より終了日が小さい=年をまたぐ期間のため、開始日から12/31を判定
     IF(AND(E4<=$C$1,$C$1<=F4),"○","×")

=IF(E4<=H4,IF(AND(E4<=$C$1,$C$1<=H4),"○","×"),IF(AND(E4<=$C$1,$C$1<=F4),"○","×"))

もう1つのセルに、1/1~終了日の判定もさせました。

論理式 :開始日が終了日より大きい場合=年をまたぐ期間の判定 E4>H4
真の場合:1/1から終了日を判定 IF(AND(G4<=$C$1,$C$1<=H4),"○","×")
偽の場合:そうでない場合 空欄 ""

=IF(E4>H4,IF(AND(G4<=$C$1,$C$1<=H4),"○","×"),"")

これでどちらかに現在が該当していると○になる判定が作れました。

時間の判定も同様に、
論理式 :開始時間より終了時間が大きい場合 I4<L4
真の場合:通常の比較をする IF(AND(I4<=$C$1,$C$1<=L4),"○","×")
偽の場合:そうでない場合、開始時間より終了時間が小さい=日をまたぐ期間 開始時間から23:59を判定
     IF(AND(I4<=$C$1,$C$1<=J4),"○","×")

=IF(I4<L4,IF(AND(I4<=$C$1,$C$1<=L4),"○","×"),IF(AND(I4<=$C$1,$C$1<=J4),"○","×"))

もう1つのセルに、0:00~終了時間の判定もさせました。

論理式 :開始時間が終了時間より大きい場合=日をまたぐ期間の判定 I4>L4
真の場合:0:00から終了日を判定 IF(AND(K4<=$C$1,$C$1<=L4),"○","×")
偽の場合:そうでない場合 空欄 ""

=IF(I4>L4,IF(AND(K4<=$C$1,$C$1<=L4),"○","×"),"")

ノンプログラマーがExcelで試行錯誤した話_09.png

これで、条件の素材がそろったので、あとは日付と時間で判定させます。

OR(条件1,条件2,条件3,...)
※OR関数は「または」を表します。

日付判定1が○または日付判定2が○の場合 なおかつ 時刻判定1が○または時刻判定2が○の場合は◎、そうでない場合×。の条件にします。

論理式 :日付判定1が○ または 日付判定2が○の場合 OR(M4="○",N4="○")
     なおかつ AND
     時刻判定1が○ または 時刻判定2が○の場合 OR(O4="○",P4="○")
真の場合:
偽の場合:条件に該当しない場合 ×

=IF(AND(OR(M4="○",N4="○"),OR(O4="○",P4="○")),"◎","×")

ノンプログラマーがExcelで試行錯誤した話_10.png

これで今釣れるものの判定ができました!
あとは各数式を一括コピーし、フィルターをかければ、今釣れるレア度☆5の釣り場がどこかを複合的に確認できます。



その他追加機能として、終了までの日数や、開始までの日数、釣れる期間日数、釣れる期間時間、現在からのタイムリミットなども確認できるようにしました。

まずは、開催期間の終了/開始まであと何日かの算出です。
日数を計算するためには、一旦取っ払った西暦を戻す必要があり、かつその年以外でも使えるシートとして変動するものを考えました。

日付から年を取り出すYEAR関数

=YEAR(日付)
※日付をシリアル値または文字列で指定します。

開始日の変換年の条件としては、
論理式 :日付判定1が○ または 日付判定2が○の場合 OR(M4="○",N4="○")
真の場合:開始日より現在が大きく(または同じ)の場合、現在の年、そうでない場合 現在の年からマイナス1 IF(E4<=$C$1,YEAR(TODAY()),YEAR(TODAY())-1)
偽の場合:開始日より現在が大きく(または同じ)の場合、現在の年よりプラス1、そうでない場合 現在の年 IF(E4<=$C$1,YEAR(TODAY())+1,YEAR(TODAY()))

=IF(OR(M4="〇",N4="〇"),IF(E4<=$C$1,YEAR(TODAY()),YEAR(TODAY())-1),IF(E4<=$C$1,YEAR(TODAY())+1,YEAR(TODAY())))

終了日の変換年の条件としては、
論理式 :終了日より現在が大きい場合 H4<$C$1
真の場合:現在の年よりプラス1 YEAR(TODAY())+1
偽の場合:そうでない場合 現在の年 YEAR(TODAY())

=IF(H4<$C$1,YEAR(TODAY())+1,YEAR(TODAY()))

開始日と終了日は、E4・H4の値を参照し、日付のデータに戻すため、一旦文字列として先頭に0付きの4桁揃えを行います。

=TEXT(E4,"0###")
=TEXT(H4,"0###")

文字列を日付に変換するDATEVALUE関数

=DATEVALUE(文字列)

=DATEVALUE(TEXT(W4&X4,"0000!/00!/00"))
=DATEVALUE(TEXT(Y4&Z4,"0000!/00!/00"))

これを組み合わせて開始日・終了日を西暦付きの日付に変換ができました。

ノンプログラマーがExcelで試行錯誤した話_11.png

このデータをもとに終了まで何日かを計算します。

日付の期間を取得するDATEDIF関数

=DATEDIF(開始日,終了日,単位)

論理式 :期間内(日付判定1が○ または 日付判定2が○)の場合 OR(M4="〇",N4="〇")
真の場合:現在から終了日を計算かつプラス1* DATEDIF($A$1,W4,"d")+1
偽の場合:期間外の場合 -
*当日を含めるためにプラス1をします。

=IF(OR(M4="〇",N4="〇"),DATEDIF($A$1,W4,"d")+1,"-")

今度は開始まで何日かを計算します。

論理式 :期間外(日付判定1が× なおかつ 日付判定2が×または空欄)の場合 AND(M4="×",OR(N4="×",N4=""))
真の場合:現在から開始日を計算 DATEDIF($A$1,V4,"d")
偽の場合:期間内の場合 -

=IF(AND(M4="×",OR(N4="×",N4="")),DATEDIF($A$1,V4,"d"),"-")

これで終了まで・開始までの日数が算出できました。

次にそれぞれ何日間釣れるのか日数を出します。

西暦付きの開始日と終了日を計算かつプラス1*
*当日を含めるためにプラス1をします。

=DATEDIF(V4,W4,"d")+1

今度はそれぞれ何時間釣れるのか時間を出します。

論理式 :開始時間より終了時間が大きい場合 I4<L4
真の場合:終了時間 - 開始時間を引く L4-I4
偽の場合:そうでない場合、開始時間 - 終了時間を引く I4-L4

=IF(I4<L4,L4-I4,I4-L4)

最後に現在釣れるもので残り時間がどのくらいあるのかを算出します。

論理式 :現在釣れる場合 Q4="◎"
真の場合:期間(時間)が23:59の場合は、いつでも
     そうでない場合、現在時刻が終了時間より大きい場合は、終了時間 + (1 - 現在時刻) 
     そうでない場合、終了時間 + (0 - 現在時刻) IF(AA4=0.999305555555556,"いつでも",L4+IF($B$1>L4,1,0)-$B$1)
偽の場合:そうでない場合 -

=IF(Q4="◎",IF(AA4=0.999305555555556,"いつでも",L4+IF($B$1>L4,1,0)-$B$1),"-")

ノンプログラマーがExcelで試行錯誤した話_12.png

終了・開始までの日数、釣れる期間(日数)、釣れる期間(時間)、タイムリミットの作成ができました。



おまけに、何種類釣れたかカウントする機能もつけます。

セルの個数を数えるCOUNTA関数

=COUNTA(値1, [値2] ,...)
※セルやセル範囲に含まれる空白ではないセルの個数を返します。

名前の欄を範囲に設定
=COUNTA(D4:D1004)
これをD1に入力します。

ノンプログラマーがExcelで試行錯誤した話_13.png

これで釣った魚の名前を入力するとカウントされます。

以上で追加機能も含め完成です!!!

IF関数の式は何度も試行錯誤し最終的にこの形になりましたが、途中エラーがたくさん出てしまい、かなり苦戦しました。
おそらくもっと効率的な出し方もあると思いますが、初心者の私ではここが限界...。
それでも、IF関数の使い方がわかり、ANDやOR、IFの中にIFが入れられることもわかり、複合条件を理解することができました。

また、今回の学びを活かし、早速業務上使用しているExcel管理ファイルにも応用させ、入力を効率化させました。

ノンプログラマーな私ですが、数式を書いて試行錯誤のうえ、思い通りの結果がでるとワクワクしますね。
Excelも知れば知るほど奥が深いので、もっと使いこなせるようになりたいと思いました。それでは!

(需要はなさそうなチートシートはこちら)

お気軽にご依頼・ご相談ください

前へ

[資格取得してみました!] Microsoftの認定試験 PL-900取得体験記

次へ

[エンジニア2年目が語る]プロジェクトの進行についての振り返り