Excel VBA:円記号の入った「NumberFormatLocal」の値を比較したい
以下の例で文字「バックスラッシュ」はVBAでは「円記号」で表示されています。
セルに設定された書式Selection.NumberFormatLocalの値が文字列「"\#,##0;\-#,##0"」に等しいか調べたいがうまく比較できない。
環境、OS:Windows10, Windows8、Excel:2010,2013
例 セル”A1”に数値「123456」を入力
“A1”に手作業で通貨書式を設定
「セルの書式設定」->「表示形式」->「通貨」->「\-1,234」(黒色:デフォルト)
マクロの記録は
Sub Macro1()
Range("A1").Select
Selection.NumberFormatLocal = "\#,##0;\-#,##0"
End Sub
“A1”に設定された書式が通貨書式であるかをVBAで確認するために
プロシジャー test1 を作り、実行すれば”No”になる。
“Yes”を予想してしまうが、”No”になる理由と解決方法が知りたい。
Sub test1()
Dim strTuka As String
strTuka = "\#,##0;\-#,##0"
Range("A1").Select
MsgBox Selection.NumberFormatLocal
If Selection.NumberFormatLocal = strTuka Then
MsgBox "Yes"
Else
MsgBox "No"
End If
End Sub
どなたか、アドバイスをお願いします。
Excelは内部的に文字列をUnicodeで扱っています。
NumberFormatLocalの帰り値では通貨記号として用いられる円記号(U+00A5)が使用されています。
文字列として円記号を入力した場合は、Windowsはバックスラッシュ(U+005C)として扱います。
https://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98%E5%8F%B7
比較の際、ChrW関数によりバックスラッシュをU+00A5に置換して比較することで比較することが出来ます。
(A5は16進数ですので、関数内の引数は「&H○○」の表記にします。10進数の場合は「165」になります。)
If Selection.NumberFormatLocal = strTuka Then
↓
If Selection.NumberFormatLocal = Replace(strTuka, "\", ChrW(&HA5)) Then
実際に帰ってくる文字列が違ってるからですね。
詳しく調べてみると,numberformatlocalが返してくる\の文字コードが違ってる(ascwで92と165)事が確認できます。
>解決方法
たとえば
変更前:
If Selection.NumberFormatLocal = strTuka Then
変更後:
if strcomp(selection.numberformatlocal, strtuka, vbtextcompare) = 0 then
などで。