1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。
その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では思わぬアクシデントを引き起こす原因にもなります。
このシリーズでは、すでにある程度VBAを身に着け、
業務に活用している方々への振り返りとして、
「動いているから大丈夫」と思いがちな、
Excel VBAの見落とされやすい落とし穴について触れていきます。
2. 入力形式自動変換とは
Excelには、セルに入力された値を自動的に解釈し、
数値や日付として変換する機能があります。
これは通常の表計算では便利な機能ですが、
VBAと組み合わせた瞬間に、意図しない挙動を引き起こします。
この挙動を、本記事では「入力形式自動変換」と呼びます。
3. よくある現象
セルに入力した値が、Excelの判断で勝手に型変換されます。
代表例:
| 入力したつもり | 実際のセルの中身 |
|---|---|
012 |
12 |
1-2 |
2026/1/2 |
1/3 |
2026/1/3 |
1234567890123 |
1.23457E+12 |
ユーザーは「文字列」のつもりでも、
Excelは 数値・日付として解釈できるか? を最優先する仕様になっています。
これは手入力でも、VBAによる入力でも同様に発生します。
4. VBAで何が起きるのか① 値入力
次のコードを見てください。
Sub Sample()
Dim Str As String
Str = "012"
Cells(1, 1).Value = Str
End Sub
VBAは確かにセルA1に値を012を入力しに行っていますが、
Excelがセル入力時点で 012を数値と判断し、12に変換してしまいます。
5. 4への対策:セル書式設定を入力前に変更
入力形式自動変換を防ぐには、
セルの書式を先に指定する必要があります。
Sub Sample()
Cells(1, 1).NumberFormat = "@"
Cells(1, 1).Value = "012"
End Sub
逆に値を入れてから書式を変えても、すでに変換されているため効果はありません。
6. VBAで何が起きるのか② セル値取得
セルA1の書式は標準で、2月1日が入力されていたとします
Sub Sample()
Dim Str As String
Str = Cells(1, 1).Value
MsgBox Str
End Sub
結果:メッセージボックスに2026/2/1(西暦は取得時により変化します)と表示。
VBAは正しくセルA1の値を取得していますが、
Excelでは
- 見えている値
- 実際に保持している値
が一致しているとは限りません。
そのため想定外の値が取得されることがあります。
7. 6への対策:セルの表示をそのまま取得
セル内表示をそのまま取得する場合は.valueではなく.textを使用します。
Dim Str As String
Str = Cells(1, 1).Text
ただし.textにも欠点はあり、
特にセル幅が足りずに正しく表示されていない場合に取得値が食い違ってしまいます。
8. なぜこの問題が厄介なのか
この問題が厄介なのは
- VBAとしてはエラーにならないため一見正しく動く
- セルの設定次第で結果が変わる
という点です。
つまり、
壊れていることに気づけないタイプの不具合です。
9. まとめ(教訓)
- Excelは手入力でもVBAでも入力値を自動で型変換してしまうということ
- VBAの
valueは基本的に「見た目」ではなく「中身」を扱うということ - Excel機能を意識していないと潜在的な不具合を抱えるということ
結論として、
Excel VBAで値を扱うときは「型をExcelに任せない」
これを意識するだけで、避けられる事故はかなり減ります。