YoutubeでQuizKnockを見ていたら、
これを見ていて、
ああ、俺のラジオでもやってるビンゴと同じだーと思いつつ、
自分のラジオでは3×3でやりますが、
5×5でやるとはさすがだなと思いました。
さて、この動画を見ていて、一定期間の日付をランダムで出力するプログラミングを使っていました。
おそらく手作りだと思われます。
というわけでも、自分も作ってみようと思い立ったわけです。
その1では、歴代総理大臣の任期期間のデータをExcelでまとめるところまでをやります。
さて、歴代内閣総理大臣のデータをどこから引っ張ってこようか。
首相官邸のホームページの歴代内閣総理大臣
https://www.kantei.go.jp/jp/rekidainaikaku/index.html
これを手入力でExcelに落とし込むのは面倒だな。
ならば、ソースをコピペして、Excelのワークシート関数で加工して、必要なデータを作ります。
おいおい、ガバメントドメインのデータ使って大丈夫か?
ソースをA1セルにコピーしたところ、
A列は空白になったので、A列を削除。
A列にHTMLのデータがコピペ出来ました。
"安倍"で検索してみると、
49行
52行
などに見つかる。
49行は、<img>タグ
52行は、<h3>タグ
から始まっています。
<h3><span>第97代</span><a href="/jp/rekidainaikaku/097.html">安倍 晋三</a></h3>
こちらのデータが使いやすそうでした。
次の行に、元号何年何月何日~元号何年何月何日というレンジ、
更に2行下に、在職日数が書かれていました。
これが決めてかな?
<h3>タグを抜き出すために、
B2セルに、
=LEFT(A2,4)="<h3>"
として、必要なだけ下にコピペします。
<h3>タグで始まる行だけを集めたいので、
D1セルに、
行番号
D2セルに、
=MATCH(TRUE,B:B,0)
としてみると、52が返ってきました。
D3セルは、
=MATCH(TRUE,INDIRECT("B"&D2+1&":B"&D2+100),0)+D2
として、D98までコピペします。
E1セルに、
データ1
E2セルに、
=INDEX($A:$A,$D2)
として、E98までコピペします。
漏れなくぶっこぬけているようです。
続いて、
F1セルに、
データ2
F2セルに、
=INDEX($A:$A,$D2+1)
として、F98までコピペします。
ざっと見る限り、うまく行ってそう。
実は、一部日付の記述の仕方に問題があって、後から気が付きますw。
どんどん続けます。
G1セルに、
データ3
G2セルに、
=INDEX($A:$A,$D2+3)
として、G98までコピペします。
元データから必要なデータの行のピックアップは終了しました。
ここからは、行から必要な部分だけを抜き出していきます。
H1セルに、
第何代
H2セルに、
=MID(E2,FIND("html",E2)-4,3)*1
として、H98までコピペ。
I1セルに、
内閣総理大臣
I2セルに、
=MID(E2,FIND("html",E2)+6,LEN(E2)-FIND("html",E2)-14)
として、I98までコピペ
J1セルに、
開始年月日
J2セルに、
=MID(F2,4,FIND("<br",F2)-4)
として、J98までコピペ。
K1セルに、
終了年月日
K2セルに、
=MID(F2,FIND("~",F2)+1,FIND("</p",F2)-FIND("~",F2)-1)
として、K98までコピペ。
L1セルに、
在職日数
L2セルに、
=MID(G2,FIND("his-day",G2)+9,FIND("</",G2)-FIND("his-day",G2)-9)*1
として、L98までコピペ。
あちゃー、見直してみると、元年表記があるよ。
J2セルを、
=SUBSTITUTE(MID(F2,4,FIND("<br",F2)-4),"元","1")
K2セルを、
=SUBSTITUTE(MID(F2,FIND("~",F2)+1,FIND("</p",F2)-FIND("~",F2)-1),"元","1")
J2とK2をコピーして、98行までペースト。
誤 5 伊藤博文 明治25年8月8日 明治29月8月31日
正 5 伊藤博文 明治25年8月8日 明治29年8月31日
と間違いを見つけたので、
K94セルをコピーして、値としてペースト。
数式から文字列に変わったので、文字列として修正。
さて、文字列の日付では扱いづらいので、とりあえずシリアル値にします。
M1セルに、
シリアル値
M2セルに、
=DATEVALUE(J2)
として、M98までコピペ。
あちゃー、
そうだった。
Excelのシリアル値は1900/1/1の前日からの日数なので、
山形 有朋から#VALUE!になってます。
まぁ、とりあえず、
M列をコピーして、N列にペースト。
シリアル値は、後から考えるとして、
O1セルに、元号
P1セルに、年
Q1セルに、西暦
R1セルに、月
S1セルに、日
T1セルに、元号
U1セルに、年
V1セルに、西暦
W1セルに、月
X1セルに、日
として、
O2セルに、=LEFT(J2,2)
P2セルに、=MID(J2,3,FIND("年",J2)-3)*1
Q2セルに、=IF(O2="平成",P2+1988,IF(O2="昭和",P2+1925,IF(O2="大正",P2+1911,P2+1867)))
R2セルに、=MID(J2,FIND("年",J2)+1,FIND("月",J2)-FIND("年",J2)-1)*1
S2セルに、=MID(J2,FIND("月",J2)+1,FIND("日",J2)-FIND("月",J2)-1)*1
T2セルに、=LEFT(K2,2)
U2セルに、=MID(K2,3,FIND("年",K2)-3)*1
V2セルに、=IF(T2="平成",U2+1988,IF(T2="昭和",U2+1925,IF(T2="大正",U2+1911,U2+1867)))
W2セルに、=MID(K2,FIND("年",K2)+1,FIND("月",K2)-FIND("年",K2)-1)*1
X2セルに、=MID(K2,FIND("月",K2)+1,FIND("日",K2)-FIND("月",K2)-1)*1
として、96行までペースト
シリアル値が求まらないくらいの日付なんですよね。
まぁ、どのみち修正ユリウス通日にするつもりでいたので、先に進めます。
Y1セル、Z1セルを、修ユ通日
AA1セルに、差分1
AB1セルに、差分2
Y2セルに、
=INT(365.25*IF(R2<3,Q2-1,Q2))+INT(IF(R2<3,Q2-1,Q2)/400)-INT(IF(R2<3,Q2-1,Q2)/100)+INT(30.59*(IF(R2<3,R2+12,R2)-2))+S2-678912
Z2セルに、
=INT(365.25*IF(W2<3,V2-1,V2))+INT(IF(W2<3,V2-1,V2)/400)-INT(IF(W2<3,V2-1,V2)/100)+INT(30.59*(IF(W2<3,W2+12,W2)-2))+X2-678912
AA2セルに、
=Y2-M2
AB2セルに、
=Z2-N2
Y2からAB2までをコピーし、96行までペースト
差分1、差分2が15018と等しいので、修正ユリウス通日が正しいということです。
検算として、修正ユリウス通日から西暦年月日へ変換出来ればOKです。
AC1、AI1セルにn
AD1、AJ1セルにa
AE1、AK1セルにb
AF1、AL1セルに西暦
AG1、AM1セルに年
AH1、AN1セルに日
AO1セルに、チェック
AC2セルに、=Y2+678881
AD2セルに、=4*AC2+3+4*INT(3*INT(4*(AC2+1)/146097+1)/4)
AE2セルに、=5*INT(MOD(AD2,1461)/4)+2
AF2セルに、=INT(AD2/1461)+IF(AG2<3,1,0)
AG2セルに、=MOD(INT(AE2/153)+2,12)+1
AH2セルに、=INT(MOD(AE2,153)/5)+1
AI2セルに、=Z2+678881
AJ2セルに、=4*AI2+3+4*INT(3*INT(4*(AI2+1)/146097+1)/4)
AK2セルに、=5*INT(MOD(AJ2,1461)/4)+2
AL2セルに、=INT(AJ2/1461)+IF(AM2<3,1,0)
AM2セルに、=MOD(INT(AK2/153)+2,12)+1
AN2セルに、=INT(MOD(AK2,153)/5)+1
AO2セルに、=AND(Q2=AF2,R2=AG2,S2=AH2,V2=AL2,W2=AM2,X2=AN2)
AC2からAO2をコピーして、98行までペースト
不要な列を非表示にして、
西暦年月日から修正ユリウス日を計算し、そこから西暦年月日を逆算させて、比較しました。
チェックの列が全部TRUEであれば、とりあえずOKです。
就任期間と日数が合ってないところがあったが、まぁそれは後々必要であれば修正します。
とりあえず、修正ユリウス日が出来たので、その1のデータ編はこのへんで。
ではでは