【入門編】【プロ】SQL Serverへのアップサイジングを見据えた、Accessテーブル定義の「互換性チェック」ツール – Access VBA解析バイブル

スポンサーリンク

こんにちは! Access VBAの世界へようこそ。
これまでマクロのボタンポチポチから抜け出して、「そろそろ本格的なシステム開発をしてみたい!」と思っているあなたへ。今日は、プロの現場でも必ず直面する「大容量化・クラウド化への備え」について、ってお話ししますね。

システムが大きくなってくると、避けて通れないのが「SQL Serverへのアップサイジング(移行)」です。「いつかデータが増えたらサーバーに載せ替えればいいや」と安易に考えて設計していると、いざ移行という時にエラーの嵐で徹夜する羽目になります……。

そうなる前に、Accessのテーブル定義がSQL Serverとちゃんと「お友達になれる状態」かを、VBAで自動診断しちゃいましょう!
ここをクリアすれば、あなたのVBAスキルはもう初学者を卒業し、立派な「アーキテクト」の仲間入りです。一緒に優しく紐解いていきましょう!

—

なぜ、AccessのテーブルはSQL Serverでエラーになるのか?

Access(Jet/ACEエンジン)は、型に対して非常に「お気楽」です。
例えば、以下のようなトラップが潜んでいます。

1. 「短いテキスト(旧: 互換性のため文字列)」のサイズ未設定
Accessでは長さを指定しなくても動きますが、SQL Serverの世界では「サイズなし」は許されません。
2. 長整数型(Long)以外のオートナンバー
レプリケーションID(GUID)などをオートナンバーにしていると、移行時に外部キー制約で大事故が起きます。
3. 予約語や使えない文字の使用
フィールド名にスペースや `data`, `date` などのSQL予約語が入っていると、移行後のクエリがすべて死にます。

これらを人間の目ですべてチェックするのは、地獄の作業ですよね。だからこそ、VBAに診断させます。

—

🛠️ 今回作成する「互換性チェックツール」の全貌

Accessの内部構造を司る `DAO(Data Access Objects)` という仕組みを使い、現在開いているデータベース内の全テーブルとフィールドを舐め回すようにチェックするプログラムを作ります。

以下のコードを、VBAエディタ(`Alt` + `F11`)の標準モジュールにそのまま貼り付けてみてください。

実装コード(コピペOK!)

Option Compare Database
Option Explicit

‘ =================================================================
‘ 処理名 : 移行前夜!SQL Server互換性チェックツール
‘ 概要 : Accessテーブルの定義をスキャンし、SQL Server移行時の
‘ 爆弾(エラー要因)をイミディエイトウィンドウにブチ撒ける
‘ =================================================================
Public Sub CheckSqlCompatibility()
Dim db As DAO.Database
Dim tdef As DAO.TableDef
Dim fld As DAO.Field
Dim errCount As Long
Dim warnCount As Long

Set db = CurrentDb()
errCount = 0
warnCount = 0

Debug.Print “==================================================”
Debug.Print ” SQL Server 移行互換性診断を開始します…”
Debug.Print “==================================================”

‘ すべてのテーブルをループ(システムテーブルは除外)
For Each tdef In db.TableDefs
If (tdef.Attributes & dbSystemObject) = 0 And (tdef.Attributes & dbHiddenObject) = 0 Then

‘ 1. テーブル名のチェック
If InStr(tdef.Name, ” “) > 0 Then
Debug.Print “[警告] テーブル名にスペースが含まれています: [” & tdef.Name & “]”
warnCount = warnCount + 1
End If

‘ フィールドのループ
For Each fld In tdef.Fields

‘ 2. 「短いテキスト(旧:テキスト型)」のサイズチェック
‘ dbText = 10 (文字列型)
If fld.Type = dbText Then
If fld.Size = 255 Then
Debug.Print ” [注意] ” & tdef.Name & “.” & fld.Name & ” -> テキスト型がデフォルトの255のままです。意図したサイズですか?”
warnCount = warnCount + 1
End If
End If

‘ 3. オートナンバー型のデータ型チェック (dbLong以外はSQL Serverで泣く)
‘ fld.Attributes に dbAutoIncrField が含まれているか判定
If (fld.Attributes & dbAutoIncrField) <> 0 Then
If fld.Type <> dbLong Then
Debug.Print ” [致命的エラー] ” & tdef.Name & “.” & fld.Name & ” -> オートナンバー型がLong型(長整数)ではありません!SQL Server移行時に失敗します。”
errCount = errCount + 1
End If
End If

‘ 4. フィールド名の予約語・記号チェック(簡易版)
If InStr(fld.Name, ” “) > 0 Or InStr(fld.Name, “-“) > 0 Then
Debug.Print ” [警告] ” & tdef.Name & “.” & fld.Name & ” -> フィールド名にスペースまたはハイフンが含まれています。”
warnCount = warnCount + 1
End If

Next fld
End If
Next tdef

Debug.Print “==================================================”
Debug.Print ” 診断終了!”
Debug.Print ” 致命的エラー : ” & errCount & ” 件”
Debug.Print ” 警告・注意 : ” & warnCount & ” 件”
Debug.Print “==================================================”

‘ クリーンアップ
Set fld = Nothing
Set tdef = Nothing
Set db = Nothing

MsgBox “診断が完了しました。イミディエイトウィンドウを確認してください。”, vbInformation, “完了”
End Sub

—

💡 コードの解説:ここがプロの技術!

初学者のうちは「英語の羅列で意味がわからない…」と思うかもしれませんが、分解すればたったこれだけのルールです。

1. `TableDef` と `Field` オブジェクトの概念

Accessの裏側では、テーブルそのものを `TableDef`、その中にある列(カラム)を `Field` という「オブジェクト(部品)」として扱っています。
Excelで言えば、`TableDef` が「シート」、`Field` が「列」のようなイメージです。これを `For Each` という構文で、上から順にすべてペロリと舐め回しています。

2. システムテーブルの華麗なスルー

If (tdef.Attributes & dbSystemObject) = 0 …

Accessを作ると勝手に出てくる `MSysAccessObjects` などのシステム用テーブルを、この条件式で華麗に除外しています。ここを忘れると、Access内部のシステム設定まで診断してしまいエラーになります。プロならではの気配りポイントです。

3. ビット演算子(`And`)によるプロパティ判定

If (fld.Attributes & dbAutoIncrField) <> 0 Then

「このフィールドはオートナンバーか?」を判定している超重要コードです。DAOの世界では、プロパティが複数組み合わさっていることがあるため、`And` を使って「フラグが立っているか」を数学的にスパッと判定しています。

—

🎯 まとめ:ここをクリアすれば、Access VBAの基本はバッチリ!

いかがでしたか?
今回は、テーブル定義という「データベースの土台」をVBAでハックし、将来のトラブルを未然に防ぐツールを作りました。

  • DAOを使ったテーブル・フィールド構造の走査
  • データ型の特性(`dbText` や `dbAutoIncrField`)の理解
  • イミディエイトウィンドウへのログ出力手法

この3つを自分のものにできたなら、あなたはもう「ボタンを押したら動くマクロを作れる人」ではなく、「データベースの寿命と安全性を設計できるエンジニア」の領域に一歩踏み込んでいます。

現場で「お、こいつ分かってるな」と思われること間違いなしです。
ぜひあなたの開発環境でも試してみてくださいね。それでは、次のステップでお会いしましょう!

タイトルとURLをコピーしました