Excel と Internet Explorer で作るミニ・データベース
安岡孝一∗
私個人としては 、Excel や Internet Explorer は大キライなのだが 、ミニ・データベースを作る際には、結構これらは重宝する。本稿では、Excel を使って作る個人用ミニ・データベースと、そこから Internet Explorer 限定の公開用ミニ・データベースを作る方法について、ざっと概観を述べることにする。

個人用ミニ・データベース

1

Excel を使って個人用ミニ・データベースを作る際、オートフィルタと関数に慣れておくのは、必須要件である。この章では、実際の例に即して、Excel のミニ・データベース的な使い方を学ぶことにしよう。

1.1

表のコピー

まずは手慣らしに、以下に示す Excel の表をコピーすることを考える。

Excel におけるコピーには、大きく分けて 2 つがある。値のコピーと連動コピーである。
∗京都大学人文科学研究所附属漢字情報研究センター11.1.1値のコピー

まずは値のコピーに挑戦してみよう。表全体をマウスの左ボタンでド ラッグして、Ctrl-C を押す。

次にコピー先のスプレッドシート (ここでは Sheet2) を開いて、マウスの右ボタンで「形式を選択して貼り付け」を選ぶ。

2

次に出てきたミニウィンド ウで、「値」を選択して OK を押す。

すると見事に値のコピーがおこなわれる。

3

1.1.2連動コピー

次に連動コピーに挑戦してみよう。いきなりコピー先のスプレッドシート (ここでは Sheet3) を開いて、左上の A1 のボックスに「 =Sheet1!A1 」と入力する。

これは「 Sheet1 の A1 の値をここに入れよ」という意味なので、Sheet1 の A1 の値が 、Sheet3 の A1 にも表示される。

4

ここで A1 を選んだまま Ctrl-C を押し 、表全体をマウスの左ボタンでド ラッグして、Ctrl-V を押す。

この操作で、A2 には「 =Sheet1!A2 」が、A3 には「 =Sheet1!A3 」が、…、C11 に
は「 =Sheet1!C11 」がコピーされるので、Sheet3 に Sheet1 の連動コピーが作られる。連動コピーは値のコピーとは違って、元のデータを変更するとコピー先のデータも変わる。この例では、Sheet1 の A1 を変更すると、Sheet2 の A1 は変わらないが 、Sheet3 の A1 は連動して変わるのである。

1.2

オート フィルタ

Excel のオートフィルタは、表の並べ替えや、条件に合う行だけを抽出するのに有効な機能である。まずは「データ」→「フィルタ」→「オートフィルタ」で、オートフィルタを ON にしよう。

5

1.2.1

並べ替え「 生年」の右横に現れた▼を左ボタンでクリックし 、「 昇順で並べ替え 」を選択する。

6

すると、表全体が「生年」の昇順に並べ替えられる。

1.2.2

抽出条件

さらに、785 年〜 805 年に生きていた人物だけを、抽出してみよう。まず、「生年」の▼を左ボタンでクリックし 、「 (オプション ) 」を選択する。

7すると「抽出条件の指定」ミニウィンド ウが現れるので、「生年」に対して「 805 」「以下」を指定する。

さらに「没年」の▼から「 (オプション ) 」を選択し 、ミニウィンド ウで「没年」に「以上」を指定する。
対して「 785 」

この結果、785 年〜 805 年に生きていた人物だけが抽出される。

8

抽出後の表を保存しておきたいならば 、別のスプレッド シートに値のコピーをおこなえばよい。

1.3

複数の表にまたがる処理

西暦の生没年を、年号に変換する例を考えてみよう。example2.xls には、Sheet1の A1 から C75 までに、年号と西暦の対応表が入っているものとする。

9

まず example1.xls の D2 に「 =MATCH(B2,[example2.xls]Sheet1!$B$1:$B$75,1) 」と入力する。この MATCH 関数の意味は「 example2.xls の Sheet1 の B1 〜 B75 のうち、B2 の値以下で最大の行は何行目か」なので、結果として「 4 」が返される。

次に D2 を ctrl-C し 、D2 〜 D11 までマウスの左ボタンをド ラッグして ctrl-V すると、D3 には「 =MATCH(B3,[example2.xls]Sheet1!$B$1:$B$75,1) 」が、D4 には

10

「 =MATCH(B4,[example2.xls]Sheet1!$B$1:$B$75,1) 」が、…、D11 には「 =MATCH(
B11,[example2.xls]Sheet1!$B$1:$B$75,1) 」がそれぞれコピーされる。

さらに D2 の値を使って、E2 に年号を取り出す。具体的には、E2 に「 =INDEX([example2.xls]Sheet1!$A$1:$A$75,D2,1) 」と入力する。

11

この INDEX 関数の意味は「 example2.xls の Sheet1 の A1 〜 A75 に対し 、D2 行 1列目を取り出せ」なので、D2 が 4 であることから「永徽」が返される。E2 を ctrl-C
し 、E2 〜 E11 に ctrl-V すれば 、以降も同様に年号が返される。

西暦と年号初年の差から、年号における年を求めよう。F2 に「 =B2-INDEX([example2.xls]Sheet1!$B$1:$B$75,D2,1)+1 」と入力する。

12

F2 を ctrl-C し 、F2 〜 F11 に ctrl-V する。

最後に、年号と年を一つのセルにまとめる。G2 に「 =CONCATENATE(E2,F2) 」と入力しよう。

13

G2 を ctrl-C し 、G2 〜 G11 に ctrl-V すれば 、生年は完成である。

没年についても同様に、まず対応する行を求め

14

次に年号を求め年号における年を求めて15一つのセルにまとめればよい。

ここまでができたら、表全体を ctrl-C して16

別のスプレッドシート (ここでは Sheet4) で、右ボタンで「形式を選択して貼り付け」を選択しミニウィンド ウで「値」を選んで17

値のコピーをおこなう。

さらに、西暦の列と作業に使った列をド ラッグして、右ボタンで「削除」し18

「左方向にシフト 」することで表を詰めることができる。

19

没年の作業に使った列も同様に「削除」→「左方向にシフト 」して最終的な表の完成である。

では、この年号の生没年から、逆に西暦の生没年に戻すことは可能だろうか？ こ
こでは生年に関するいくつかの式を示して、ヒントとしておく。

20

D2 に「 =RIGHT(B2,IF(ISNUMBER(INT(RIGHT(B2,2))),2,1)) 」
E2 に「 =SUBSTITUTE(B2,D2,"") 」
F2 に「 =MATCH(E2,[example2.xls]Sheet1!$A$1:$A$75,0) 」
G2 に「 =INDEX([example2.xls]Sheet1!$B$1:$B$75,F2,1)+D2-1」

公開用ミニ・データベース

2

Internet Explorer にはデータバインドという機能†があり、これを使ってミニ・データベースを公開することができる。まず、準備として、Excel の表を「ファイル」→「名前を付けて保存」で「 Unicode テキスト 」として保存する。

保存時にいくつかメッセージが出るが、気にせず example1.txt として保存しよう。

2.1

データバインド の基本保存した example1.txt に対し 、以下のような example1.html を準備する。
<HTML><HEAD><TITLE>example1.html</TITLE></HEAD><BODY><TABLE DATASRC="#example" BORDER=1><THEAD><TR>†データバインドは 、Microsoft Windows 上の Internet Explorer 限定の機能である。

21

<TH>名</TH><TH>生年</TH><TH>没年</TH></TR></THEAD><TBODY><TR><TD><SPAN DATAFLD="人名"></SPAN></TD><TD><SPAN DATAFLD="生年"></SPAN></TD><TD><SPAN DATAFLD="没年"></SPAN></TD></TR></TBODY></TABLE><OBJECT ID="example" CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="example1.txt"><PARAM NAME="UseHeader" VALUE="true"><PARAM NAME="FieldDelim" VALUE="&#9;"></OBJECT></BODY></HTML>この example1.html を Internet Explorer で表示すると、以下のようになる。

つまり、example1.txt の内容を example1.html の<TABLE>部分 (より正確には<TBODY>部分) に埋め込むことが可能となる。

22

2.2

並べ替え

データバインドには、並べ替えの機能が準備されている。以下の example2.html
を見て欲しい。
<HTML><HEAD><TITLE>example2.html</TITLE></HEAD><BODY><TABLE DATASRC="#example" BORDER=1><THEAD><TR><TH>名</TH><TH onClick="example.Sort=’+生年’; example.Reset()">生年</TH><TH onClick="example.Sort=’+没年’; example.Reset()">没年</TH></TR></THEAD><TBODY><TR><TD><SPAN DATAFLD="人名"></SPAN></TD><TD><SPAN DATAFLD="生年"></SPAN></TD><TD><SPAN DATAFLD="没年"></SPAN></TD></TR></TBODY></TABLE><OBJECT ID="example" CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="example1.txt"><PARAM NAME="UseHeader" VALUE="true"><PARAM NAME="FieldDelim" VALUE="&#9;"></OBJECT></BODY></HTML>23

この example2.html を Internet Explorer で表示すると、以下のようになる。

ここで、表の生年をクリックすると「 example.Sort=’+生年’; example.Reset() 」が起動して、生年の順序にデータが並び替えられる。

表の没年をクリックすれば 、没年の順序となる。

24

2.3

抽出条件

データバインド では、表に対して抽出条件を指定し 、データの一部を抜き出すことも可能となっている。以下の example3.html を見てほしい。
<HTML><HEAD><TITLE>example3.html</TITLE></HEAD><BODY><TABLE DATASRC="#example" BORDER=1><THEAD><TR><TH>名</TH><TH onClick="example.Filter=’ 生年=’+prompt(’ 生年?’,’’);
example.Reset()">生年</TH><TH>没年</TH></TR></THEAD><TBODY><TR><TD><SPAN DATAFLD="人名"></SPAN></TD><TD><SPAN DATAFLD="生年"></SPAN></TD><TD><SPAN DATAFLD="没年"></SPAN></TD></TR></TBODY></TABLE><OBJECT ID="example" CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="example1.txt"><PARAM NAME="UseHeader" VALUE="true"><PARAM NAME="FieldDelim" VALUE="&#9;"></OBJECT></BODY></HTML>25

この example3.html を Internet Explorer で表示して、表の生年をクリックすると「 prompt(’ 生年?’,’’) 」により、以下のようなミニウィンド ウが現れる。

このミニウィンドウ中に、たとえば「 742 」を入力すると、example.Filter に「生「 example.Reset() 」で以下のような表示となる。
年=742 」が設定されて、26

あるいは、JavaScript の助けを借りれば 、以下の example4.html のようなことも可能である。
<HTML><HEAD><TITLE>example4.html</TITLE><SCRIPT LANGUAGE="JavaScript">function mySearch(){var t=’’;if(parseInt(document.myForm.from.value)>0)
t=’ 没年>=’+parseInt(document.myForm.from.value);if(parseInt(document.myForm.to.value)>0){
if(t!=’’)
t+=’&’;
t+=’ 生年<=’+parseInt(document.myForm.to.value);}example.Filter=t;
example.Reset();}</SCRIPT></HEAD><BODY><TABLE DATASRC="#example" BORDER=1><THEAD><TR><TH>名</TH><TH>生年</TH><TH>没年</TH></TR></THEAD><TBODY><TR><TD><SPAN DATAFLD="人名"></SPAN></TD><TD><SPAN DATAFLD="生年"></SPAN></TD><TD><SPAN DATAFLD="没年"></SPAN></TD></TR></TBODY></TABLE><FORM NAME="myForm"><INPUT NAME="from" TYPE="text" SIZE=3><INPUT NAME="to" TYPE="text" SIZE=3><INPUT TYPE="button" VALUE="検索" onClick="mySearch()"></FORM><OBJECT ID="example" CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="example1.txt"><PARAM NAME="UseHeader" VALUE="true"><PARAM NAME="FieldDelim" VALUE="&#9;"></OBJECT></BODY></HTML>27

表の下にあるボックスに、たとえば「 785 」と「 805 」を入力し、「検索」をクリックす
ると、example.Filter に「没年>=785&生年<=805 」がセットされ「 example.Reset() 」で以下の表示となる。

これらを応用すれば 、公開用ミニ・データベースは思いのままである。ぜひトライしてみてほしい。

28