ExcelでSQLを使う-007: Excelの表の列名 ー Field.Name
監修者紹介
水越美奈(みずこし みな)
P.E.T.S 行動コンサルテーションズ主宰。ケーナイン・アンリミテッド顧問獣医師。日本獣医畜産大学獣医学部卒業。動物病院勤務を経て渡米し、行動治療学や、動物福祉、しつけ、聴導犬訓練を等を学ぶ。(財)日本盲導犬協会嘱託獣医師。
※※※※※※
エクセルを参照、更新、削除するツールの開発において、問題になったのは、
1、利用する Provider の選択。
2、エクセル固有の列の型タイプへの対応。
3、ADODB が取得するエクセル固有の列名の存在。
であったことは、前稿で述べた通り。本稿では、《ADODB が取得するエクセル固有の列名》についてのおさらいである。
1、拡張プロパティで見出し有りを指定すれば、見出しが Field.name になる。
2、拡張プロパティで見出し無しを指定すれば、F1、F2、Fnという Field.name になる。
ここまでは、難なく理解できた。曖昧な理解のままに放置しているのは、次のような場合だ。
>オイオイ、軽々にセルを統合するなよ!
>面倒臭いことになるだろうが・・・。
と言いたいが、泣く子とユーザーには勝てない。そこで、一体、かかる表の場合は、どういう Field.name になるのかを調査してみた。
? GetFieldName("SELECT * FROM [Sheet5$A1:G100]")
ID;4月;F3;F4;5月;F6;F7;
フムフム。このようになるのか?こういう混在した Field.Name を取得するのは、ある意味で仕方のないこと。 だが、混在しないそれを取得する術もある筈。
混在しない Field.Name を取得するには?
当たり前と言えば、当たり前のことだが、見出しの2行目を読み込めば、2行目の見出しを Field.Name として取得できる。ただし、同じ Field.Name の発生を防ぐために、同じ Field.Name には 1、2 という区別子がアペンドされている。
結局は、1行目の見出しと2行目の見出しを統合することで初めて、正確な表の見出しを知ることが出来るというのが結論だった。本稿を書くことで、初めてこのことを知った。
統合されたセルを持つ表のコピーはサポートしない
統合されたセルを持つ表をコピーするには、次のようなSQL文を実行することになる。
? SQLWriter("SELECT * FROM [Sheet5$A2:G100]","Sheet6")
True
そもそも論になるが、<Sheet5> の表を<Sheet6>にコピーするのにワザワザ SQL文を書くユーザーなんて皆無だろう。SQLWriter の出番は、
1、選択クエリ(結合クエリ、ユニオンクエリを含む)
2、クロス集計クエリ
3、重複クエリ
4、不一致クエリ
5、列番号を連番で発生させる
この5つを実行することに限られるだろう。
種々の事情で、表から複数の条件を設定して新表を作成する場合には、もちろん《選択クエリー》の実行に該当する。その場合は、見出し部だけは、手作業でコピペするという利用方法でもいいんじゃーないだろうか?老体に鞭打って、《統合セルサポートバージョン》の SQLWriter を書く気にはなれない。
そういうことで、ここらで《エクセルの列名を極める》は、幕引きとする。次は、エクセルブック同士や や Access のテーブルの参照ツールについてのよもやま話。