つい最近、VBAマクロでStrConv関数でエラーが発生し、対応したのでその内容を紹介します。
背景
まずはエラーが発生した背景から。
お客さんの業務を海外拠点でも行う事になり、それまで提供してきたVBAマクロの動作検証を現地でやっていたところ、エラーの報告がありました。
同じデータで同じ手順を実行していたのですが自分の環境では再現できず、海外拠点では再現するという状況でした。
そこでリモートにて再現をしてもらい操作権限をもらってデバッグ作業をする事になりました。
原因特定
原因はすぐにStrConv関数である事が分かりました。
実際にデバッグエラーでは以下のメッセージが表示され、StrConv関数でプログラムが止まっている事を確認できました。

それでは日本でエラーにならず、海外でエラーとなる理由は何でしょう?
日本でエラーにならず、海外でエラーとなる理由
MicrosoftのドキュメントでStrConv関数を確認してみると以下の事が書かれていました。


(表示されていないですが)*1つのvbWide、vbNarrowは東アジアロケールに適用され、*2つのvbKatakana、vbHiraganaは日本のみに適用されると書かれています。
実際に今回問題となったStrConv関数ではvbWide、vbNarrowが使われていて海外拠点もヨーロッパだったため、実行時エラーとなったようです。(「注意」の中でもその事が書かれています)
対処法1
理由としてロケール(地域)の違いによる問題との事なのでロケールの変更をしてしまえば問題は解決します。
ロケールの設定は[コントロールパネル]-[時計と地域]-[地域]で表示する「地域」ウィンドウでできます。

「形式」タブの「形式」を「日本語(日本)」に変更する事で実行時エラーが出なくなります。
ただし、海外拠点の設定を変更しないといけなくなるので他の問題も出てくるかもしれないです。
対処法2
設定を自由に変更できない場合のためにStrConv関数には省略可能な第三引数「LocaleID」が準備されています。
ドキュメントにも書いてありますがシステムLocaleIDと異なる場合に指定する事ができます。

省略する事でシステムLocaleIDとなってしまうのでここに日本のLocaleIDを設定する事でどの地域の設定になっていても設定を変更する事なく日本として振る舞う事ができるようになります。
それでは日本のLocaleIDは何か?となりますがMicrosoftにLocaleIDが載っているページを見つけました。(StrConvからLocaleIDに関するページへのリンクでもついててくれると助かったのですが・・・)


この表から日本のLocaleIDは1041だと分かりました。
StrConv関数の第三引数は省略せず「1041」に変更する事で実行時エラーが出なくなります。
まとめ
StrConv関数は簡単に全角・半角やひらがな・カタカナ変換が出来る優れものです。
しかし、今回のように日本以外の地域でこれらを使う場合には問題を含んでいる事を理解しておく必要がありますね。
今回の経験から今後はStrConv関数にてvbWide 、 vbNarrow 、 vbKatakana 、および vbHiraganaを使う場合にはLocaleIDに「1041」を付けるように癖付けしておくと良さそうです。
ただ、地域によってこれらの使用を制限する必要ってあるのでしょうか?(制限をかけない事による弊害を想定できないためそもそも第三引数なんて要らないのでは?と思いました)
コメント