グローバル基準の設計を:AutoCAD VBAにおける「LocaleId」による動的言語切替の極意
AutoCADの業務自動化ツールを開発していると、必ず突き当たる壁がある。それは「海外拠点とのツール共有」だ。
「日本語環境では動くが、英語環境ではエラーを吐く」。あるいは「メッセージボックスが文字化けする」。このような事態は、単なる実装ミスではない。設計段階でグローバルな視点が欠落していた証左だ。
今回は、AutoCADの `AcadApplication.LocaleId` を活用し、環境に応じてUIをスマートに切り替える、堅牢かつ保守性の高い実装手法を伝授する。
—
なぜ「ハードコーディング」が現場を破滅させるのか
初心者がやりがちな最悪のコードは、メッセージを直接 `MsgBox “処理が完了しました”` と書き込むことだ。これは将来的に、コードの海から該当箇所を探し出すという非生産的な作業を強いることになる。
我々プロフェッショナルは、「ロジック」と「UIの文言」を完全に分離する。
AutoCADの実行環境が日本語(LocaleId: 1041)なのか、英語(LocaleId: 1033)なのかを自動判別し、実行時に適切なリソースを読み込む。これが、大規模開発の現場で生き残るための最低条件だ。
—
実装の核心:LocaleIdを抽象化するクラス設計
ただ `If…Then` で分岐させるのはスマートではない。将来的に多言語展開する可能性を考慮し、言語管理用のクラスを設計する。
1. 言語管理クラス(`clsResourceManager`)
このクラスは、呼び出し元が「何語であるか」を意識せずに、キーを指定するだけで適切な文字列を返す設計にする。
‘ クラスモジュール名: clsResourceManager
Option Explicit
Private m_LocaleId As Long
‘ コンストラクタ代わりの初期化メソッド
Public Sub Initialize()
‘ 現在のAutoCADのLocaleIdを取得
m_LocaleId = ThisDrawing.Application.LocaleId
End Sub
‘ メッセージ取得関数
Public Function GetString(ByVal Key As String) As String
Select Case Key
Case “MSG_COMPLETE”
If m_LocaleId = 1041 Then ‘ 日本語
GetString = “処理が完了しました。”
Else ‘ デフォルトは英語
GetString = “Process completed successfully.”
End If
Case “ERR_FILE_NOT_FOUND”
GetString = IIf(m_LocaleId = 1041, “ファイルが見つかりません。”, “File not found.”)
Case Else
GetString = “Unknown String”
End Select
End Function
—
現場で即戦力となる実装例
作成したクラスを使って、実際にツールを動かすコードを見てみよう。ここでのポイントは、「初期化コストを最小化する」ことだ。
‘ 標準モジュール
Option Explicit
Public Sub RunAutomation()
Dim res As New clsResourceManager
res.Initialize
On Error GoTo ErrHandler
‘ ここでメイン処理
‘ …
MsgBox res.GetString(“MSG_COMPLETE”), vbInformation, “AutoCAD Automation”
Exit Sub
ErrHandler:
MsgBox res.GetString(“ERR_FILE_NOT_FOUND”), vbCritical, “Error”
End Sub
—
プロフェッショナルへの道:さらなる高みを目指すために
この実装をベースにする際、以下の「現場の知見」を忘れないでほしい。
- 外部ファイル化の推奨:
メッセージの量が増えてきたら、`GetString` メソッド内の `Select Case` は限界を迎える。その場合は、外部のCSVやJSONファイルから読み込む設計に切り替えるべきだ。コードを書き換えずにUIを更新できることが、メンテナンスコストを劇的に下げる。
- LocaleIdの罠:
`LocaleId` はあくまでシステム設定に基づく値だ。ユーザーが意図的に英語環境で日本語OSを動かしている場合など、予期せぬ挙動を考慮し、必ず「デフォルト(英語)」を用意しておくこと。
- フォント依存の回避:
日本語と英語では文字列の長さが全く異なる。`MsgBox` のサイズは固定だが、フォーム(UserForm)を作成する場合は、ラベルのサイズを自動調整(オートサイズ)にするか、動的にフォーム幅を広げるロジックを組み込むのが、「美しい」ツールの条件だ。
最後に
コードを書くことは、誰でもできる。しかし、「誰がどこで使っても、同じパフォーマンスと品質を提供できる仕組みを作る」ことこそが、エンジニアの真価だ。
この `LocaleId` を活用した設計は、あなたのツールが海を越えて評価されるための最初の一歩となる。ぜひ、今のプロジェクトに取り入れてみてほしい。それが、伝説への入り口だ。
