ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Posts Tagged ‘Access2007

Access で年賀状のあて名印刷をするコツ

leave a comment »

この時期、1年間使わなかった年賀状印刷ソフトを久しぶりに起動し、印刷に四苦八苦というところも多いだろう。ところが年に1回しかつかわないソフトの使い方は、どうしても忘れてしまいがちになるのではないか。また今年中にプリンタや周辺機器を買い替えてアプリケーションが対応しなくなったり、もしかしたら昨今のことだから、家に何台もあるパソコンのうち、どれにソフトをインストールしてあったか忘れてしまっている、といったこともあるかもしれない。またそれが調子が悪くて捨ててしまっていた、といったこともあるだろう。

年賀状を印刷するには、いわゆる「宛名印刷ソフト」というものを使う人が多いだろうが、宛名印刷ほど Access に得意な分野はない。そこで、住所データをアクセスにインポートし、宛名印刷をするコツを紹介する。ここでは Microsoft Office Access 2007 で説明するが、他のバージョンでもほぼ同じだ。

まず住所データを用意する。もし宛名印刷ソフトを使っているならデータが取り出せるはずだ。宛名印刷ソフトからデータをエクスポートすると、たとえばこのようなデータになる。これはCSV 形式のデータで、ファイルのフォーマットはテキストファイルと同じ扱いになっている。宛名印刷ソフトによってはエクセル形式でデータを取り出せるものもあるだろうし、データがなければエクセルで作ってもいいだろう。

Access年賀状_001 

<fig.1 : ある宛名印刷ソフトからエクスポートした住所データ>

これを Access にインポートする。まず Access を起動したら「空のデータベース」を作成する。作成する場所は「ドキュメント」で、ファイル名は「年賀状印刷」とでもしておこう。

Access年賀状_002_mid_640

<fig.2 : Access を起動して「空のデータベース」を作成する>

Access年賀状_003_mid_640

<fig.3 : Access のファイル名を「年賀状印刷」として作成する>

Access が起動し、テーブルのデザイン画面になったら、テーブルは作らなくてよいので保存しないで閉じる。次にメニューから「外部データ」のタブを開き、「テキストファイルのインポート」をクリックする。もし用意した住所データがエクセルの場合は「Excel ワークシートのインポート」をクリックする。

Access年賀状_004_mid_640

<fig.4 : テキストファイルのインポートをする>

テキストファイルのインポートを実行すると、インポートするデータを指定するように求められるので、CSV のテキストファイルを保存した「ドキュメント」を指定して、ファイルを選択する。

Access年賀状_005_mid_640

<fig.5 : インポートするテキストファイルを指定する>

Access年賀状_006_mid_640

<Fig.6 : インポートするテキストファイルを保存した「ドキュメント」フォルダからファイル名を選択する>

ファイル名を指定したら「テキストインポートウィザード」がはじまる。このウィザードでは、データの形式を自動で読み取り、適切な形式に判断してくれるので、基本的には「次へ」の連続でうまくいく。ただ、郵便番号のフィールドは、場合によっては数値と判断される場合があるので、テキストになっていることを確認しよう。もし数値と判断されてしまったら、たとえば番号の最初の数字が「0」の場合、その「0」が失われて桁が小さくなるし、後でやる「郵便番号の前と後ろの切り離し」がやりにくくなる。

Access年賀状_007_mid_640

<fig.7 : テキストインポートウィザードでデータ区切りを指定する>

Access年賀状_008_mid_640

<fig.8 : データインポートウィザードでテキストの保存形態を確認する>

Access年賀状_009_mid_640

<fig.9 : データインポートウィザードでデータの型を確認する>

データの型、特に郵便番号のフィールドが「数値」ではなく「テキスト」になっていることを確認し、次へすすむと主キーの設定になる。ここでは「主キーを自動的に設定する」にして連番を自動で割り当てることとする。

Access年賀状_010_mid_640

<fig.10 : テキストインポートウィザードで主キーを自動的に設定する>

インポートウィザードが終了すると、インポートしたデータのテーブル名を指定する。ここでは自動的に割り当てられた「住所エクスポート」のままでいいだろう。

Access年賀状_011_mid_640

<fig.11 : テキストインポートウィザードでインポート先のテーブル名を指定する>

インポートウィザードを終了すると、このインポート操作を保存するかを聞かれる。もし何度も同じ操作をする可能性があるなら保存をするが、このような場合は保存しなくていいだろう。

Access年賀状_012_mid_640

<fig.12 : テキストインポートウイザードでインポート操作の保存ができる>

データのインポートができた。このままではフィールド名がわかりにくいので、テーブルをデザインしてフィールド名を「宛名」、「郵便番号」、「住所」に変えよう。

Access年賀状_013_mid_640

<fig.13 : 住所データがインポートできた>

Access年賀状_014_mid_640_480

<fig.14 : テーブルをデザインビューにしてフィールド名を変更する>

Access年賀状_015_mid_640

<fig.15 : テーブルをデザインビューにしてフィールドを「宛名」、「郵便番号」、「住所」に変更する>

Access年賀状_016_mid_640

<fig.16 : 「住所エクスポート」テーブルのフィールド名を変更した>

次に、このテーブルをもとにして、はがきの宛名印刷に使いやすいデータをクエリで加工する。「作成」タブの「クエリデザイン」で新しいクエリを作成しよう。クエリを作成すると、どのテーブルのデータからデータを取得するかを選択する。ここでは「郵便番号住所」のデータしかないので、それだけが選択できる。

Access年賀状_017_mid_640

<fig.17 : 「作成」タブの「クエリデザイン」で新しいクエリを作成する>

Access年賀状_018_mid_640

<fig.18 : クエリデザインでテーブルを選択する>

Access年賀状_019_mid_640

<fig.19 : 新しいクエリにテーブルが関連付けられた>

新しいクエリにテーブル「住所エクスポート」が関連付けられたら、表示するフィールドを選んでいく。ここで単にフィールドを「宛名」、「郵便番号」、「住所」と選択してもいいが、後で印刷画面のレポートを作りやすくするために、フィールドを少し加工しよう。

宛名には「様」を付けたいので、全角スペースをひとつ挟んで「様」を表示するようにする。郵便番号は前の 3桁と後ろの 4桁を分離する。住所はそのままでいいだろう。このように表示するには、「フィールド」を次のように記述する。

———————————

宛名様: [宛名] & " " & "様"
郵便番号前: Left([郵便番号],3)
郵便番号後: Right([郵便番号],4)
住所

———————————

まず最初のフィールドに「宛名様」とするのは、フィールドの別名だ。そのあとに「:」をはさんで表示するデータを記述する。「&」は文字列をつなぐ演算子で、” ”は全角のスペースをひとつ挟んでおり、次の「&」で”様”の文字をつないでいる。

次のフィールドの別名は「郵便番号前」とし、「:」ではさんで Left([郵便番号],3) とするのは、「郵便番号」のフィールドのデータを左から、つまり前から3文字だけ表示する関数だ。同様に次のフィールドは別名を「郵便番号後」とし、「:」ではさんで Right([郵便番号],4) としている。これは「郵便番号」のフィールドのデータを右から、つまり後から4文字だけ表示する関数だ。これで郵便番号の前と後ろを別のフィールドで表示し、区別できる。

「住所」フィールドはそのまま使えばよいだろう。

Access年賀状_020_mid_640

<fig.20 : 表示するフィールドの式を記述する>

フィールドの式が記述できたらクエリを保存する。「印刷用クエリ」の名前にしよう。

Access年賀状_021_mid_640

<fig.21 : クエリを保存する>

クエリが保存できたらデータを確認しよう。宛名にはスペースをはさんで「様」が、郵便番号は前 3桁と後 4桁が別フィールドで分離されて表示されているはずだ。

Access年賀状_022_mid_640

<fig.22 : 「印刷用クエリ」のデータを確認する>

次に印刷用のレポートを作成する。「作成」タブから「レポートデザイン」で空白のレポートを作成する。空白のレポートでは自動的に「ページヘッダー」と「ページフッター」ができるが、年賀状印刷にヘッダーやフッターは必要ないので削除する。ヘッダーとフッターを削除するには、

Access年賀状_023_mid_640

<fig.23 : 「作成」タブから「レポート」「レポートデザイン」で新しい空白のレポートを作成する>

Access年賀状_024_mid_640

<fig.24 : レポートの「ページヘッダー」と「ページフッター」を削除する>

次にレポートに対してデータを割りつける。レポートのビューでは、左上の「■」をポイントするとレポート全体を選択したことになるので、その状態で「プロパティシート」から「データ」タブの「レコードソース」をクリックして関連付けるテーブルまたはクエリを選択する。ここでは「印刷用クエリ」を選択する。

Access年賀状_025_mid_640

<fig.25 : レポートに対してレコードソースを割り当てる>

次にレポートにフィールドを追加する。「デザイン」タブから「既存のフィールドの追加」をクリックすると、レポートに関連付けられた「印刷用クエリ」の各フィールドを選択できるので、レポートにドラッグしてフィールドを追加する。

あるいは「デザイン」タブの「コントロール」から「テキストボックス」をレポートにドラッグし、後でフィールドのデータを関連付けてもいいだろう。

フィールドを画面に追加すると、フィールド名のラベルも同時にできるが、必要ないので削除する。

Access年賀状_026_mid_640

<fig.26 : レポートにフィールドを追加する>

Access年賀状_027_mid_640

<fig.27 : 不要なラベルを削除した>

次に、1ページごとに改ページされる設定をする。それには「詳細」のセクションを選択したまま「プロパティシート」で「改ページ」を「カレントセクションの前」に変更する。これで 1レコードずつ改ページされて印刷されるようになる。

Access年賀状_028_mid_640

<fig.28 : 「詳細」セクションを改ページするように設定する>

後は用紙のサイズを「はがき」にし、各フィールドのフォントや文字の大きさ、位置を調節するだけだ。フォントは、郵便番号は「MS Pゴシック」に、住所と宛名は「HG教科書体」がおすすめだ。文字の大きさは「郵便番号前」を 16ポイント、「郵便番号後」を 14ポイント、「住所」を 12ポイント、「宛名様」を 22ポイントとしてみた。

レポートデザインのコツとして、印刷の余白はできるだけ小さくしておくことがある。「郵便番号前」と「郵便番号後」のフィールドは、年賀はがきの郵便番号枠に収まるようにするために「文字配置」を「均等割り付け」にするとよい。また住所のフィールドは、長い住所もあるので大きめにしておき、さらに切手印刷に重ならないようにレイアウトする。「宛名様」のフィールドはハガキの中央に収まるように「文字配置」を「中央」にするとよいだろう。

Access年賀状_029_mid_640

<fig.29 : フィールドの文字フォントと文字の大きさを設定する>

「印刷プレビュー」でおおまかなレイアウトを確かめながらデザインする。だいたいのレイアウトができたら、A4サイズの用紙を 4つに切って葉書大にし、印刷する。印刷した紙を年賀葉書に重ねて位置を確認する。プリンタによって印刷する位置に違いがあるので、ここは何度かやってみながら調節するしかない。

Access年賀状_030_mid_640

<fig.30 : 「印刷プレビュー」でレイアウトを確認する>

IMG_4099_mid_640_480

<fig.31 : 普通の紙に印刷して年賀葉書に重ねて位置を確かめる>

おおむね位置があえば、年賀葉書をプリンタにセットして印刷する。ここでも一度に印刷せず、何枚か試し印刷をし、郵便番号の位置などレイアウトがうまく印刷されるか確認しながらしよう。最終調整だ。あっていなければフィールドサイズを変えたり、フィールドの位置を動かしたりしてベストの位置に修正しよう。

IMG_4098_mid_640_480

<fig.32 : 郵便番号の位置を確認しながら印刷する>

このように説明すると手間がかかるようだが、Access がある程度わかっているなら簡単だ。住所データさえあれば 15分もあれば印刷できる状態まで作れるだろう。

作業手順とコツをまとめると次のようになる。

(1)データをインポートする。このとき郵便番号を数値にせずテキストでインポートする。
(2)データをそのまま使わず、宛名を「様」付きにしたり郵便番号を前と後ろに分けるクエリを作る。
(3)レポートを作ってクエリを割り当てる。ページのヘッダーとフッターを削除し、詳細セクションを改ページする。
(4)フィールドの大きさやフォント、文字の大きさをレイアウトする。文字位置を「均等割り付け」や「中央」で工夫する。
(5)試し印刷を念入りにして、文字の大きさや郵便番号の位置を丁寧にあわせる。

Access は複数ページにわたる帳票印刷が得意だ。これは葉書印刷にも活かせるので、ぜひ Access で年賀状印刷をやって欲しい。そしてこの年賀状印刷のコツは他の帳票印刷でも使えるはずだ。

広告

Written by Yoshio Matsumoto

2014年12月30日 at 1:05 PM

郵便番号データを SQL Server で利用するには(2) – データ変換サービス DTS を使わず Access を利用してデータを SQL Server に取り込む

leave a comment »

SQL Server に Excel や Access、CSV形式などのテキストファイルを取り込むために、データ変換サービス、DTS がある。だがデータ変換サービスはデータ型に厳密であるなど、実際の運用においては使いにくい面もある。そこでデータ変換サービス DTS を使わず、Access を利用してデータを SQL Server に取り込むことを紹介する。Access を使うと、取り込みたいデータを確認しながら作業ができるので、データ型やフィールドサイズが不明の場合でも対応しやすい。

ここで SQL Server に取り込みたいデータが、日本郵便からダウンロードできる全国郵便番号であるとする。郵便番号データのダウンロードについては、前回の blog を参考にしてほしい。

 

ダウンロードした csv データファイルを Access に取り込むため、まず Access を起動して空のデータベースを作成する。ここで使用した Access のバージョンは Microsoft Office Access 2007 だが、違うバージョンでもうまくいくはずだ。Access データベースファイルを作成する場所はローカルコンピュータのドキュメントなど適当な場所でいい。

SQL_DTS_Access_001_mid_640

<Fig.1 : Microsoft Office Access 2007 を起動して空のデータベースを作成する。

空のデータベースを作成したら、リボンメニューの「外部データ」から「テキストファイルのインポート」を実行する。日本郵便からダウンロードしたデータが、csv 形式のテキストファイルだからだ。

SQL_DTS_Access_002_mid_640

<Fig.2 : 「外部データ」メニューの「テキストファイルのインポート」を実行する>

データのインポートはウイザードに従ってすすめる。「データのインポート元とインポート先、またはリンク元とリンク先の選択」でデータをインポートする郵便番号ファイルを選択し、データの保存方法は「現在のデータベースの新しいテーブルにソースデータをインポートする」を選ぶ。

SQL_DTS_Access_003_mid_640

<Fig.3 : データのインポート元とインポート先、またはリンク元とリンク先の選択>

ファイルを指定したら読み込むデータが表示されるので、データの区切り形式を選択する。データの区切りは「区切り記号付き」を選ぶ。

SQL_DTS_Access_004_mid_640

<Fig.4 : データインポートウィザードでデータの区切り形式を選択する>

次にフィールド区切り記号を選択する。フィールド区切り記号は「カンマ」を指定する。また「先頭行をフィールド名として使う」オプションは、読み込まれたデータを見てフィールド名に相当するデータがないので、チェックを外す。

SQL_DTS_Access_005_mid_640

<Fig.5 : フィールド区切り記号の選択と先頭行をフィールド名として使うかの選択>

次に読み込むフィールドのフィールド名や型を設定する。Access が読み取ったデータからフィールドの型を類推して決めてくれるが、郵便番号は数値として判断される場合がある。確かに郵便番号は数値なのだが、数値として読み取った場合は先頭のゼロが無視されてしまうので、郵便番号のフィールドは「テキスト型」に変更しておく。

SQL_DTS_Access_006_mid_640

<Fig.6 : フィールドのオプションを設定する>

主キーの設定では、ここでインポートするデータの主キーが不明であるので、「主キーを自動的に設定する」を選んでおく。こうすれば自動的に「ID」のフィールドが作られ、連番が与えられる。

SQL_DTS_Access_007_mid_640

<Fig.7 : 主キーの設定>

インポートウィザードの最終場面では、インポート先のテーブル名を記述する。ここではファイル名から自動的に割り当てられた「KEN_ALL」の名前とした。

SQL_DTS_Access_008_mid_640

<Fig.8 : インポート先のテーブルの指定>

インポートが完了したら、「インポート操作の保存」の画面になる。同じインポート操作を後で繰り返したい場合は、ここで「インポート操作の保存」にチェックをしておくと、簡単に再現できる。ここでは繰り返ししないつもりなので、チェックをしないでおく。

SQL_DTS_Access_009_mid_640

<Fig.9 : インポート操作の保存>

インポートウィザードが終わったら、インポートデータは新たに生成した「KEN_ALL」テーブルに保存されている。テーブルの下部にはレコード数が 123,708 件であることがわかる。

SQL_DTS_Access_010_mid_640

<Fig.10 : インポートウィザードを終了しデータをインポートした>

読み込んだ「KEN_ALL」テーブルのデータを見ると、フィールド1 は意味がよくわからない何らかの管理番号になっているようだ。フィールド2 は郵便番号の前部分、フィールド3 は郵便番号の全6桁、フィールド4 からフィールド6 が住所の読み仮名、フィールド7 からフィールド9 が住所になっている。フィールド10 から15 は何らかの管理フラグだ。

データ構造がわかったら、これに相当するテーブルを SQL Server に作る。CREATE 文は次のようなものとした。

——————————————————————————-

CREATE TABLE 郵便番号住所2(
    管理番号 int NULL,
    プレ郵便番号 varchar(7) NULL,
    郵便番号 char(7) NULL,
    都道府県カナ nvarchar(7) NULL,
    市区町村カナ nvarchar(25) NULL,
    住所それ以降カナ nvarchar(80) NULL,
    都道府県 nvarchar(10) NULL,
    市区町村 nvarchar(25) NULL,
    住所それ以降 nvarchar(80) NULL,
    管理フラグ1 char(1) NULL,
    管理フラグ2 char(1) NULL,
    管理フラグ3 char(1) NULL,
    管理フラグ4 char(1) NULL,
    管理フラグ5 char(1) NULL,
    管理フラグ6 char(1) NULL
)

——————————————————————————-

SQL_DTS_Access_011_mid_640

<Fig.11 : SQL Server Management Studio で郵便番号住所をストアするテーブルを作る>

次に Access を SQL Server のテーブルに「リンクテーブル」として接続する。リボンメニューの「外部データ」から「その他」をクリックし「ODBC データベース」を実行する。

SQL_DTS_Access_012_mid_640

<Fig.12 : リボンメニューの「外部データ」から「その他」をクリックし「ODBC データベース」を実行する

外部データの取り込みウィザードがはじまる。日本郵便のサイトからダウンロードした csv のテキストファイルは Access に取り込んだが、ここでは SQL Server のテーブルにリンクするために「リンクテーブルを作成してソースデータにリンクする」を選択する。

SQL_DTS_Access_013_mid_640

<Fig.13 : 外部データの取り込みウィザードでリンクテーブルを作成してソースデータにリンクする>

「データソースの選択」では、適切な SQL Server へのデータソースがあれば選択するだけでいいが、なければ新規作成する。DNS 名のところの「新規作成」ボタンをクリックする。

SQL_DTS_Access_014

<Fig.14 : データソースの選択>

セットアップするデータソースのドライバーを選択する。接続したい SQL Server を選択して「次へ」をクリックする。

SQL_DTS_Access_015

<Fig.15 : セットアップするデータソースのドライバーを選択する>

データソース名を決めて入力する。データソース名は、後で見てわかるような、適当な名前でいい。

SQL_DTS_Access_016

<Fig.16 : データソース名を決めて入力する>

データソースが作成される。「完了」をクリックする。

SQL_DTS_Access_017

<Fig.17 : データソースの作成>

接続する SQL Server を選択する。「サーバー」テキストボックスの右端▼をクリックすると、利用できる SQL Server が選択できるので、テーブルを作成した SQL Server を選択して「次へ」をクリックする。

SQL_DTS_Access_018

<Fig.18 : 接続する SQL Server を選択する>

SQL Server のログイン認証を選択する。「ネットワークへのログイン ID で、Windows NT の認証メカニズムを使う」はいわゆるWindows 統合認証で、「ユーザーが入力する SQL Server 用のログイン ID とパスワードを使う」は SQL Server にユーザーを作ってログインするものだ。作業している環境によるが、ここでは前者のログインで利用するものとする。

SQL_DTS_Access_019

<Fig.19 : SQL Server のログイン認証を選択する>

既定のデータベースを設定する。郵便番号住所テーブルを作成したデータベース名は「test」だったので、それを選択する。

SQL_DTS_Access_020

<Fig.20 : 既定のデータベースを設定する>

これでデータソースの作成を完了する。

SQL_DTS_Access_021

<Fig.21 : データソースの作成を完了する>

データソースが作成されたら、データソースの詳細が表示される。ここで「データソースのテスト」をクリックすると、SQL Server に接続テストをすることができる。

SQL_DTS_Access_022

<Fig.22 : データソースの作成完了とテスト>

データソースの接続テストが成功した。

SQL_DTS_Access_023

<Fig.23 : SQL Server へのデータソースの接続テスト>

データ接続ができたら、リンクしたいテーブルを指定する。ここでは「郵便番号住所2」テーブルに接続したい。

SQL_DTS_Access_024

<Fig.24 : テーブルのリンク>

リンクテーブルが作成できた。リンクテーブルは地球のようなアイコンで、画面の左側「すべてのテーブル」に「dbo.郵便番号住所2」の名前で表示されている。このテーブルは Access 上に実体はなく、SQL Server のテーブルにリンクしている。

SQL_DTS_Access_025_mid_640

<Fig.25 : リンクテーブルの作成完了>

リンクテーブル「dbo.郵便番号住所2」を開くと、SQL Server 上のデータを見ることができる。まだデータは入っていないので、一件もデータがない。

SQL_DTS_Access_026_mid_640

<Fig.26 : リンクテーブル「dbo.郵便番号住所2」を開いてデータを確かめる>

リンクテーブルが作成できたら、Access にインポートしたデータを、リンクテーブル「dbo.郵便番号2」へコピーする。Access でテーブルへデータをコピーするとき、簡単なのは「追加クエリ」を作成することだ。

「新しいクエリ」を作成し、テーブル「KEN_ALL」を元データとする。画面に表示された「KEN_ALL」テーブルの各フィールドを下段にドラッグし、表示させる。

SQL_DTS_Access_027_mid_640

<Fig.27 : 新しいクエリを作りフィールドを表示させる>

次にこのクエリを「追加クエリ」にする。Access では SQL 文を使ってデータを追加することもできるが、単純にテーブルからテーブルへデータを追加する場合は、追加クエリを使うと便利だ。

クエリを追加クエリにするには、クエリの編集画面で「デザイン」メニューの「+!」のアイコン、「追加」をクリックする。すると「追加」のウインドウが表示され、追加先のテーブルを選択するようになる。追加先はリンクテーブル「dbo.郵便番号2」を選択する。

SQL_DTS_Access_028_mid_640

<Fig.28 : クエリを追加クエリにする>

SQL_DTS_Access_029_mid_640

<Fig.29 : 追加クエリの設定で追加先のテーブルを選択する>

dbo.郵便番号2」をクエリを追加クエリにすると、画面の下部に表示されたフィールドの下の項目が変わる。単なる選択クエリの場合は、「フィールド」、「テーブル」、「並べ替え」、「表示」、「抽出条件」、「または」となっているが、追加クエリにすると「表示」の項目はなくなり、かわりに「レコードの追加」が表示される。これは、データを追加するテーブルのどのフィールドに追加するかを選択する項目だ。各フィールドの「レコードの追加」クリックすると、追加先に設定した「dbo.郵便番号2」の各フィールドが表示されるので、追加したい適切なフィールドを選択し決定していく。追加しなくてもよいフィールドは指定しなくていい。

ここで作成した SQL Server の「dbo.郵便番号2」の場合、「KEN_ALL」テーブルの各フィールドに対して、「ID」を「管理番号」に、「フィールド1」は指定せず、「フィールド2」を「プレ郵便番号」に、以降、フィールド3から「郵便番号」以降を順に設定する。

SQL_DTS_Access_030_mid_640

<Fig.30 : クエリを追加クエリにした>

SQL_DTS_Access_031_mid_640

<Fig.31 : 追加クエリの各フィールドに追加先のフィールドを設定する>

追加クエリができたら保存する。クエリ名は「郵便番号住所の追加」とした。

SQL_DTS_Access_032_mid_640

<Fig.32 : 追加クエリを保存する>

追加クエリが保存できたら、「すべてのテーブル」にあるクエリの名前「郵便番号住所の追加」をダブルクリックする。「追加クエリを実行すると、テーブルのデータが変更されます」となるので「はい」をクリックする。次に追加されるデータの件数が表示されるので、間違いなければ「はい」をクリックする。

SQL_DTS_Access_033_mid_640

<Fig.33 : 保存した追加クエリ「郵便番号住所の追加」をダブルクリックして実行する>

SQL_DTS_Access_034_mid_640

<Fig.34 : 追加クエリを実行してテーブルにデータを追加する>

SQL_DTS_Access_035_mid_640

<Fig.35 : 追加されるデータの件数が表示される>

この追加クエリは、SQL の INSERT 文になっている。SQL 文を確かめるには、追加クエリをデザインし「SQL ビュー」にするといい。次のような SQL 文が生成していることがわかる。

——————————————————————————-

INSERT INTO dbo_郵便番号住所2 ( 管理番号, プレ郵便番号, 郵便番号, 都道府県カナ
              , 市区町村カナ, 住所それ以降カナ, 都道府県, 市区町村, 住所それ以降
              , 管理フラグ1, 管理フラグ2, 管理フラグ3, 管理フラグ4, 管理フラグ5, 管理フラグ6 )
SELECT KEN_ALL.ID, KEN_ALL.フィールド2, KEN_ALL.フィールド3, KEN_ALL.フィールド4
              , KEN_ALL.フィールド5, KEN_ALL.フィールド6, KEN_ALL.フィールド7, KEN_ALL.フィールド8
              , KEN_ALL.フィールド9, KEN_ALL.フィールド10, KEN_ALL.フィールド11, KEN_ALL.フィールド12
              , KEN_ALL.フィールド13, KEN_ALL.フィールド14, KEN_ALL.フィールド15
FROM KEN_ALL;

——————————————————————————-

SQL_DTS_Access_037_mid_640

<Fig.36 : 追加クエリを SQL ビューで確認する>

追加クエリを実行すると、Access にインポートされたデータが SQL Server に追加されているはずだ。「dbo.郵便番号住所2」のリンクテーブルを開いたままなら、一度閉じて再度開くと最新のデータが表示される。

SQL_DTS_Access_038_mid_640

<Fig.37 : 「dbo.郵便番号住所2」のリンクテーブルを開いてインポートされたデータを表示する>

SQL Server Management Studio で直接 SQL Server のテーブルを確かめても、データがインポートされたことが確認できる。

SQL_DTS_Access_039_mid_640

<Fig.38 : SQL Server Management Studio でインポートされたデータを確認する>

このように、Access を使って SQL Server にデータをインポートすることができる。まず Access に CSV データを取り込み、次に「リンクテーブル」で Access を SQL Server に接続し、「追加クエリ」でデータを追加するのだ。

Access の追加クエリは画面上でフィールドを選択することで視覚的にテーブルからテーブルにデータを追加することができるので、SQL Server のデータ処理に使ってもいいだろう。

Access – レコードソースを設定せずテキストボックスに入力した文字列によってSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する

leave a comment »

前回、前々回に、アクセスのフォームやレポートでレコードソースをプロパティに設定せず、VBAからSQL文によってレコードソースを指定してデータを取得する方法の概要をまとめてみた。

「Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9avba%e3%81%a7%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%ac%e3%82%b3/

「Access – レコードソースを設定せずSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9asql%e6%96%87%e3%81%a7%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e7%b5%9e%e3%82%8a/

今回はVBAによってフォームのテキストボックスに入力した文字列によってSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する方法をまとめてみる。

テーブルのサンプルデータは、テーブル構造は前回までの説明で使ったものと同じだが、少しデータを増やした以下のようなものを使う。

Access_SQL_023

<Fig 1 : 絞り込み検索をするテストデータ>

検索するためのフォームは、新しい空白のフォームを作成し、フォームヘッダーを作成する。フォームヘッダーにはテキストボックスをひとつ、ボタンを2つ作成する。テキストボックスは非連結で、名前を「検索氏名」としておく。ボタンの表題には、それぞれ「全文一致」と「部分一致」とする。

詳細にはデータ表示のためのテキストボックスを3つ作成する。フォームのプロパティにはレコードソースを設定しないが、それぞれのテキストボックスのプロパティでコントロールソースには各フィールド、すなわち「学籍番号」、「氏名」、「性別」を記述しておく。

Access_SQL_024

<Fig 2 : データを検索して表示するフォームをデザインする>

フォームのデザインができたら、ボタンのイベントハンドラにVBAコードを書こう。コードを書くにはボタンを選択してプロパティシートの「イベント」タブで「クリック時」のイベントを「・・・」をクリックする。「ビルダーの選択」ウィンドウが表示されたら「コードビルダー」を選択して「OK」をクリックする。

「全文一致」ボタンのイベントハンドラには次のコードを記述する。

———————————————————————————

Me.RecordSource = "select * from 生徒1 where 氏名 = ‘" & 検索氏名 & "’"

———————————————————————————

ここで記述するSQL文は、select * from 生徒1 where 氏名 = (「検索氏名」テキストボックスのテキスト)、であるが、「検索氏名」テキストボックスの記述方法は、ダブルクォーテーションで囲まれたSQL文の外に「&」演算子で接続する。検索氏名の実態はテキストなのでシングルクォーテーションで囲む。したがって「&」で挟まれる「検索氏名」テキストボックスの記述の前後は、シングルクォーテーションとダブルクォーテーションで挟まれることになる。

次に「部分一致」ボタンのイベントハンドラには次のコードを記述する。

———————————————————————————

Me.RecordSource = "select * from 生徒1 where 氏名 like ‘*" & 検索氏名 & "*’"

———————————————————————————

ここで記述するSQL文は、select * from 生徒1 where 氏名 like *(「検索氏名」テキストボックスのテキスト)*、である。「検索氏名」に入力された文字列の前後を「*」で囲み、文字列を含む指定にする。上と同様に「検索氏名」テキストボックスの記述方法は、ダブルクォーテーションで囲まれたSQL文の外に「&」演算子で接続するので、「&」で挟まれる「検索氏名」テキストボックスの記述の前後は、シングルクォーテーションとアステリスク、そしてダブルクォーテーションで挟まれることになる。

VBAコードの全文は次のようになる。

———————————————————————————

Private Sub コマンド1_Click()
    Me.RecordSource = "select * from 生徒1 where 氏名 = ‘" & 検索氏名 & "’"
End Sub

Private Sub コマンド2_Click()
    Me.RecordSource = "select * from 生徒1 where 氏名 like ‘*" & 検索氏名 & "*’"
End Sub

———————————————————————————

Access_SQL_025
<Fig 3 : ボタンのイベントハンドラにVBAでSQL文を記述する>

コードを記述したらフォームを開いてみよう。フォームが開いた時点ではレコードソースが指定されていないので、データは何も表示されず、テキストボックスは「#Name?」となってエラー表示になる。

「検索氏名」に文字列を入力し、「全文一致」か「部分一致」のボタンをクリックする。たとえば「織田 信長」のようにフルネームを入力し「全文一致」ボタンかまたは「部分一致」ボタンをクリックすると「織田 信長」のレコードだけが表示される。「徳川」のように氏名の一部だけ入力したときは、「全文一致」では何も表示されず、「部分一致」のボタンをクリックしたときに、部分一致したデータが表示される。

Access_SQL_026

<Fig 4 : フォーム「生徒フォーム」を開いてもデータは何も表示されない>

Access_SQL_027

<Fig 5 : 「検索氏名」テキストボックスに「織田 信長」と入力して「全文一致」または「部分一致」ボタンをクリックした>

Access_SQL_028

<Fig 6 : 「検索氏名」テキストボックスに「徳川」と入力して「全文一致」ボタンをクリックしてもデータは表示されない>

Access_SQL_029

<Fig 7 : 「検索氏名」テキストボックスに「徳川」と入力して「部分一致」ボタンをクリックして3件のレコードが表示された>

Written by Yoshio Matsumoto

2011年12月26日 at 11:32 PM

Access – レコードソースを設定せずSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する

with 3 comments

Accessでフォームやレポートを作りデータを表示するとき、一般的にはレコードソースをフォームのプロパティに指定するが、レコードソースを設定せずにフォームやレポートを作成し、VBAで動的にレコードソースを指定するとSQL文が使える。SQLに熟練しているなら、この方法で自由にレコードソースを扱うことができ、応用しやすい。

レコードソースを設定せずにフォームを作りVBAでSQL文を書き動的にデータを取得する方法の概要は以下のページを見てほしい。

「Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9avba%e3%81%a7%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%ac%e3%82%b3/

さて、ここで使うSQL文にデータを絞り込むものを使ってみよう。たとえば「男」のデータだけ取得する次のようなSQL文だ。

——————————————————————————–

select 学籍番号,氏名,性別 from 生徒1 where 性別 = 男

——————————————————————————–

まずテーブル「生徒1」に次のようなデータを用意する。

Access_SQL_016

<Fig 1 : テーブル「生徒1」に用意したサンプルデータ>

フォームの作成でレコードソースを指定せずに「生徒フォーム」を作成する。新しいフォームができたらデザインビューにし、「フォームヘッダー/フッター」を作り、フォームの既定のビューを「帳票フォーム」に変更する。フォームヘッダーと詳細の高さを調節する。

次に「詳細」エリアにテキストボックスを3つ作る。各テキストボックスは、プロパティの「データ」タブ「コントロールソース」に、それぞれ表示させたいフィールド名「学籍番号」、「氏名」、「性別」を記述する。通常レコードソースを設定したフォームの編集では、ここでテーブルのレコードソースが表示されドロップダウンリストから選択できるが、ここではレコードソースが設定していないのでリスト表示はされない。キーボードから文字入力でフィールドを設定しておく。

そしてフォームヘッダーには3つボタンを作成する。ボタンの「表題」はそれぞれ「全部」、「男だけ」、「女だけ」としておこう。

Access_SQL_017

<Fig 2 : データを取得するフォームをデザインする>

そしてボタンのクリックイベントに以下のVBAコードを記述する。このときSQL文では、スタティックな文字列はシングルクォーテーション「’」で囲む。

———————————————————————————

Private Sub コマンド1_Click()
    Me.RecordSource = "select 学籍番号,氏名,性別 from 生徒1"
End Sub

Private Sub コマンド2_Click()
    Me.RecordSource = "select 学籍番号,氏名,性別 from 生徒1 where 性別 = ‘男’"
End Sub

Private Sub コマンド3_Click()
    Me.RecordSource = "select 学籍番号,氏名,性別 from 生徒1 where 性別 = ‘女’"
End Sub

———————————————————————————

Access_SQL_018

<Fig 3 : ボタンのクリックイベントにVBAでSQL文を書く>

このフォームを実行すると、フォームを開いたときにはレコードソースが設定されていないのでテキストボックスにはエラーが表示され、「全部」のボタンをクリックすると全てのデータが、「男だけ」では男のデータだけ、「女だけ」では女のデータだけが表示される。

Access_SQL_019

<Fig 4 : フォームを開いたところ>

Access_SQL_020

<Fig 5 : 「全部」ボタンをクリックして全件データを取得した>

Access_SQL_021

<Fig 6 : 「男だけ」ボタンをクリックして男のデータだけを取得した>

Access_SQL_022

<Fig 7 : 「女だけ」ボタンをクリックして女のデータだけを取得した>

Written by Yoshio Matsumoto

2011年12月25日 at 3:25 PM

Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する

with 4 comments

アクセスのフォームやレポートは通常レコードソースをプロパティ値に設定してデータを表示する。しかしあらかじめレコードソースを設定しなくても、VBAを使って動的にレコードソースを設定し、データを表示することができる。このときレコードソースの記述がSQL文でできるので、SQLを使ったレコード操作に慣れた人には、このVBAを使った処理はわかりやすく、応用しやすいだろう。たとえばこんなかんじだ。

まずAccessデータベース上に2つのテーブル「生徒1」と「生徒2」を作ってみる。テーブルのフィールドはどちらも同じ構造とし、「学籍番号」、「氏名」、「性別」があるとする。しかしデータの内容は違う。

Access_SQL_001

<Fig 1 : 「生徒1」テーブルを作成する>

Access_SQL_002

<Fig 2 : 「生徒2」テーブルを作成する>

テーブルを作成し適当なデータを作れば、次にフォームを作成する。Access2003の場合は「挿入」-「フォーム」で「新しいフォーム」ウィンドウを開き「基になるテーブルまたはクエリの選択」を空白にしたまま「デザインビュー」をクリックする。Access2007とAccess2010の場合は「作成」-「空白のフォーム」をクリックする。

新しいフォームができたらデザインビューにし、「フォームヘッダー/フッター」を作り、フォームの既定のビューを「帳票フォーム」に変更する。フォームヘッダーと詳細の高さを調節する。フォームの名前は「生徒フォーム」として保存しておこう。

Access_SQL_003

<Fig 3 : レコードソースを指定しないフォームを作る>

ここでいちどフォームを「フォームビュー」にして表示してみよう。レコードソースが指定されておらず、テキストボックスもなにもないので、単に真っ白な画面が表示されるだけである。

Access_SQL_004

<Fig 4 : レコードソースを指定しないフォームを表示した>

次に「詳細」エリアにテキストボックスを3つ作る。各テキストボックスは、プロパティの「データ」タブ「コントロールソース」に、それぞれ表示させたいフィールド名を記述する。通常レコードソースを設定したフォームの編集では、ここでテーブルのレコードソースが表示されドロップダウンリストから選択できるが、ここではレコードソースが設定していないのでリスト表示はされない。キーボードから文字入力でフィールドを設定する。

Access_SQL_005

<Fig 5 : 「学籍番号」、「氏名」、「性別」のテキストボックスを作成する>

テキストボックスを作成したら、もういちどフォームを開いてみよう。もちろんレコードソースが指定されていないので、データは何も表示されない。各フィールドには「#Name?」というエラーが表示されている。

Access_SQL_006

<Fig 6 : データソースが指定されていないフォームを開いたので「#Name?」エラーが表示される>

次にデータソースをVBAで記述するコードを書くが、このコードをボタンのクリックイベントで実行させることにする。そのためにフォームのフォームヘッダーに2つボタンを作成する。ボタンの「表題」はそれぞれ「生徒1データ」、「生徒2データ」としておこう。

Access_SQL_007

<Fig 7 : フォームヘッダーにボタンを2つ作り表題を設定した>

次にVBAコードを書くため、「生徒1データ」の表題を書いたボタンを選択し、プロパティの「イベント」タブから「クリック時」の横の「・・・」をクリックする。すると「ビルダーの選択」ウィンドウが表示されるので、「コードビルダー」を選択して「OK」をクリックする。

Access_SQL_008

<Fig 8 : ボタンのクリック時イベントをVBAで記述するためにコードビルダーを開く>

コードビルダーが開いたら、クリックイベントに対応するイベントプロシージャができている。ここに次のコードを書く。

——————————————————————————–

Me.RecordSource = "select 学籍番号,氏名,性別 from 生徒1"

——————————————————————————–

ダブルクオーテーションで挟まれた部分は単純なSQL文である。

Access_SQL_009

<Fig 9 : コードビルダーでイベントプロシージャを表示する>

Access_SQL_010

<Fig 10 : コードビルダーにレコードソースを指定するコードを書く>

コードが書けたらフォームを開いてみよう。フォームを開いた時点ではレコードソースが指定されていないので、各テキストボックスには「#Name?」のエラーが表示されているが、「生徒1データ」ボタンをクリックすると「生徒1」テーブルを指定したクエリが実行され、データが表示される。

Access_SQL_011

<Fig 11 : レコードソースを指定しないフォームを開く>

Access_SQL_012

<Fig 12 : 「生徒1データ」ボタンのクリックでレコードソースを指定し「生徒1」テーブルのデータを表示した>

では次に「生徒2データ」ボタンのクリックイベントで「生徒2」テーブルからデータを取得するレコードソースを記述しよう。SQL文のfrom句でテーブル名を変更するだけだ。

Access_SQL_013

<Fig 13 : 「生徒2データ」ボタンのイベントプロシージャにレコードソースを指定するコードを書く>

これで「生徒1データ」ボタンをクリックすると「生徒1」テーブルのデータを表示し、「生徒2データ」ボタンをクリックすると「生徒2」テーブルのデータを表示するフォームができた。

Access_SQL_014

<Fig 14 : 完成したフォームを開き「生徒2データ」ボタンをクリックすると「生徒2」テーブルのデータが表示される>

Access_SQL_015

<Fig 15 : 完成したフォームを開き「生徒1データ」ボタンをクリックすると「生徒1」テーブルのデータが表示される>

このようにフォームやレポートをデータソースの指定なしに作成し、ボタンクリックなどで動的にレコードソースを指定してデータを表示させることができる。ここで重要なことは、レコードソースの記述が一般的なSQL文で記述できることである。SQL文に習熟したものなら、自由にレコードセットを記述してフォームやレポートに動的に表示させることができる。とてもわかりやすい。

Written by Yoshio Matsumoto

2011年12月25日 at 2:08 PM