「コードに間違いはないはずなのに、出力したCSVの数字の前に半角スペースが入り込み、インポート先で弾かれてしまう」——大手SIerや社内SEのトラブルシューティング案件で、今なお頻繁に報告されるのがVBA Str関数 空白 理由をめぐる混乱だ。知らぬ間に混入した1文字のスペースが、システム停止や整合性チェックの不一致という深刻な障害を誘発する。
この不可解な半角スペースは、バグではなくマイクロソフトの歴史的仕様に基づく。Str関数は、引数として渡された数値が「正(0以上)」である場合、符号を表示するための1文字分の領域を「半角スペース」として先頭に確保する。一方、負の数値(マイナス)を渡した場合は、そのスペースの位置に「-」記号が収まる仕組みだ。
Debug.Print Str(123) ' 結果は「 123」(先頭に空白) Debug.Print Str(-123) ' 結果は「-123」(空白なし)
この挙動は、1970年代から1980年代のコンソール画面(MS-DOSやBASIC環境)において、数値を縦に並べた際に正負の桁位置を美しく揃えるための便宜的仕様だった。しかし、スペースの有無が厳密なデータ同一性に直結する現代のデータ処理においては、この親切設計が仇となる。この歴史的背景を理解せず、Trim関数で後から無理やりスペースを削る場当たり的な修正が重ねられた結果、保守性の低い「スパゲッティコード」が社内に量産される事態が後を絶たない。