Excelで、仕事関係の本格的?なデータベースを作成中です。
データベースは和牛のデータベースです。
以下のような一覧表(ここが入力用になり、元帳の役割になります)
繁殖の日付は、AIを表示形式で付けて表示させていますが
もちろんシリアル値のままです。
そうでないと後で利用できないですからね。
分娩予定日は、単純に以下の式で算出。
=IF(F8="(+)",D8+285,"")
通常は、月数から3を引いて、日数に10を足すなんて方法で計算されますが
あえて285日を足すという式にしました。
異論のある方もあるとは思いますが...。
カードを含めて大たいの仕組みを作ってから、この分娩予定日を入れ込んだので
その修正が恐ろしかった...。^^;
後から少しづつ修正が入り、その都度、修正、修正、、、
まあ、最初からバッチシなんて訳には行かないですよね。
この一覧表から個別にデータを抽出したカードを作成、分娩予定順シート、また別途に印刷用として出力帳票を作成。
カード仕様 1
このカードは、スピンドルボタンとH10セルをリンクさせて
H10セルの数値をスピンドルボタンをクリックすることにより変化させて
その数値を一覧表の中の行数としてデータを抽出しています。
その場合、C2セルには以下のような式が入ります。
=IF(OR($H$10=0,COUNTA(一覧表!$A$3:$A$20)<$H$10),"",INDEX(一覧表!$A$3:$L$20,$H$10,ROW(A1)))
INDEX関数で抽出する仕組みです。
スピンドルボタンで変化させた数値を参照して行数を決めて
列数はROW関数を相対参照させて取得しています。
カード仕様 2
これは、C2セルの名号をリストから入力あるいは直接入力し
C3以下はそのデータをVLOOKUP関数を使って抽出する仕組みです。
C3以下に入っている式は
=IF($C$2="","",VLOOKUP($C$2,一覧表!$A$3:$L$20,ROW(A2),0))
列数はROW関数を相対参照させて取得しています。
分娩予定順シート
一覧表から繁殖の日付の早い(Excelてきには小さい)順にデータを取得して
自動的に並び替えて表示させています。
以下のような式
=IF(ISERR(INDEX(一覧表!$A$3:$L$20,MATCH(SMALL(一覧表!$D$3:$D$20,ROW(A1)),一覧表!$D$3:$D$20,0),COLUMN())),"",INDEX(一覧表!$A$3:$L$20,MATCH(SMALL(一覧表!$D$3:$D$20,ROW(A1)),一覧表!$D$3:$D$20,0),COLUMN()))
この式は、一覧表の繁殖の日付を小さい順にSMALL関数で選んで、そのデータをMATCH関数でデータの何番目にあたるのかを判定させます。
その値がINDEX関数の行数となります。
列数は、横にオートフィルで式をコピーしますのでCOLUMN関数で取得させます。
最初、配列数式で確定させていましたが、後で、配列数式でなくても機能すると気が付いて...。(^^ゞ
このINDEX関数の式、エラー処理をどうするかで時間がかかった。
あれもこれもと色々と試しましたが、なかなかフィットせず
最後は諦めて、ISERR関数で全ての式にエラーがあるかないかを判定させてエラー処理としました。
ISERR関数は初めて使ってみた、Excel2007からの関数だと思う。
分娩予定順シートは
繁殖の日付に285日を足す式ですが、出力帳票の後にこの分娩予定順シートを作成しましたので
出力帳票との表示形式が問題となり、、、
出力帳票は繁殖欄のセル一つに、人工授精日の「8/30 AI 」と
「H27.6.11 分娩予定日」というのを切り替えて表示させる仕組みになっています。
この二つの表示形式を切り替えて使えないと成り立たない。
しかし、Excelでは表示形式は一つしか設定できません。
悩みに悩んで、、、あげく、ちょっとした閃きから新たなテクニックを開発
強引に力技で解決しました。
長くなりましたので、データベース作成 2で後述します。
※コメント投稿者のブログIDはブログ作成者のみに通知されます