2.フォームの作成
2.1 フォームのデザイン

(1)メニューの「作成」タブから「フォームデザイン」を選択して、
空のフォームを作成します。
(2)詳細領域で右クリックしてショートメニューを開き、
「フォームのヘッダー/フッター」を選択し、ヘッダーとフッターを追加します。
(3)ヘッダー領域にタイトル名を表示するラベルを作成します。
ここでは、「テーブル定義書の作成(改訂版)」としました。
(4)詳細領域の編集
①テキストボックスを作成します。
テーブル定義書を作成するファイル名の表示ボックスです。
テキスト名は「DBFile」としました。
②コマンドボタンを作成します。
クリック時の処理に「イベントプロシージャ」を選択し、ファイルを開く処理を
VBAで作成します。(2.2 DBOPENのイベント処理)
名前は「DBOpen」、表題は「ACCESS ファイルを開く」としました。
(5)フッター領域の編集
①テーブル一覧表を印刷するためのコマンドボタンを作成します。
クリック時の処理に印刷マクロを登録します。
名前は「テーブル一覧表の印刷」、レポート名は「テーブル一覧表」です。
※レポートの作成手順は次回にご紹介します。
②テーブルレイアウトを印刷するためのコマンドボタンを作成します。
クリック時の処理に印刷マクロを登録します。
名前は「テーブルレイアウトの印刷」、レポート名は「テーブルレイアウト」です。
※レポートの作成手順は次回にご紹介します。
③終了のコマンドボタンを作成します。
クリック時の処理に、Accessの終了マクロを登録します。
①フォームのレコードソースは空白です。テーブルと連結していませんので、
「レコードセレクタ」も「移動ボタン」も不要なので「いいえ」に変更しています。
②ポップアップは「はい」にしてフォームが自由に動かせるようにしました。
③ヘッダーとフッターを追加したので、「区切り線」を「はい」にしました。
これ以外のプロパティはそのままでもいいと思います。
2.2 DBOpenのイベント処理
'************************************************
' ファイルを開くボタンの押下時の処理
'************************************************
Private Sub DBOpen_Click()
'
Dim fDialog As Variant 'Office.FileDailog
Dim sts As Integer 'DialogのStatus flag 0=OK,9=Cancel
'------------------------------------------------
' FileDailogを実行しファイルを選択
'------------------------------------------------
Set fDialog = Application.FileDialog(1) 'FileDialog Open
With fDialog
.Title = "DBFilleを開く"
.allowMultiselect = False
.filters.Clear
.filters.Add "Accessファイル", "*.accdb,*.mdb" 'Access Fileのみ
.initialfilename = ""
.ButtonName = "開く"
End With
If fDialog.show = True Then 'sts=0:正常に終了
sts = 0
Me.DBFile = fDialog.selecteditems(1) 'ファイル名を画面に表示
Else
sts = 9 'sts=9:Cancel
MsgBox ("ファイルを開くアクションはキャンセルされました。")
End If
'
Set fDialog = Nothing 'オブジェクトの解放
If sts > 0 Then Exit Sub 'キャンセルなら終了
Call テーブル保存 'テーブルに保存SUB実行
MsgBox ("印刷準備が終了")
End Sub
①ダイアログの処理が正常に終了した場合(fDialog.show = True)は、sts=0 として
フォームのテキスト「Me.DBfile」に選択されたファイルを表示します。
「me.」は、今アクティブになっているフォームを指しています。
②中断された場合は、sts=9 としてキャンセルされた旨のメッセージを表示させます。
③ダイアログのオブジェクトを解放し、正常終了の場合(STS=0)は、
テーブルの保存サブ(2.3 テーブルの保存)を呼び出します。
④サブから戻ってきたらテーブルの保存処理が終了した旨のメッセージを出します。
2.3 テーブル保存サブ
2.3.1 テーブルの初期化
'************************************************
' テーブルへの保存
'************************************************
Private Sub テーブル保存()
'変数の定義
Dim wkDB As DAO.Database '指定DB
'
Dim rsdb As DAO.Recordset 'T_DB用Recordset(データベース)
Dim rsTB As DAO.Recordset 'T_TB用Recordse(テーブル)
Dim rsFLD As DAO.Recordset 'T_FLD用Recordset(フィールド)
Dim rsIX As DAO.Recordset 'T_IX用Recordset(インデックス)
Dim rsIXFLD As DAO.Recordset 'T_IXFLD用Recordset (インデックスの構成フィールド)
'
Dim ixtable As DAO.TableDef 'Tableオブジェクト
Dim TableID As Integer 'TableID(=Count№)
Dim cls As Class1 'Classモジュール
'
Dim ix1 As Integer 'index
Dim wk1 As String 'work
Dim wk2 As String 'work
'------------------------------------------------
' テーブル初期化
'------------------------------------------------
CurrentDb.Execute ("delete * from T_DB") 'T_DB clear
CurrentDb.Execute ("delete * from T_TB") 'T_TB clear
CurrentDb.Execute ("delete * from T_FLD") 'T_FLD clear
CurrentDb.Execute ("delete * from T_IX") 'T_IX clear
CurrentDb.Execute ("delete * from T_IXFLD") 'T_IXFLD clear
'
Set rsdb = CurrentDb.OpenRecordset("T_DB") 'T_DBを開く
Set rsTB = CurrentDb.OpenRecordset("T_TB") 'T_TBを開く
Set rsFLD = CurrentDb.OpenRecordset("T_FLD") 'T_FLDを開く
Set rsIX = CurrentDb.OpenRecordset("T_IX") 'T_IXを開く
Set rsIXFLD = CurrentDb.OpenRecordset("T_IXFLD") 'T_IXFLDを開く
'
Set wkDB = DBEngine.Workspaces(0).OpenDatabase(Me.DBFile) 'DBファイルOPEN
①DataBase、各テーブルのRecordset、TabledefsコレクションのTableオブジェクト、
等、作業用の変数を定義します。
②すべてのテーブルを初期化(全レコードの削除)します。
Currentdb.Execute(”delete * from テーブル名”)
Currentdbとは当AccessのDBを指しています。
③当DBのすべてのテーブルのRecordsetを開きます。
Set rsテーブル名=currentdb.OpenRecordSet(“テーブル名”)
④選択DBファイルを開きます。
Set wkDB=DBEngine.Workspaces(0).OpenDatabase(Me.DBfile)
Me.DBfile はこのフォームのテキスト名で、保存されたDB名を指しています。
2.3.2 テーブル、フィールド、インデックスを検索・保存
'------------------------------------------------
' DB情報を検索・保存
'------------------------------------------------
Call DBSave(Me.DBFile, rsdb, 1) 'DB情報を保存、ID=1
'------------------------------------------------
' テーブル、フィールド、インデックスを検索・保存
'------------------------------------------------
Set cls = New Class1 'classモジュールのインスタンス化
TableID = 0 'TableID(Counter)をクリヤ
For Each ixtable In wkDB.TableDefs 'Tableコレクションを順次検索
If Left$(ixtable.Name, 4) <> "MSys" Then 'SystemTableはスキップ
TableID = TableID + 1 'TableCount +1
'Table情報の保存
Call TBSave(ixtable, rsTB, TableID) 'Table情報の保存
'Field,index情報の保存
If ixtable.Attributes = 0 Then 'Attributes = 0:LocalTable
cls.dbname = Me.DBFile 'LocalTableの場合は選択DB
Else
wk1 = ixtable.Connect 'LinkTableの場合はLinkDBを指定
ix1 = InStrRev(wk1, "=", , vbTextCompare) ';DATABASE=を除外するための計算
wk2 = Right$(wk1, Len(wk1) - ix1) 'File名を取り出す
If Dir(wk2) <> "" Then 'fileの存在を確認
cls.dbname = wk2 '存在すればLinkDBを指定
Else
MsgBox (wk2 & " リンク元DBが存在しません。") '存在しなければ無視して次のTableへ
GoTo ex1
End If
End If
cls.tabname = ixtable.Name 'テーブル名を指定
Call cls.cxFLDSave(rsFLD, rsIX, rsIXFLD, TableID) 'Field、Index情報を保存
End If
ex1:
Next ixtable
①Call DBSave(ファイル名、「T_DB」のRecordset、ID)
(3.標準モジュール 3.2.1 DBSave 参照)
DBは1件のみなので、ID=1 です。
②Calll TBSave(IXTable、「T_TB」のRecordset、TableID)
(3.標準モジュール 3.2.2 TBSave参照)
選択DBのテーブルコレクションを順次検索して、「T_TB」に保存します。
TableIDはテーブルの読み込み順です。
③Call cls.cxFLDSave(「T_FLD」のRecordset、「T_IX」のRecordset、
「T_IXFLD」のRecordset、TableID)
(4.クラスモジュール 4.1.1 cxFLDSave参照)
テーブルのフィールド情報とインデックス情報を保存します。
テーブルがリンクテーブルの場合は、リンク元DBから検索する必要がありますので、
条件によってDBを入れ替えています。
Attributes=0 の場合は、LocalTableなので、DB名は「Me.DBFile」です。
Attributes<>0 の場合は、ixtable.Connect からリンク元DB名を検索し、
DB名を取り出したあとで(テーブル名の前に「;DataBase=」がについています)
DBの存在確認(Dir(DB名<>0))を行った上で、そのDB名を指定しています。
リンク元DBが存在しなかった場合、そのテーブルのレイアウトは印刷されません。
テーブル一覧表には印字されます。
2.3.3 オブジェクトの解放
'テーブルを閉じる
rsdb.Close
rsTB.Close
rsFLD.Close
rsIX.Close
rsIXFLD.Close
'オブジェクトの解放
Set rsdb = Nothing
Set rsTB = Nothing
Set rsFLD = Nothing
Set rsIX = Nothing
Set rsIXFLD = Nothing
'
Set wkDB = Nothing
Set cls = Nothing
'
End Sub
レコードセットを閉じ、オブジェクトを解放します。
標準モジュールとクラスモジュールのVBAは次回に掲載します。
