【入門編】【初心者向け】Word表のセル内テキストを、指定した文字数で強制的に改行するマクロ – Word VBA解析バイブル

スポンサーリンク
スポンサーリンク

表が崩れる恐怖から解放される!Word VBAで「セル内テキストの強制改行」をマスターする

「マクロの記録」を使って、なんとか自動化の一歩を踏み出したあなたへ。
素晴らしい挑戦です。その一歩が、エンジニアとしての血肉になります。

しかし、いざ実務で「大量のデータを表に流し込むマクロ」を作ろうとすると、必ずと言っていいほど直面する壁があります。そう、「表のレイアウト崩壊」です。

長い文章をセルに流し込んだ瞬間、列の幅が異常に広がったり、行の高さが際限なく伸びて、文書全体のデザインが台無しになってしまう……。これは、Word VBAを使い始めた誰もが通る道です。

今日は、そんな問題をスマートに解決する「指定した文字数で強制的に改行を入れる」というテクニックを伝授します。このロジックを理解できれば、あなたは「単に記録する人」から「ロジックを組み立てる人」へと進化できるはずですよ。

なぜ「ただ流し込むだけ」ではダメなのか?

Wordの表は非常に賢いのですが、あまりに長い文字列が入力されると、「セル内に収めよう」とするよりも「文字をすべて表示しよう」として列幅を広げてしまう性質があります。

これを防ぐには、「文字列が長くなる前に、こちら側で適切な場所に改行(Enter)を差し込んでおく」という制御が必要なのです。

そこで使うのが、文字列を操る二つの魔法の関数、`Len` 関数と `Mid` 関数です。

今回使う「二つの道具」の役割

1. `Len(文字列)` 【ものさし】
文字列が「全部で何文字あるか」を測る関数です。
2. `Mid(文字列, 開始位置, 文字数)` 【ハサミ】
文字列の「指定した位置から、指定した文字数分だけ」を切り出す関数です。

この「ものさし」で長さを測り、「ハサミ」で切り取って、その間に改行コードを挟んでいく。この思考プロセスが、プログラミングの醍醐味です。

実践!セル内テキストを強制改行するコード

それでは、実際のコードを見ていきましょう。
今回は、「選択している表の、すべてのセルに対して、指定した文字数で改行を入れる」という実用的なマクロを作成しました。

Sub ForceLineBreakInTableCells()
    ' ============================================================
    ' 目的: 選択している表のセル内テキストを、指定文字数で強制改行する
    ' 仕組み: Len関数で長さを測り、Mid関数で分割して再構築する
    ' ============================================================
    
    Dim targetTable As Table
    Dim targetCell As Cell
    Dim originalText As String
    Dim formattedText As String
    Dim charLimit As Integer
    Dim i As Integer
    
    ' --- 設定エリア ---
    ' ここで「何文字ごとに改行するか」を指定します
    charLimit = 10 
    ' ------------------

    ' 1. 選択範囲が「表」であるかチェック(エラー回避の基本!)
    If Selection.Information(wdWithInTable) = False Then
        MsgBox "表の中にカーソルを置いてから実行してください。", vbExclamation
        Exit Sub
    End If

    ' 2. 選択範囲内の表を取得
    Set targetTable = Selection.Tables(1)

    ' 3. 表の各セルをループ処理
    For Each targetCell In targetTable.Range.Cells
        
        ' 【重要】Wordのセル内のテキストには、末尾に特殊な制御文字(Chr(13) & Chr(7))が含まれています。
        ' これをそのまま扱うと文字数カウントが狂うため、一旦取り除いて取得します。
        originalText = targetCell.Range.Text
        originalText = Left(originalText, Len(originalText) - 2)
        
        ' 空の文字列から再構築を開始
        formattedText = ""
        
        ' 4. 文字列を charLimit ごとに切り出して、改行(vbCr)を挟みながら結合
        ' 例: "あいうえおかきくけこ" (10文字) -> "あいうえおかきくけこ"
        '     "あいうえおかきくけこさしすせそ" (15文字) -> "あいうえおかきくけこ" & vbCr & "さしすせそ"
        
        For i = 1 To Len(originalText) Step charLimit
            ' Mid関数で切り出し
            formattedText = formattedText & Mid(originalText, i, charLimit)
            
            ' もし、切り出した部分が文字列の最後でないなら、改行を追加する
            If i + charLimit <= Len(originalText) Then
                formattedText = formattedText & vbCr
            End If
        Next i
        
        ' 5. 加工したテキストをセルに戻す
        ' セルの末尾に制御文字を付け直す必要があるため、改めてセット
        targetCell.Range.Text = formattedText
        
    Next targetCell

    MsgBox "処理が完了しました!", vbInformation
End Sub

ここがプロの視点!陥りやすい「落とし穴」と解説

このコードをただコピペするだけでなく、以下の「エンジニアが意識しているポイント」を理解しておくと、あなたのスキルは飛躍的に向上します。

① Word特有の「セル末尾文字」問題(最重要!)

ここが初学者が最も躓くポイントです。
Wordのセルのテキストを取得すると、目に見えなくても末尾に必ず `Chr(13) & Chr(7)` という2文字の特殊な記号が隠れています。

もしこれを除去せずに `Len` 関数を使うと、「文字数は10文字のはずなのに、プログラム上は12文字と判定される」という現象が起き、改行の位置がズレてしまいます。
コード内の `Left(originalText, Len(originalText) – 2)` は、この「余計な2文字」を削ぎ落とすための、プロの作法です。

② `Step` を使った効率的なループ

`For i = 1 To Len(originalText) Step charLimit` という書き方に注目してください。
通常、ループは `Step 1`(1ずつ増える)ですが、ここでは `Step charLimit` とすることで、「一気に指定文字数分だけ飛ばしてカウントする」という動きをさせています。
これにより、一文字ずつチェックするよりも圧倒的に高速で、スマートなコードになります。

③ エラーハンドリングの意識

`If Selection.Information(wdWithInTable) = False Then`
もしユーザーが表の外でこのマクロを実行してしまったら? プログラムはエラーで止まってしまいます。
「もし表の中にいなかったら、メッセージを出して終了する」という一文を入れる。これが、「壊れにくい、信頼されるツール」を作る第一歩です。

まとめ:ここをクリアすれば、基本はバッチリ!

今回のポイントを振り返りましょう。

  • `Len` で長さを測り、`Mid` で切り取る。
  • Wordのセルには「隠れた2文字」があることを忘れない。
  • `Step` を活用して、スマートにループを回す。

この「文字列を分解して、組み立て直す」という考え方は、Word VBAだけでなく、Excel VBAやJavaScript、Pythonなど、あらゆるプログラミング言語に通じる普遍的なロジックです。

最初は難しく感じるかもしれませんが、一度この感覚を掴めば、あなたはもう「記録されたマクロの利用者」ではありません。「ロジックで業務をデザインするエンジニア」の入り口に立っています。

一歩ずつ、楽しみながら進んでいきましょう。応援していますよ!

タイトルとURLをコピーしました