Accessのテーブル内の値と列名を変更したいって思うことがあると思います。
でも手動で変更するのは、変更する対象が多いと大変で面倒です。
そんなときは、当記事のサンプルコードをコピペして利用することで、簡単かついっぺんに値を変更できます。
サンプルコードは、私自身が作成したオリジナルのプログラムです。
定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。
当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。
基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。
各テーブルの値を変更する
サンプルコード
'【定数】
Const REPLACE_MAE = "置換前"
Const REPLACE_ATO = "置換後"
'ファイルシステムオブジェクト作成
Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject")
'vbsフォルダーパス
Dim PATH_DIR_VBS : PATH_DIR_VBS = objFso.GetParentFolderName(WScript.ScriptFullName) & "\"
'Accessフルパス
Dim PATH_FULL_MDB : PATH_FULL_MDB = PATH_DIR_VBS & "Table.mdb"
'Accessを作成
Dim objAccess : Set objAccess = CreateObject("Access.Application")
'Accessを非表示に設定
objAccess.Visible = false
'Accessを開く
objAccess.OpenCurrentDatabase PATH_FULL_MDB
'テーブルの数だけループする
For Each tbl In objAccess.CurrentData.AllTables
'テーブル名取得
Dim strTblNm : strTblNm = tbl.Name
'システムテーブルは除外
If Instr(strTblNm,"MSys") <= 0 Then
'列数分ループ
For i = 0 To objAccess.CurrentDb.TableDefs(strTblNm).Fields.Count - 1
'列名をセット
Dim strColNm : strColNm = objAccess.CurrentDb.TableDefs(strTableNm).Fields(i).Name
'列名に置換対象の文字が含まれるか?
If Instr(strColNm,REPLACE_MAE) > 0 Then
objAccess.CurrentDb.TableDefs(strTblNm).Fields(i).Name = REPLACE_ATO
Else
End If
'エラーの無視を開始
On Error Resume Next
'フィールド値の置換対象の文字を更新
objAccess.CurrentDb.Execute "UPDATE " & strTblNm _
& " SET " & strColNm _
& " = Replace([" & strColNm & "],""" & REPLACE_MAE & """,""" & REPLACE_ATO & """)"
'エラーの無視を終了
On Error Goto 0
Next
Else
End If
Next
'Accessを閉じる
objAccess.Quit
'後始末
Set objAccess = Nothing
Set objFso = Nothing
解説①:定数の宣言
置換対象の値、置換後の値を定数にしています。
定数にすることで、置換対象の値や置換後の値を他の値に変更したい場合に容易に変更でき、改修の負担が減ります。
定数ではなく、配列やファイルから置換データを取得することで複数の値を置換することも可能です。
解説②:置換対象であるAccessファイルのパスを取得する
Accessファイルは、vbsファイルと同等のフォルダーにあることにしています。
そのため、vbsファイルのフォルダーパスを取得していきます。
ファイルシステムオブジェクトを作成し、GetParentFolderNameメソッドにより、フォルダーパスを取得しています。
解説③:テーブルの取得
「[開いたAccess].CurrentData.AllTables」の部分でAccess内のすべてのテーブルを取得することができます。
取得した複数のテーブルは、For Each文で1つずつ取得しましょう。
「tbl.Name」で取得したテーブルの名前を取得しています。
解説④:テーブルの値を置換する
システムテーブルは、置換対象から除外しています。
システムテーブル名の先頭が”MSys”で始まるのでテーブル名に”MSys”が含まれるかでチェックしています。
そのため、自作テーブル名に”MSys”が含まれていると置換対象から外れてしまいますのでご注意ください。
列名の更新は、「objAccess.CurrentDb.TableDefs(strTblNm).Fields(i).Name = REPLACE_ATO」で実施していて、フィールド値の更新は、UPDATE文を使用しています。
「On Error Resume Next」でエラーを無視している理由は、IDENTITYなど値の更新が許可されていない列を更新する際にエラーとなり、処理が止まってしまいます。
処理の停止を防止するためにエラーを無視しています。