改訂版テーブル定義書の作成(2)

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は次回に掲載します。