Excel VBAでセルのユーザー定義表示形式を取得して条件分岐したい場合、NumberFormatLocalの比較方法でつまずくことがあります。特に「0″位”」のように文字を追加したユーザー定義は、VBA上ではダブルクォーテーションを含む文字列として取得されるため、見た目とコード上の表記が異なります。この記事では、VBAでセルのユーザー定義を正しく判定する方法と、NumberFormatLocalを使う際の注意点について解説します。
Excelのユーザー定義表示形式とは
Excelでは、セルに入力された数値そのものを変更せず、表示だけを変更するためにユーザー定義の表示形式を設定できます。
例えば、セルの表示形式を「0″位”」に設定すると、セルへ「1」と入力した場合でも画面上では「1位」と表示されます。しかし、セル内部の値はあくまで数値の1のままであり、文字列の「1位」が保存されているわけではありません。
このような表示形式は、順位表や単位付きデータなどを作成するときに便利ですが、VBAで判定する場合は表示内容ではなく設定されている書式文字列を確認する必要があります。
NumberFormatLocalで取得される値に注意する
VBAのNumberFormatLocalプロパティは、現在のExcelの表示言語に合わせたユーザー定義書式を文字列として取得します。
例えば、セルの表示形式が「0″位”」の場合、VBAでは以下のような値として取得されます。
strbuf = Range("A1").NumberFormatLocal
この結果は、ウォッチウィンドウなどでは次のように表示されます。
"0"位""
つまり、比較するときには「0/位」のような見た目に近い文字列ではなく、取得された実際の文字列と一致させる必要があります。
VBAでユーザー定義を判定する正しい記述方法
ユーザー定義「0″位”」を判定したい場合は、VBAの文字列内でダブルクォーテーションを表現するために、ダブルクォーテーションを2つ重ねて記述します。
例えば以下のように記述します。
Dim strbuf As String
strbuf = Cells(x, y).NumberFormatLocal
If strbuf = "0""位""" Then
'該当セルの場合の処理
End If
VBAでは文字列をダブルクォーテーションで囲むため、その中に表示形式のダブルクォーテーションを含めたい場合は「””」と記述する必要があります。
元のユーザー定義が以下の場合、
0"位"
VBA上の文字列比較では以下になります。
"0""位"""
NumberFormatとNumberFormatLocalの違い
Excel VBAには、表示形式を取得するプロパティとしてNumberFormatとNumberFormatLocalがあります。
| プロパティ | 特徴 |
|---|---|
| NumberFormat | 英語形式の書式コードを取得する |
| NumberFormatLocal | Excelの言語環境に合わせた書式を取得する |
例えば日本語環境ではNumberFormatLocalを使うと、日本語特有の表示形式や文字がそのまま取得されます。一方で、複数の環境でマクロを利用する場合はNumberFormatを使ったほうが安定するケースがあります。
他のユーザーへ配布するExcelファイルや社内共有するマクロでは、環境による違いを避けるためNumberFormatの利用も検討するとよいでしょう。
ユーザー定義判定では完全一致以外の方法も便利
ユーザー定義書式は、利用者が後から変更する可能性があります。そのため、完全一致ではなく部分的に確認する方法もあります。
例えば「位」という文字が含まれているか確認する場合は、InStr関数を利用できます。
If InStr(Cells(x, y).NumberFormatLocal, "位") > 0 Then
'位を含む書式の場合の処理
End If
この方法なら「0″位”」だけでなく、「0.0″位”」など別の表示形式にも対応できます。
まとめ
Excel VBAでユーザー定義表示形式を判定するときは、画面上の表示ではなくNumberFormatLocalが返す実際の文字列を確認することが重要です。
「0″位”」のような書式を比較する場合、VBAではダブルクォーテーションをエスケープする必要があるため、"0""位"""のように記述します。
また、環境による違いや書式変更の可能性がある場合は、InStr関数で文字列の一部を確認する方法も有効です。ユーザー定義書式を正しく扱うことで、VBAによるセルの自動処理をより安定して作成できます。


コメント