ExcelVBAで多言語化対応をすることになったので、備忘録としてまとめます。
ExcelVBAでフォームを使ったアプリを作ったところ、英語でも表示できるようにしたいと要望がありました。
当然、多言語に対応するための機能はありません。
そこでVisual Studioでの多言語対応の方法を参考に、同等の機能をExcelVBAでも再現してみました。
実装イメージ
1.使用する単語をシートにまとめる
2.クラスモジュールに単語を格納するプロパティを追加する
3.CallByName関数を使い、指定された言語の文字列をプロパティに格納する
4.クラスモジュールに格納された文字列を使用する
使用する単語をシートにまとめる
ここで記載するのは識別用の名称と各言語ごとの内容です。
識別名称はこのあとクラスモジュールに文字列型パラメータの名称として使います。
言語については横方向に列挙します。
また、テーブル化しておくと以降のコーディングがしやすくなります。
クラスモジュールに単語を格納するプロパティを追加する
Public TXT_HELLO As String
新規にクラスモジュールを作成し、シートに記載した識別名称を使って文字列型プロパティを定義します。
このクラスモジュールではプロパティの定義のみ行います。
CallByName関数を使い、指定された言語の文字列をプロパティに格納する
'言語設定(読み出し列)
Const LANG_JA As Integer = 2
Const LANG_EN As Integer = 3
'テキストリソースオブジェクト
Public TXT_RES As New textResCls
Public Sub LoadTextResource()
textValues = ThisWorkbook.Sheets("言語").Range("言語テーブル").Value
For idx = LBound(textValues) To UBound(textValues)
'指定された言語の文字列をテキストリソースオブジェクトに格納
CallByName TXT_RES, textValues(idx, 1), VbLet, CStr(textValues(idx, LANG_JA))
Next idx
End Sub
言語テーブルから対応した内容を取得します。
CallByName関数を使い、クラスオブジェクトの対応するプロパティに文字列を設定していきます。
言語を切り替える場合は読み出し列の定義を変えます。
上記では固定になっていますが、可変にしてリスト等から選べるようにすることもできます。
クラスモジュールに格納された文字列を使用する
Private Sub UserForm_Initialize()
'テキスト読み出し
LoadTextResource
'コントロールに設定
Label1.Caption = TXT_RES.TXT_HELLO
End Sub
フォームの初期化タイミングの先頭で文字列の読み出し処理を行います。
その後、ラベルに表示したい文字列を設定しています。
今は日本語を指定しているので「こんにちは。」と標示されます。
読みだす言語を英語(LANG_EN)に切り替えると英語に登録した文字が表示されます。
単語の追加はシートとクラスモジュールのメンテナンスだけでできます。
プロパティの定義も、シート上でコードを自動的に作れるようにしておくと、定義もコピペですむようになります。(「Public [プロパティのセル番号] As String」で文字列を作成)
ExcelVBAで多言語対応というニッチな機能ですが、こういうやり方もあるということで覚えておいていただければと思います。