ExcelVBAマクロ StrConvで全角・半角、カタカナ・ひらがな変換のエラー対処法

プログラミング

つい最近、VBAマクロでStrConv関数でエラーが発生し、対応したのでその内容を紹介します。

背景

まずはエラーが発生した背景から。

お客さんの業務を海外拠点でも行う事になり、それまで提供してきたVBAマクロの動作検証を現地でやっていたところ、エラーの報告がありました。

同じデータで同じ手順を実行していたのですが自分の環境では再現できず、海外拠点では再現するという状況でした。

そこでリモートにて再現をしてもらい操作権限をもらってデバッグ作業をする事になりました。

原因特定

原因はすぐにStrConv関数である事が分かりました。

実際にデバッグエラーでは以下のメッセージが表示され、StrConv関数でプログラムが止まっている事を確認できました。

海外拠点で発生するエラーメッセージ

それでは日本でエラーにならず、海外でエラーとなる理由は何でしょう?

日本でエラーにならず、海外でエラーとなる理由

MicrosoftのドキュメントでStrConv関数を確認してみると以下の事が書かれていました。

StrConv 関数 (Visual Basic for Applications)
StrConv関数の第二引数「Conversion」に関する説明

(表示されていないですが)*1つのvbWide、vbNarrowは東アジアロケールに適用され、*2つのvbKatakana、vbHiraganaは日本のみに適用されると書かれています。

実際に今回問題となったStrConv関数ではvbWide、vbNarrowが使われていて海外拠点もヨーロッパだったため、実行時エラーとなったようです。(「注意」の中でもその事が書かれています)

対処法1

理由としてロケール(地域)の違いによる問題との事なのでロケールの変更をしてしまえば問題は解決します。

ロケールの設定は[コントロールパネル]-[時計と地域]-[地域]で表示する「地域」ウィンドウでできます。

ロケールは「地域」ウィンドウの「形式」タブ、「形式」で変更可能

「形式」タブの「形式」を「日本語(日本)」に変更する事で実行時エラーが出なくなります。

ただし、海外拠点の設定を変更しないといけなくなるので他の問題も出てくるかもしれないです。

対処法2

設定を自由に変更できない場合のためにStrConv関数には省略可能な第三引数「LocaleID」が準備されています。

ドキュメントにも書いてありますがシステムLocaleIDと異なる場合に指定する事ができます。

StrConv関数の構文説明

省略する事でシステムLocaleIDとなってしまうのでここに日本のLocaleIDを設定する事でどの地域の設定になっていても設定を変更する事なく日本として振る舞う事ができるようになります。

それでは日本のLocaleIDは何か?となりますがMicrosoftにLocaleIDが載っているページを見つけました。(StrConvからLocaleIDに関するページへのリンクでもついててくれると助かったのですが・・・)

Office 2016 年の言語識別子と OptionState Id の値 - Deploy Office
2016 年の言語と校正ツールのインストールをOfficeカスタマイズするための言語識別子と OptionState ID の値を検索します。
LocaleID一覧の日本語(日本)の値

この表から日本のLocaleIDは1041だと分かりました。

StrConv関数の第三引数は省略せず「1041」に変更する事で実行時エラーが出なくなります。

まとめ

StrConv関数は簡単に全角・半角やひらがな・カタカナ変換が出来る優れものです。

しかし、今回のように日本以外の地域でこれらを使う場合には問題を含んでいる事を理解しておく必要がありますね。

今回の経験から今後はStrConv関数にてvbWide 、 vbNarrow 、 vbKatakana 、および vbHiraganaを使う場合にはLocaleIDに「1041」を付けるように癖付けしておくと良さそうです。

ただ、地域によってこれらの使用を制限する必要ってあるのでしょうか?(制限をかけない事による弊害を想定できないためそもそも第三引数なんて要らないのでは?と思いました)

コメント

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