VBA技術解説
列幅不足による###表示や指数表示を判定する

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2023-07-12 最終更新日:2023-07-12

列幅不足による###表示や指数表示を判定する


列幅が不足していると、数値が###表示や指数表示になってしまいます。
数値が見えないのでは困ります。
通常は手作業で列幅を見やすい幅に調整しますが、マクロVBAで正しく表示されているかどうかの判定をしたい場合のサンプルVBAと解説です。


列幅不足による###表示や指数表示は、フォントによって変わりますし、PC環境(ディスプレイの拡大縮小)の影響も受けます。
そもそも表示形式がどうなっているかも考慮しなければなりません。


Range.Textブロバティ

Rangeには、
Value
Value2
Text
これらのプロバティがあり、セルの表示状態により取得される値が違ってきます。

Value

指定されたセル範囲の値を表すバリアント型 (Variant) の値を設定します。
値の取得および設定が可能です。

Value2

セルの値を設定します。値の取得および設定が可能です。
バリアント型 (Variant) の値を使用します。

Text

指定されたオブジェクトに対し、文字列を設定します。
値の取得のみ可能です。
文字列型 (String) の値を使用します。


セルに「2023/6/20」を入れ、表示形式を「yyyy"年"mm"月"dd"日"」とした場合、
Value : 2023/06/20 ・・・ 日付型
Value2 : 45097 ・・・ 倍精度浮動小数点型
Text : 2023年06月20日 ・・・ 文字列型

セルの値について(Value,Value2,Text)|VBA技術解説
マクロVBAにおいて、セルの値を操作する事は基本の基本ですが、意外に理解できていない場合が多いようです。Value 指定されたセル範囲の値を表すバリアント型(Variant)の値を設定します。値の取得および設定が可能です。


列幅不足を判定するVBA

Function 数値列幅不足(ByVal aRng As Range) As Boolean
  数値列幅不足 = False
  '文字列入力への対応
  If aRng.Value = aRng.Text Then
    Exit Function
  End If
  '###表示の対応
  If Left(aRng.Text, 1) = "#" Then
    数値列幅不足 = True
    Exit Function
  End If
  '指数表示の対応
  If InStr(aRng.NumberFormat, "E") = 0 Then
    If InStr(aRng.Text, "E") > 0 Then
      数値列幅不足 = True
      Exit Function '最後なので不要ですが一応
    End If
  End If
End Function

上記VBAは、列幅不足により###表示や指数表示になっている場合は「True」、それ以外は「False」を返します。

まずは、最初から文字列で入力されている場合の対応が必要です。
最初から文字列として"#"や指数の"E"が入力されている場合です。
この場合は、セル値のValueプロパティとTextプロパティが一致します。
.Value = .Text

Textプロパティの最初の文字が"#"なら列不足として判定しています。
ただし、普通はないとは思いますが、
「"#"0」
このように表示形式で無理矢理"#"を表示している場合も「True」と判定されてしまいますが、さすがに対応する必要はないとは思います。

表示形式に"0.E+00"のような指数形式が設定されているかの判定には、単純に"E"の文字が含まれているかで判定しています。
これも表示形式で無理矢理"E"を表示しているような場合も含まれてしまいますが、これもさすがに対応する必要はないと思います。

表示形式は条件付き書式で変更されている場合もあります。
これに対応するには、DisplayFormatプロパティで判定する必要があります。
条件付き書式で変更された書式を取得する
条件付き書式が設定されている場合、当然ですが見た目は、本来そのセルに設定されている書式ではなく、条件付き書式の条件によって設定されている書式になります。VBAで、この条件付き書式によって設定された書式を取得します。これが取得できるようになったのは、Excel2010からですので、このページで紹介するVBAコードはE…

このように、本当に厳密に判定しようとすると結構難しい事になります。
上記VBAでは、普通によくある場合だけに対応してみましたが、必要に応じてより厳密な判定を追加したりして使ってみてください。


セル幅不足を判定するVBAの使用例

マクロVBA 列幅不足 ### 指数

セル セルの表示形式 「数値列幅不足」の結果
A1 表示形式「標準」で、数値がそのまま表示されている False
B1 表示形式「#,##0;[赤]-#,##0」で、数値がカンマ編集されて表示されている False
C1 表示形式「標準」で、列幅不足により指数表示されている True
D1 表示形式「標準」で、列幅不足により「####」と表示されている True
E1 表示形式「0.E+00」で、指数表示されている False

マクロVBA 列幅不足 ### 指数




同じテーマ「マクロVBA技術解説」の記事

印刷範囲の設定・印刷範囲のクリア
VBAの省略可能な記述について
VBAのVariant型について
VBAのインデントについて
VBAの演算子まとめ(演算子の優先順位)
列幅不足による###表示や指数表示を判定する
VBA10大躓きポイント(初心者が躓きやすいポイント)
Excel VBAとは?マクロとの違いやメリット・デメリットを初心者向けに解説
『演算子 + オペランド』から始めるVBA学習
PCの固有情報の取得(ユーザー名、コンピューター名等々)
ウィンドウ設定を引き継いで新規ウィンドウを作成するVBA


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ