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の省略可能な記述について
VBAのVariant型について
VBAのインデントについて
VBAの演算子まとめ(演算子の優先順位)
列幅不足による###表示や指数表示を判定する
VBA10大躓きポイント(初心者が躓きやすいポイント)
Excel VBAとは?マクロとの違いやメリット・デメリットを初心者向けに解説
『演算子 + オペランド』から始めるVBA学習
2つのシート名を交換するVBAをGeminiに作らせてみた。


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

生成AIが暴いた「VBAオワコン説」の盲点|問われるのは言語ではなく評価軸|エクセル雑感(2026-07-04)
【ITとは何か】Excel・VBAを学ぶ前に知っておきたい「4つの本質」|エクセル雑感(2026-06-24)
2つのシート名を交換するVBAをGeminiに作らせてみた。|VBA技術解説(2026-05-22)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法|VBAサンプル集(2026-05-20)
4大分岐関数の使い分け(IF/IFS/SWITCH/CHOOSE)|エクセル入門(2026-05-19)
Excel主要関数 習得難易度 10段階(文字列・日付除く)|エクセル雑感(2026-04-27)
Excelのシート5分類|エクセル雑感(2026-03-27)
グループ別に全員共通の重複期間を算出|エクセル練習問題(2026-03-12)
ハイフン区切り文字列の『最初』と『最後』を抽出・結合|エクセル練習問題(2026-02-23)
AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.日本の祝日一覧|Excelリファレンス
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.Excelショートカットキー一覧|Excelリファレンス
6.繰り返し処理(For Next)|VBA入門
7.RangeとCellsの使い方|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのコピー&値の貼り付け(PasteSpecial)|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」をお願いいたします。
本文下部へ