テスト用のmdbが自分のPCにあって、さらに、操作用のmdbが社員のPCにあって、基本テーブルは社内ネットワークの機関部に置いてある。なーんて状態。

そんなとき、テスト用にVBAを書いて

テーブル構造をこちゃこちゃ変えようとするよりも、新しいテーブルを作るVBAを作って基本のmdbに新しいデーブルができるようにする。操作用には新しいテーブルに入れたいレコードを入れておいて、そこから更新クエリで基本のmdbにレコードを更新するようにすればいいじゃーん。と気が付いた。

遅いよ。

参考:自宅サーバーでやってみよう

1.テスト用のmdbに新しいテーブルを作る。
2.基本用のmdbの古いテーブルを削除するVBAを書く

ここでは、フォーム上にボタンを作っている感じ。

3.新しいテーブルを作成する
フィールドの型はVBでデータベースを参考に。

4.主キーを設定する

続く。。。。。


Private Sub コマンド1_Click()

Dim db As Database
Set db = CurrentDb  'このデータベース上を操作するってことだから、データベースのあるソースを書けばいい。
= DBEngine.Workspaces(0).OpenDatabase("C:\Documents and Settings~")


'2.テーブル削除

db.Execute "DROP TABLE テーブル名"

'3.テーブル作成
db.Execute "CREATE TABLE テーブル名 (フィールド名1 INTEGER, フィールド名2 TEXT, フィールド名3 TEXT)"

'4.主キー設定
db.Execute "alter table テーブル名 add constraint pk_a primary key ( フィールドA, フィールドB )"

db.Close
Set db = Nothing

End Sub



参考ページ:Access_VBA講座

01.主テーブル・リレーションテーブル

 1対多リレーションシップの「1」側のテーブルを主テーブル,また,「多」側のテーブルをリレーションテーブルといいます。右の例では「2000」がリレーションテーブル,「クラス担任」が主テーブルです。


02.リレーションシップの削除

次の例はVBで上のリレーションシップを削除します。

Private Sub 削除_Click()
Dim m As String
Dim S As String

'リレーションシップ削除

m = "クラス担任"
S = "2000"
Call D_relation(m, S)

End Sub

削除ボタンをフォーム上に作成して、そのボタンを押すと、Private Sub 削除が動く。

Call D_relation(m,S)

で下の Sub D_relation(T_main As String, T_sub As String)
が動く。


'リレーションシップの削除
Sub D_relation(T_main As String, T_sub As String)
  ’T_main 主テーブの名前
  ’T_sub  リレーションテーブルの名前
Dim DB As DAO.Database
Dim rel As DAO.Relation
Set DB = CurrentDb

For Each rel In DB.Relations
If rel.Table = T_main And rel.ForeignTable = T_sub Then
DB.Relations.Delete rel.Name
MsgBox "削除しました"
Exit Sub
End If
Next rel
End Sub
pageTop




03.リレーションシップの作成

 次の例はVBで上のリレーションシップを作成します。

これも削除と同様に、「作成」ボタンを作って、プロパティのイベント>クリック時にPrivateを書く。
そしてモジュールにC_relation(T_main As String, T_sub As String, K_main As String, K_sub As String)を書く。



Private Sub 作成_Click()
  Dim m As String
  Dim s As String
  Dim k As String
  Dim l As String

m = "クラス担任"
s = "2000"
k = "現在クラス"
l = "現在クラス"

Call C_relation(m, s, l, k)

End Sub

’リレーションシップの作成
Sub C_relation(T_main As String, T_sub As String, K_main As String, K_sub As String)
  ’T_main 主テーブル
  ’T_sub  リレーションテーブル
' K_main 主テーブル側のフィールド名
  ’K_sub リレーションテーブル側のフィールド名
Dim db As Database
Dim fld As Field
Dim rel As Relation

Set db = CurrentDb
Set rel = db.CreateRelation(K_main, T_main, T_sub)
rel.Attributes = dbRelationDeleteCascade + dbRelationUpdateCascade
Set fld = rel.CreateField(K_sub)
fld.ForeignName = K_sub
rel.Fields.Append fld
db.Relations.Append rel
Set db = Nothing
End Sub
Forms![親フォーム名]![サブフォーム名]![コントロール名]

但し、 DLookup関数 などの中に参照式として記述する場合は、以下のように form がもう一つ必要

Forms![親フォーム名].[サブフォーム名].form.[コントロール名]