[[20110122120607]] 『日付の自動入力について』(結衣) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『日付の自動入力について』(結衣)

 Excel2010 Windows7 32bit

 質問させていただきたいのですが少し複雑ですので質問に不足情報もあると思いますがよろしくお願いします。

 まず現在顧客用のカルテと、来客管理用のブックを作っています。

 顧客用のカルテは1顧客1ブックですので相当数の数があります。
 顧客用のカルテでは使用項目(C列)を入力すると自動で日付(A列)が入力されるようにマクロで設定しております。

 来客管理用のブックは顧客名(D列)I列以降は日付です。I(1日)J(2日)・・・といった感じです。
 日付の管理はD1で今月の月を表示して、I1に=d1で1日J1に=I1+1で2日を書式設定の表示で日につだけが出るように設定しています。

・・・・ここからがしたいことです・・・・

 ○○さんの顧客用カルテの使用項目にフィットネスと打った場合に自動でその来客管理 用のブックの○○さんの今日の日付のところに○が入るようにしたいのですが可能でしょうか?

説明が足らないと思いますがどうぞよろしくお願いいたします。


 こんな事でしょうか?

 Aさんのカルテ(Aさん.xls)									
	[A]	[B]	[C]	[D]					
[1]	日付	時間	使用項目						
[2]	1月3日	8:00	フィットネス						
[3]									

 Bさんのカルテ(Bさん.xls)									
	[A]	[B]	[C]	[D]					
[1]	日付	時間	使用項目						
[2]	1月1日	8:00	フィットネス						
[3]	1月4日	8:00	フィットネス						

 顧客管理ファイル									
	[A]	・・・・	[D]	・・・・	[I]	[J]	[K]	[L]	[M]
[1]			1月		1日	2日	3日	4日	5日
[2]	Aさん						○		
[3]	Bさん				○			○	
 両方のファイルを開いている場合
 I2 =IF(ISERROR(MATCH(I$1,[Aさん.xls]Sheet1!$A:$A,0)),"","○")
 I3 =IF(ISERROR(MATCH(I$1,[Bさん.xls]Sheet1!$A:$A,0)),"","○")
 と言った式が入っています。

 ちなみに、もう気づいて居られるかもしれませんが、前回のご質問スレ
[[20110121115338]] 『自動で入力』(結衣)
 お手数ですが、ご確認頂ければと思います。

 (HANA)

 HANAさん確認させていただきました。
 ありがとうございます。

 この関数を入力すると

 入力した値は正しくありません。
 ユーザーの設定によって、セルに入力できる値が制限されています。

 と出てきます。
 入力規制の設定だと思うのですが制限の解除はどのようにすればよいのでしょうか?

 よろしくお願いします。


 2007と2010は一緒ですかね。。。

 ↓2007の画像ですが。

 後は、入力規則が設定されていないセルをコピーして
 貼り付けて貰っても良いと思います。

 それにしても、入力規則は削除してしまって良いのですか?

 (HANA)

 顧客管理ファイルのほうの入力規制がかかっていましたので解除したら入力できました。

 現在の状況としまして
 ○が出てきません。
 カルテのほうでフィットネスを記入していなくても顧客管理ファイルの列単位の○の数を=COUNTA(AD4:AD98)でカウントしているのですがここには数が認識されます。

 追記
 カルテのC列ですがフィットネス以外の文字も入ります。
 フィットネスの文字が入ったときのみ顧客管理ファイルに反映させたいです。

 よろしくお願いします。
 (結衣)

 >○の数を=COUNTA(AD4:AD98)でカウントしているのですが

 部分は○の数ではありませんでした申し訳ありません。

 結衣)

 >○の数ではありませんでした申し訳ありません。
 大丈夫です。
 ○が上手く表示された暁には、そこには
 =COUNTIF(AD4:AD98,"○")
 の式を入れて下さい。

 ちょっと試して貰いたいのですが

 1.顧客管理ファイルと、Aさんのファイルを複製して下さい。

 2.Aさんのファイルを開いて
   A1セルに「AAA」C1セルに「BBB」を入力して下さい。

 3.顧客管理ファイルも開いて
   I1セルに「AAA」と入力
   I2セルに =VLOOKUP(I$1,[Aさん.xls]Sheet1!$A:$C,3,FALSE) の式を貼り付け。
   (ファイル名、シート名は実際のものと合わせて下さい。
   その他は変更せずに、データの方を式に合わせて下さい。)

 すると、I2セルの値はどうなりますか?

 (HANA)


 I2の値はBBBとなりました。
 よろしくお願いします。

 (結衣)

 VLOOKUP関数は、
=VLOOKUP(I$1,[Aさん.xls]Sheet1!$A:$C,3,FALSE)
         ~~1 ~~~~~~~~~~~~~~~~~~~~~~2 ~3 ~~~~4

 1(I1セル)の値を、2の範囲の先頭の列(AさんブックSheet1のA列)から探し
 同じ行の 3で指定した数分隣の列の値(AさんブックSheet1のC列)を返します。
 4で「FALSE」を入れると1(I1セル)の値と完全に一致するモノが有った時だけ
 その値を返してくれます。

 一致するモノが無かった場合は、エラー(#N/A)が表示されます。

 データを元に戻して、数式の1,2の範囲を変更して
 一ヶ月分コピーしてみて下さい。

 フィットネスと入力されている日付の所には フィットネスと表示されますか?
  他の日付も入っていたら、入力されている使用項目が表示されていますか?
  日付の入力が無い日は #N/A が表示されると思いますが。

 (HANA)

 AO1にフィットネスと打ちました。

 =VLOOKUP($AO$1,[Aさん.xls]カルテ!$A$1:$C$65536,3,FALSE)
 I4〜AM4までコピーしました。
 すべて#N/Aでした。

 ちなみにAさんのブックでフィットネスという語句は記入しています。
 よろしくお願いします。

(結衣)


 >フィットネスと入力されている日付の所には フィットネスと表示されますか?
 とはどこの事でしょうか?

 よろしくお願いします。
 (結衣)

 =VLOOKUP($AO$1,[Aさん.xls]カルテ!$A$1:$C$65536,3,FALSE)
                  ~~~~~~~~~~~~~
 この部分の数字は自動で入ったのですが大丈夫でしょうか?
 よろしくお願いします。

 (結衣)

報告

 初めに頂いた
 =IF(ISERROR(MATCH(Y$1,[Aさん.xls]カルテ!$A$1:$A$65536,0)),"","○")
 の関数を入力したところ反映されました。

 このままだとフィットネス以外の語句でも○を表示してしまします。
 =VLOOKUPを合わせればよいのでしょうか?

 このブックには更新できないリンクが1つ以上含まれています。
 といったエラーが出てきます。
 リンクの編集を押すとAさん.xlsでエラー:ソースが見つかりません。
 と出てきます。

 リンク先の移動などは行っておりません。
 なぜでしょうか?

 (結衣)

報告

 私ばかりの更新してすいません。

 ソースのエラーは解決しました。
 変更する場所がおかしかったみたいです。

現在の状況としまして、

 来客管理用ブックにAさん、Bさんなどの日付を反映させることはできました。
 フィットネスのみの反映をさせたいのですがここからどうすれば良いでしょうか?

 よろしくお願いします。
 (結衣)


 すみません、がんばって書いているのですが投稿が遅くて。。。

 >来客管理用ブックにAさん、Bさんなどの日付を反映させることはできました。
 って事は、VLOOKUP関数の式が出来たってことですか?

 以下、書きかけだった文章です。

 >=VLOOKUPを合わせればよいのでしょうか?
 はい、VLOOKUPと合わせることになります。。。
 ので、先に数式を作る問題を解決して下さい。

 >AO1にフィットネスと打ちました。
 おっと、違います。

 [Aさん.xls]カルテ!$A$1:$A$65536 の範囲には日付が入っていますね?
 その日付を検索するので、AO1は日付を入れてください。

 AさんのA列の中に AO1の日付があるにも関わらず #N/A が表示される場合は
 念のため、AO1のセルとAさんのA列の該当セルに 同じ日付を再度入力してみてください。

 >>フィットネスと入力されている日付の所には フィットネスと表示されますか?
 >とはどこの事でしょうか?

 最初に私が載せたデータサンプルだと
 Aさんのカルテ(Aさん.xls)									
	[A]	[B]	[C]	[D]					
[1]	日付	時間	使用項目						
[2]	1月3日	8:00	Fi						
[3]									

 Bさんのカルテ(Bさん.xls)									
	[A]	[B]	[C]	[D]					
[1]	日付	時間	使用項目						
[2]	1月1日	8:00	Ta						
[3]	1月4日	8:00	Fi						

 顧客管理ファイル									
	[A]	・・・・	[D]	・・・・	[I]	[J]	[K]	[L]	[M]
[1]			1月		1日	2日	3日	4日	5日
[2]	Aさん				#N/A	#N/A	Fi	#N/A	#N/A
[3]	Bさん				Ta	#N/A	#N/A	Fi	#N/A
 こんな結果になる数式を作って下さい。

 この配置であれば、I2セルの数式は
 =VLOOKUP(I$1,[Aさん.xls]カルテ!$A$1:$C$65536,3,FALSE)

 >この部分の数字は自動で入ったのですが大丈夫でしょうか?
 データを入力する可能性のある範囲を、少し多めに設定しておいて下さい。
 (65536件は入力しないと思いますが。。。)

 なお、載せて下さった式は 最初の(引数1の)セル参照が両方絶対参照に成っています。
 「$AO$1」
   ~  ~  $ が列(AO)の前にも、行(1)の前にも付いている。
 ここは、横にコピーして行くので、「AO$1」の様に行方向だけ絶対参照にして下さい。
 横にコピーしたときに、AP$1,AQ$1,AR$1 と参照先が勝手に変わってくれる様に成ります。

 後ろ側の(引数2の)参照は、現在の状態のままにしておいて下さい。

 (HANA)


 経過報告のことは忘れてください。

 HANAさんが書いていただいた式で言われたとおりの数式は完成いたしました。
 ありがとうございます。

 あとはフィットネスの時のみ○を表示させたいのですがIF関数を使えばよいのでしょうか?
 自分なりに組み合わせてみたのですがエラーなります。

 よろしくお願いします。

 (結衣)

 =IF(VLOOKUP(I$1,[Aさん.xlsm]カルテ'!$A$1:$C$1000,3,FALSE)="フィットネス","○","")

 といった式ですが#N/Aと出てきます。
 何処が間違っているのでしょうか?

 (結衣)

 追記

 フィットネスの部分は○
 それ以外の部分は空白
 が出来ました。
 #N/Aの部分がそのまま表示されます。
 #N/Aの部分に無効な値のエラーといった文字が出てきて左上部分が緑色になっています。

 よろしくお願いします。

 (結衣)

 そこまで出来ていたら、あと一息です。

 VLOOKUP関数がエラーになったときに、IF関数の条件部分がエラーになってしまいます。
 なので、まず最初にVLOOKUP関数がエラーでないことを確認してから
 エラーでない時に 現在作っておられる式を実行することになります。

 最初の式で、ISERROR関数を使っていますが
 これが、エラーかどうかを確認する関数です。

 =IF(ISERROR(VLOOKUPの関数),"",作っておられるIFの関数)
 という構造になります。

 ただ、VLOOKUPの関数はそれ自体がすでに長いですよね。
 そこで、判定はMATCH関数を使ったりします。

 =IF(ISERROR(MATCH(I$1,[Aさん.xls]Sheet1!$A:$A,0)),"","○")
 これは、最初に載せた式ですが、これの"○"部分に
 作っておられるIFの関数を入れてください。

 =IF(ISERROR(MATCH(I$1,[Aさん.xlsm]カルテ'!$A$1:$A$1000,0)),"",IF(VLOOKUP(I$1,[Aさん.xlsm]カルテ'!$A$1:$C$1000,3,FALSE)="フィットネス","○",""))
 こんな感じになります。

 もしも、Aさんのデータが同じブック内にある場合は VLOOKUP関数がエラーになるかどうかの判定は
 COUNTIF関数でできるのですが。。。

 (HANA)


出来ました。

 ありがとうございます。
 あと1点質問させていただきたいのですが、
 この場合Aさんの今日の日付が2つ以上あった場合に今日の一番上の語句が反映されてしまいます。
 今日の日付の中にフィットネスがあった場合に反映させる方法はありますか?

 よろしくお願いします。

 (結衣)


 そうですね。。。
 顧客用カルテの方のD列にでも  作業セルを作って
 IF関数を使って、フィットネスと成っている行は
 「〇」を入れることにする。
 その〇の有無で判定してはどうでしょう?

 (HANA)

 と思ったけど  そう単純ではなかったですね。

 後で修正案を載せますので  ↑の投稿は忘れてください。

 いずれにしても、作業列を使うのが良いと思います。

 (HANA)

 時間も経ったので、少しすっきりしてきました。

 > IF関数を使って、フィットネスと成っている行は
 >「○」を入れることにする。
 の所が「○」ではなく、A列の日付を入れる様にして下さい。
 D列に =IF(C1="フィットネス",A1,"") と言った式。

 すると、最初の式で、D列を参照したもの
=IF(ISERROR(MATCH(I$1,[Aさん.xlsm]カルテ'!$D$1:$D$1000)),"","○")
 が使えると思います。

 (HANA)

 =IF(ISERROR(MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$D$1000)),"","○")
 を入力するとすべて○になってしまします。

 又、
 =IF(ISERROR(MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$A$1000,0)),"",IF(VLOOKUP(I$1,[Aさん.xlsm]カルテ'!$D$19:$C$1000,3,FALSE)="フィットネス","○",""))
 を入力すると来客管理用のブックに顧客管理用のカルテのフィットネスと入力した日付の部分に#REFと表示されます。

 ="フィットネス","○",""))
   ~~~~~~~~~~~~
 が変更しなければと思うのですがどうでしょうか?

 よろしくお願いします。

 (結衣)

 >を入力すると来客管理用のブックに顧客管理用のカルテのフィットネスと入力した日付の部分に#REFと表示されます。

 書き方がおかしかったです。
 日付は認識してると思うのですが表示が#REFと出てきます。

 (結衣)

 済みませんが、顧客用カルテ のD列はどの様な式を入れていますか?

 (HANA)

 =IF(C19="フィットネス",A19,"")

 といれています。
 よろしくお願いします。
 (結衣)


 あ、すみません。
 MATCH関数をコピーした時に 中途半端でした。

 × MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$D$1000)

 ○ MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$D$1000,0)
                                        忘れ物/~~

 VLOOKUP関数は、4番目の引数で「FALSE」を入れると、完全一致で検索します。
 MATCH関数のそれに対応する引数が、この3番目の引数です。
 「0」を入れると、完全一致で検索します。

 確認のため、一度
=MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$D$1000,0)
 の式だけを入れて、結果を確認してみてください。

 空白にしたいセルに #N/A と表示されていれば
 これをIF関数の中のISERROR関数の中に入れてください。

 (HANA)

 出来ましたありがとうござます。

 題名と質問が変わってしまうのですが申し訳ありません。
 来客管理用のブックにリンクを貼る時一人ひとり設定しなければなりません。
 自動で来客管理用のブックのD列の名前をAさんとした所に入力させる方法はありますか?
 I4の場合D4の名前を自動で入力といった具合です。

 Aさんを=D4にしてもダメでした。
 文字として認識してしまうので無理です。
 どのようにすれば自動反映できるでしょうか?

 よろしくお願いします。
 (結衣)

 出来ましたか、良かったです。

 >題名と質問が変わってしまうのですが申し訳ありません。
 いいえ、既に出来ているファイルが沢山あるという事で
 それまで含めてのご質問だと考えていました。

 結論だけを言うと、自動で入ることを考えるのは難しいと思います。
 しかし、現在出来ているカルテについて なるべく簡単に数式を作る
 という事を考えるなら、一つずつ作成して行くより
 少しは簡単に出来る方法があると思います。

 個人用カルテのD列に「=IF(C19="フィットネス",A19,"")」の式も
 入れていかないといけないですしね。

 そこで、いくつか質問をさせて下さい。

 カルテ(ブック)はどの程度の割合で増えていくのでしょうか?
 また、カルテは一つのフォルダにまとまっていますか?
 そして、カルテ名と個人名の間に関連がありますか?

 (HANA)

 >カルテ(ブック)はどの程度の割合で増えていくのでしょうか?
 カルテはこれから増やしていくのですが約1000人ぐらいです。今回教えていただいた客管理用(フィットネス)へのリンクは40人程度です。

 >また、カルテは一つのフォルダにまとまっていますか?
 カルテはいつのフォルダーにまとめています。(これから作っていきます)

 >そして、カルテ名と個人名の間に関連がありますか?
 カルテ名と個人名の間に関連はありません。(カルテ名=カルテのブックの名前、個人名=来客管理用ブックのD列)と言った解釈でよろしいでしょうか?

追記

 1人1人のカルテはシートではなくブックでする予定です。(シートの方が良いのでしょうか?)
 動きが早い方がいいのですが。
 個々のカルテは別のブックで検索をかけてリンクできるようにしてあります。
 (結衣)

 >また、カルテは一つのフォルダにまとまっていますか?
 カルテは一つのフォルダーにまとめています。(これから作っていきます)
     ~~~~
 間違いました。訂正です。
 (結衣)

 >カルテはこれから増やしていくのですが約1000人ぐらいです。
 と言う事は、現在は紙ベースで存在していて
       今からエクセルにデータ化していく
 という事ですか?
 つまり、現在は 客管理用へリンクするつもりの
 40人のファイルも出来ていない?

 このカルテのデータ(ブック)はいつまで使うのでしょう?
 永久に使うという事であれば、範囲を多めに取っていても
 そのうち埋まるのではないかと思いますが。
 (その様なデータでも無いのですかね。。。。)
 一年毎に新しくする とかは、大変に思います。

 >カルテ名と個人名の間に関連はありません。
 >(カルテ名=カルテのブックの名前、個人名=来客管理用ブックのD列)
 >と言った解釈でよろしいでしょうか?
 はい、そのつもりで書きました。

 関連が無いと、どのように関連付ければよいのか良く分かりませんが。。。
 >個々のカルテは別のブックで検索をかけてリンクできるようにしてあります。
 このブックで関連づけられているのですか?

 (HANA)

 >今からエクセルにデータ化していくという事ですか?
 はい、現在紙ベースで全て管理しています。これからデータ化していくつもりです。

 >現在は 客管理用へリンクするつもりの40人のファイルも出来ていない?
 はい、これから作っていきます。

 >このカルテのデータ(ブック)はいつまで使うのでしょう?
 永久に使うつもりです。=MATCH(I$1,[Aさん.xlsm]カルテ'!$D$19:$D$1000,0)の1000をとりあえず4000に増やしました。

 >関連が無いと、どのように関連付ければよいのか良く分かりませんが。。。
 申し訳ありません説明不足でした。
 現在3種類のブックを作成しています。
 一覧を検索できるブック、個別のカルテを記入するブック、フィットネスのみの来客日時を記録するブックです。(個別のカルテを記入するブック、フィットネスのみの来客日時を記録するブックは教えていただいたものです。)
 一覧を検索できるブックの名前の欄と個別のカルテを記入するブックをリンクでつなぐ予定です。
 個別用のカルテの40人はフィットネスをしていますのでフィットネスのみの来客日時を記録するブックのD列と個別のカルテを記入するブックのブックの名前(Aさん.xls)は同じ名前です。
 現在はD列(40人)は手打ちです。

 下手な説明で申し訳ありません。
 (結衣)

 という事は、いずれにしても 運用は40人のカルテが出来てからですね?

 でしたら、I列の数式を40人分いっぺんに作って 他の列へもコピー。
 その後増えるものに関しては、カルテを作った時にその都度作成
 (と言っても、カルテのブック名とD列の名前が同じなので
  置換すれば良いですが。)
 と言う事で良いでしょうか?

 数式を作る場合、該当のブックが事前に無いと作れないので
 (「で、そのブックってどれよ!!」とエクセルに言われる)
 ブックは先に用意しておいて下さい。

 以下、手順です。

 1.最初の人(Aさん)のI2の数式を作って、Aさんのブックを閉じる。
   (すると、数式のファイル名の前に自動的にパスが表示されます。)
      =IF(ISERROR(MATCH(I$1,パス\[Aさん.xlsm]カルテ'!$D$19:$D$4000,0)),"","○")
 2.数式を""で囲ってIFの前に★をつける。
      ="★IF(ISERROR(MATCH(I$1,パス\[Aさん.xlsm]カルテ'!$D$19:$D$4000,0)),"","○")"
 3.数式のAさんと成っている所をセル参照にする。
      ="★IF(ISERROR(MATCH(I$1,パス\["&D2&".xlsm]カルテ'!$D$19:$D$4000,0)),"","○")"
     セルには、1の式の「=」が「★」に変わっただけの文字列が表示されている事を確認してください。
      ↓セルに表示されている文字
      ★IF(ISERROR(MATCH(I$1,パス\[Aさん.xlsm]カルテ'!$D$19:$D$4000,0)),"","○")
 4.40人分下にコピーして下さい。
     ブック名の部分だけ違う数式の文字が出来ます。
 5.数式を入れた範囲をコピーして、値貼り付けします。
   数式バーにも 3の「セルに表示されている文字」と同じものが表示されている事を確認してください。
 6.置換で、★ を = に置換します。
 7.I列に数式が出来ますので、他の列のセルにコピーして下さい。

 その後、新しい人を追加する場合は
 T1.41行目をコピーして、42行目に張り付け
 T2.42行目を選択して 「AOさん」→「APさん」 に置換
 してもらえば、数式も変わります。
 (数が多い場合は、1〜7の手順をやってもらっても良いと思いますが。)

 >1000をとりあえず4000に増やしました。
 という事ですが、後で置換で変更出来るので
 誰かのカルテが1000を超え次第順次変えていっても良いかもしれません。

 >永久に使うつもりです。
 というのがちょっと気になりますが
 今の段階でここまで作っておくのは良いかと思います。

 今後、運用が難しくなった場合を考えて
 データベース的な知識を身につけておかれると良いかもしれません。

 たとえば
 [顧客データシート]
   顧客ID 顧客名 登録年月日 郵便番号 住所 電話番号 区分
 [使用情報シート]
   顧客ID 使用日 使用目的 受付日
 の様なリスト形式の二つのテーブルを作っておいて
 [カルテシート]で、登録・追加・変更 等を行う

 すると、1000人の利用者が居ても 1000行で済みます。
 今回の様にデータを集める作業も、あちこちのブックを見に行く必要が無いので
 簡単に出来るようになると思います。

 ただ、カルテシートで一括して 登録・追加・変更 出来る様な仕組みを作るのは
 そう簡単では無い(ブックを1000個作る方が簡単)と思いますし
 そこまでする必要があるかどうかも分かりませんので、今後の課題と言う事で。

 (HANA)

 ="★IF(ISERROR(MATCH(I$1,パス\["&D2&".xlsm]カルテ'!$D$19:$D$4000,0)),"","○")"
                                    ~~~~~
 この部分が黒くなり
 入力した数式は正しくありません。と出てきます。
 なぜその部分が黒くなるのでしょうか?

 >[顧客データシート]
   顧客ID 顧客名 登録年月日 郵便番号 住所 電話番号 区分
 [使用情報シート]
   顧客ID 使用日 使用目的 受付日

 現在顧客データはアクセスで管理しております。(POS)
 今回のはカルテをエクセル管理したかったので作成しようと考えました。

 よろしくお願いします。
 (結衣)

 そうですか。なんだか勿体ない気もしますが
 エクセル、便利ですからね。

 ご質問の件に関しては、済みません。
 数式内で"が4つ出てきますが それぞれ""にしてみてもらえますか?
 ="★IF(ISERROR(MATCH(I$1,パス\["&D2&".xlsm]カルテ'!$D$19:$D$4000,0)),"""",""○"")"
 すると、セルに                                                       ~  ~ ~    ~
 ★IF(ISERROR(MATCH(I$1,パス\[Aさん.xlsm]カルテ'!$D$19:$D$4000,0)),"","○")
 と表示される様に成ると思います。

 (HANA)


ありがとうございました。

 とても勉強になる教え方をしていただきありがとうございます。
 これからVBAによるフォームでの入力画面を作っていこうと思います。

 又、わからないことだらけだと思いますのでよろしくお願いします。
 本当にありがとうございました。
 (結衣)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.