2.フォームの作成
フォームの作成手順は、 Myパートの契約の契約管路(フォーム1)を参照してください。ここでは、ラベルやコマンドボタンなどのコントロールの配置のみを説明します。

(1) 作成タブから「フォームデザイン」を選択し空のフォームを作成する。
(2) 詳細領域で右クリックでから「フォームヘッダー/フッター」を追加する。
(3) ヘッダー領域の編集
ラベルを作成し標題にフォームのタイトル名を登録する。
(4) 詳細領域の編集
➀ 定義書を作成するファイル名を保存するテキストボックスを作成する。
名称は「DBFile」。
➁ファイルのテーブルを一覧表示するためのListBoxを作成する。
名称は「TableList」、列数は3。項目は、№、テーブル名、リンク元テーブル名。
Listの見出し用のラベルで作成し、表示項目名を列幅に合わせて登録する。
➂ テーブルのフィールドを一覧表示するためのListBoxを作成する。
名称は「FldList」、列数は3。項目は、№、フィールド名、データ型。
Listの見出し用のラベルで作成し、表示項目名を列幅に合わせて登録する。
➃ テーブルのインデックスを一覧表示するためのListboxを作成する。
名称は「IndexList」、列数は4。項目は、インデクス名、主キー(主キーか否か)、
キーを構成するフィールド名、並び(昇順か降順か)。
Listの見出し用のラベルで作成し、表示項目名を列幅に合わせて登録する。
(5) フッター領域の編集
➀ ファイルを選択するための処理を実行するコマンドボックスを作成する。
名称は「DBOpen」。
クリック時のイベントプロシジャーでFileを選択するDialogを開く処理を作成する。
➁ テーブル名の一覧表を印刷するためのコマンドボックスを作成する。
名称は「テーブル一覧表の作成」。
クリック時に印刷マクロを登録する。レポート名は「テーブル一覧表」。
➂ 全テーブルのレイアウトを印刷するためのコマンドボックスを作成する。
名称は「テーブルレイアウトの印刷」。
クリック時に印刷マクロを登録する。レポート名は「テーブルレイアウト」。
➃ 当アプリを終了するコマンドボックスを作成する。
名称は「終了」。クリック時にAccessの終了マクロを登録する。
3. 「ファイルを開く」ボタンの押下
ファイルを開くダイアログを実行しファイルを選択します。

ファイルを選択し「開く」を押下すると、選択されたファイルのテーブルを一覧表に表示し、
「キャンセルを押下」された場合は、そのまま終了します。

3.1 共通変数
モジュールの先頭部分に宣言された変数は、モジュール全体で有効になります。
共通変数はここで宣言しておきます。

➀ Option Compare Database : 自動で記述されます。
Option Explicit : 変数を明示的に宣言します。
宣言していない変数を使用するとエラーになるようにしています。
このOption文がなければ、宣言しない変数を利用してもエラーにはなりませんが、
コンパイルするとエラーになりますので、通常は宣言します。
Option Base 1:テーブルのインデックスを1から開始します。
この宣言がなければゼロから数え始めます(Access のデフォルトです)。ここでは、
件数を把握しやすいことやキーに利用することもあるため、Base1にしています。
➁ DataBaseのコレクションを検索するためのオブジェクト変数です。
データ型までを宣言しておくと、指定できる候補が表示されますので楽です。
➂ 検索順番をインデックスキーに利用するための、ID です。
3.2 初期設定

➀ DBOpenボタンのクリック時のイベント処理のサブです。
クリック時の操作にイベントプロシジャーを設定すると、
private sub 名前_click()
end sub
が、用意されますので、End Subまでの間に処理内容を記述します。
➁ fDialog:FileDialog のオブジェクト変数を定義します。
sts:FileDialogの実行結果の状況を保存するためのスイッチです。
0:正常終了、9:キャンセル
➂ ListBox(TableList、FldList、IndexList).RowSource=""でリストをクリヤします。
DBOpen="": テキストボックスのクリヤ。
➃ Erase TypeConst:内部テーブル(TypeConst)のクリヤ。
Call initconst:TypeConstにフィールドのデータ型を設定するFunctionを実行します。
フィールドのデータ型名をテーブルに保存しています。
3.3 データ型の検索準備
標準モジュールで、データ型の型名を登録したテーブルと、フィールドのプロパティから
データ型を判定するFunction を作成します。
(1)initconst (TypeConst(データ型のテーブル)の設定)
<標準モジュール>
Option Compare Database
Option Explicit
Option Base 1
Public TypeConst(115, 3) As String
’----------------------------------------------------------------
Public Sub initconst()
TypeConst(1, 1) = "Yes/No": TypeConst(1, 2) = "(集計) Yes/No"
TypeConst(2, 1) = "バイト"
TypeConst(3, 1) = "整数": TypeConst(3, 2) = "(集計) 整数"
TypeConst(4, 1) = "長整数": TypeConst(4, 2) = "(集計) 長整数":
TypeConst(4, 3) = "オートナンバー"
TypeConst(5, 1) = "通貨": TypeConst(5, 2) = "(集計) 通貨"
TypeConst(6, 1) = "単精度小数点": TypeConst(6, 2) = "(集計) 単精度小数点"
TypeConst(7, 1) = "倍精度小数点": TypeConst(7, 2) = "(集計) 倍精度小数点"
TypeConst(8, 1) = "日付/時刻型": TypeConst(8, 2) = "(集計) 日付/時刻型"
TypeConst(10, 1) = "短いテキスト": TypeConst(10, 2) = "(集計) 短いテキスト"
TypeConst(11, 1) = "OLE オブジェクト型"
TypeConst(12, 1) = "長いテキスト": TypeConst(12, 2) = "ハイパーリンク"
TypeConst(15, 1) = "レプリケーションID":
TypeConst(15, 2) = "(集計) レプリケーションID"
TypeConst(16, 1) = "大きい数値": TypeConst(16, 2) = "(集計) 大きい数値"
TypeConst(20, 1) = "十進": TypeConst(20, 2) = "(集計) 十進"
TypeConst(26, 1) = "拡張した日付/時刻":
TypeConst(26, 2) = "(集計) 拡張した日付/時刻"
TypeConst(101, 1) = "添付ファイル"
TypeConst(110, 1) = "リストボボックス"
TypeConst(111, 1) = "コンボボックス"
End Sub
ちょっとメモの フィールドプロパティの調査 から整理したテーブルです。
1~101まではTypePropertyの数値をそのまま1列目の行番として型名をいれています。
集計タイプは、ResultTypeにTypePropertyが入っていますので、1行目のTypeと一致する行の2列目に、「集計」の文言を追加した型名を入れています。
長整数(Type=4)の場合のみ、更に3列目にオートナンバー型と入れています。
長いテキスト(Type=12) も特種で、2列目にハイパーリンク型を入れています。
また、ルックアップ機能を使用しているフィールドの型名として、110にリストボックス,111にコンボボックスを追加しています。
(2)CGetType(データ型の検索)

➀ データ型を判定するためのプロパティです。
Function の引数にするには数が多いので、共通変数で値を引き渡しています。
➁ CGetType : Function 名
n1,n2 はこのプロシジャー内でのみ使用する変数で、
n1:TypeConstの行番号、n2:TypeConstの列番号 です。
➂ RowsourceType が、<> ""(空白でない)、且つ Type <> 16 (16でない)
場合は、ルックアップ機能を使用したフィールドとみなしています。
DisplayControl から、
リストボックスなら、n1=110,n2=1、コンボボックスなら、n1=111,n2=1 です。
それ以外の場合は、とりあえず n1=Type,n2=1 を保存します。
➃ ResultType>0 は集計タイプなので、n2=2 と上書きしています。
➄ Type=4 , Attributes=17 はオートナンバー型なので、 n2=3 と上書きしています。
Type=12, Attributes=32770 はハイパーリンク型なので、n2=2 と上書きしています。
➅ CGetType=TypeConst(n1,n2) 検索結果を返します。
ルックアップ機能を使用したフィールドの場合、
RowsourceTypeは「Table/Query」又は「ValueList」、Typeは「テキスト」か「数値」、DisplayControlは、110(リストボックス)か111(コンボボックス)でした。
大きい数字(Type=16)の場合も 110(リストボックス)だったので、IF文を
追加しました。
フィールドプロパティの調査 を解析した結果ですが、間違っていたらご指摘下さい。
よろしくお願いします。
3.3 ファイルを開くダイアログの実行

➀ FileDialog オブジェクトを使用します。
カッコ内の数値は下記のとおりで今回は、1のOpenを指定しています。
1=msoFileDialogOpen 2=msoFileDialogSaveAs 3=msoFileDialogSaveAs
4=msoFileDialogFolderPicker
With でオブジェクトを指定すると、「.」でそのオブジェクトのメソッドやプロパティ
を指定できます。
.Filters.Add でAccessFileのみに制限しています。
➁ FileDialog Object は、
正常に終了した場合は「True」キャンセルされた場合は「False」が返されます。
正常に終了した場合、 画面のテキストボックスに選択されたファイル名を保存します。
正常に終了した場合は sts=0 にしています。
「False」が返された場合は、「ファイルを開くアクションはキャンセルされました。」
とメッセージを表示し、sts=9 にしています。
➂ set fDialog=nothing : オブジェクトを開放します。
ファイルが選択された場合(sts=0)のみ、次の処理(TableListに表示)に進みます。
3.4 TableList に表示

➀ 「DBFile」に保存されたDBファイルのオブジェクトを開きます。
➁ 選択ファイルのテーブルコレクションをすべて検索します。
テーブル名の先頭の4文字が「MSys」の場合はシステムテーブルなので無視します。
Ix1でファイルをカウントしています。(List上の表示№です)
➂ 検索したテーブルをTableListに追加表示していきます。
項目は、ix1 、ixtable.Name(テーブル名)、sourceTableName(リンク元テーブル名)
で、各項目を ";" で連結して一行に表示しています。
➃ すべての検索が終了すれば、オブジェクトを開放します。
DBOpenコマンドの処理はここまでです。
4.TableListのダブルクリック時のイベント処理
ダブルクリックで選択されたテーブルのフィールドとインデックスを表示します。

4.1 フィールドを表示

➀ TableListのダブルクリック時のイベント処理です。
➁ me.FldList.RowSource="":FieldListをクリヤします。
me.IndexList.RowSource="":IndexListをクリヤします。
➂ WktableID=me.TableList.Column(0)
選択行の1カラム目の項目(表示№)を保存します。カラムはゼロから数えます。
WkTableName=me.TableList.Column(1)
選択行の2カラム目の項目(Table名)を保存します。
➃ 指定ファイル(DBFile)を開きます。
➄ フィールドオブジェクトを順次検索します。
FieldIDでフィールドをカウントします。(List上の表示№です)
データ型の検索のためのプロパティを取り出します。
On Error Resume Next:
フィールドのデータ型によってはサポートされていないプロパティがあります。
その場合にはエラーになりますので、あらかじめゼロ又は空白を保存したうえで、
エラー行は無視してそのまま次行へ移行するようにしています。
CGetType:データ型を検索するFunction でデータ型名を受け取ります。
FileldList に検索結果を追加表示していきます。
表示項目は、FieldID、フィールド名、データ型で、各項目を「;」で連結しています。
➅ エラーの無視を解除します。
4.2 インデックスを表示

➀ initsw:インデックスの名前は1行目のみに表示させるためのスイッチです。
➁ テーブルのインデックスキーオブジェクト(IndexKey)を順次検索します。
initsw=true :新しいインデックスを検索した時にスイッチをTrueにします。
➂ ➁で検索したインデックスの構成フィールのオブジェクト(IndexKeyfld)
を順次検索します。
GetYesNo:引数(IndexKey.Primary)の値から「はい」か「いいえ」かを得ます。
GetAD:引数(IndexKeyfld.Attributes)の値から、「昇順」か「降順」かを得ます。
➃ IndexListに検索結果を追加表示します。
項目は、インデクス名、主キーか否か、構成フィールド名、昇順か降順か、で
各項目は「;」で連結します。
インデックス名は1行目のみ表示するため、表示後は initsw=false にします。
False の場合は、表示項目からインデクス名を省きます。
➄ すべての検索の終了後は、オブジェクトを開放します。
Call 印刷準備:
印刷準備サブで、レポートを作成するためのテーブルを作成します。
4.3 標準モジュール内のサブ
(1)GetYesNo(引数からYesかNoかを返します)
'n1=IndexKey.Primary
Public Function GetYesNo(n1)
If n1 = True Then
GetYesNo = "はい"
Else
GetYesNo = "いいえ"
End If
End Function
(2)GetAD(引数から昇順か降順かを返します)
'n1=IndexKeyfld.Attributes
Public Function GetAD(n1)
If n1 = 0 Then
GetAD = "昇順"
Else
GetAD = "降順"
End If
End Function
5.印刷準備
DBファイルやテーブルのプロパティをテーブルに保存し、レポートを作成します。
テーブルのレイアウトは、「テーブル定義書の作成(1)」で掲載しています。
長くなりましたので次回にご紹介したいと思います。