外資系会社でプログラム開発をしていると、意外なところで落とし穴に出くわします。特にVBAを使った開発では、環境の違いが思わぬトラブルを引き起こすことがあります。
この記事の鍵は、VBAのプログラムは記号も含めてすべて英語で書くこと
実際起こったシチュエーション
今回の出来事は、日本のPCでVBAコードを開発し、テストしていたときのこと。使用する環境として、日本語版のWindows PCと中国版のWindows PCがありました。日本のPCでテストを行ったときは問題なく動作していたVBAコード。しかし、中国のPCで同じコードを実行した途端、動作しなくなったのです。
「え、なんで?コードは正しいはずなのに」
動作確認済みのコードが別の環境で動かないのは納得できません。エラーも出てこないので、本当に分かりませんでした。色々な方のPCで実験したところ、日本語版のWindows PCでは動いたが、中国版のWindows PCでは動かないことが発覚!どうやら言語設定やロケール(地域設定)が原因のようでした。
VBAコード内で日本語のメッセージや文字列が含まれている部分が、中国版の環境では適切に解釈されず、エラーを引き起こしていたのです
実際のメール送信コード
日本語版のWindows PC:実行OK
' メールを作成
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
.To = "example1@gmail.com"
.CC = "example2@gmail.com"
.Subject = "テストメール"
.Body = "こんにちは!これはExcel VBAを使ったテストメールです。"
.Display
End With
中国版のWindows PC:実行できない → 日本語が反映されない
' メールを作成
Set OutlookMail = OutlookApp.CreateItem(0)
.To = "example1@gmail.com"
.CC = "example2@gmail.com"
.Subject = " "
.Body = " "
.Display
End With
解決方法
excelのセル指定にし、日本語はexcelに書く
' メール送信処理
For i = 2 To lastRow
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
.To = ws.Cells(i, 1).Value
.CC = ws.Cells(i, 2).Value
.Subject = ws.Cells(i, 3).Value
.Body = ws.Cells(i, 4).Value
.Display
End With
Next i
この方法を使い、両方のPCで動きました
まだこれはいい方
エラーにはなっていないけど、コード見たらわかるから。
もっとややこしいのは、「空白、記号」
実際の句読点を使ったコード (お題:1単語ごと句読点を追加する)
日本語版のWindows PC:実行OK
' 例: 1単語ごとに句読点を追加
If i < UBound(words) Then
result = result & "、" ' 途中に読点を追加
End If
Next i
中国語版のWindows PC:実行できない
' 例: 1単語ごとに句読点を追加
If i < UBound(words) Then
result = result & "、" ' 途中に読点を追加
End If
Next i
見た目同じなのになぜ??
「、」が、PC城では日本語と中国語で違う句読点になっていた
「今日は、暑い」が「今日は,暑い」になったことありませんか? それと同じで見た目同じでも違うみたいです。
これは調べても出てこない、😅
解決方法
英語の「,」にする
' 例: 1単語ごとに句読点を追加
If i < UBound(words) Then
result = result & "," ' 途中に読点を追加
End If
Next i
最後に
文字も記号も、すべて英語で書くこと
エラーにならないエラーが一番厄介ですね。。。