【入門編】【中級者向け】表の行をドラッグ&ドロップのように並び替えるVBA実装 – Word VBA解析バイブル

スポンサーリンク

Word VBAの深淵へ:表の行を自在に操る「ソート・アルゴリズム」の極意

こんにちは。Word VBAという「一見不自由に見えるが、実はとてつもない可能性を秘めた箱庭」を愛する皆さんに、今日は少しだけ踏み込んだテクニックを授けましょう。

「マクロの記録」で生成されるコードは、いわば「自動生成された不格好な下書き」です。今日学ぶのは、表(Table)の行をデータの値に基づいて並び替えるという、現場で最も需要がありながら、最も軽視されがちな「データの構造化」の第一歩です。

なぜ「Wordの表」は扱いが難しいのか?

Excelのセルと違い、Wordの表は「テキストの断片」が複雑に絡み合ったDOM構造のようなものです。行を並び替えるということは、単なる値の移動ではなく、「行オブジェクトを切り出し、別の場所へ配置し、元の残骸を消去する」というライフサイクルを意識する必要があります。

今回のミッション:指定列の数値で並び替える

例えば、以下のような表があるとします。

| 項目名 | 金額 |
| :— | :— |
| A社 | 500 |
| B社 | 100 |
| C社 | 300 |

これを「金額」の昇順で並び替えるアルゴリズムを実装します。

—

実装コード:行の動的ソート

このコードは、表の2列目(金額)をキーにして、単純な「バブルソート」の要領で行を入れ替えます。

Sub SortTableRowsByValue()
Dim tbl As Table
Dim i As Long, j As Long
Dim val1 As Double, val2 As Double

‘ 選択範囲が表の中にあるか確認
If Selection.Information(wdWithInTable) = False Then
MsgBox “表の中にカーソルを置いてください。”
Exit Sub
End If

Set tbl = Selection.Tables(1)

‘ 2行目から最終行までをループ(1行目はヘッダーと仮定)
For i = 2 To tbl.Rows.Count – 1
For j = i + 1 To tbl.Rows.Count

‘ セル内の値を数値として取得(不要なスペース・改行を除去)
val1 = Val(Replace(tbl.Cell(i, 2).Range.Text, vbCr & Chr(7), “”))
val2 = Val(Replace(tbl.Cell(j, 2).Range.Text, vbCr & Chr(7), “”))

‘ 昇順ソート:前の値が後の値より大きい場合に交換
If val1 > val2 Then
‘ 行を入れ替える(一度コピーして挿入し、元を消す)
tbl.Rows(j).Select
Selection.Copy
tbl.Rows(i).Range.Paste
tbl.Rows(j + 1).Delete ‘ コピーで増えた行を消去
End If
Next j
Next i

MsgBox “並び替えが完了しました。”
End Sub

—

ここを理解すれば、あなたは「中級者」を超えられる

このコードをただコピペするだけでなく、以下の3点に注目してください。これがVBAをマスターする鍵です。

1. `vbCr & Chr(7)` の呪縛

Wordのセル内には、必ず末尾に「セルの終端記号(Chr(7))」と「段落記号(vbCr)」が含まれています。`Range.Text`で値を取り出すとき、これを取り除かないと数値計算でエラーになります。ここが初心者が必ずハマる「Word特有の仕様」です。

2. オブジェクトの「移動」ではなく「再構築」

Word VBAには「行を入れ替える」という直接的なメソッドはありません。そのため、「コピー→貼り付け→削除」という手順を踏みます。この時、`Selection`を使うと画面がチラついてパフォーマンスが落ちるため、本来は`Range`オブジェクトを直接操作するのがプロの作法です。

3. 処理の重みを知る

このバブルソートは、データ量が少なければ問題ありませんが、100行を超えるような表で行うとWordがフリーズしかねません。その場合は、一度配列(Array)にデータを移し、メモリ上でソートしてから表に書き戻す「高速化テクニック」が必要になります。

次のステップへのアドバイス

まずはこのコードを動かして、自分の思い通りにデータが並ぶ感覚を楽しんでください。
それができたら次は、「複数のキーでソートする(例:部署名でグループ化し、その中で金額順にする)」という課題に挑戦してみましょう。

プログラミングは、魔法ではありません。Wordという巨大なオブジェクトを、自分が書いたロジックで支配する——この感覚さえ掴めれば、あなたはもう単なる事務職ではなく「業務自動化エンジニア」の仲間入りです。

何か詰まったら、いつでも戻ってきてください。また次の極致へ案内しますから。

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