【実務・中級編】【初心者向け】表の特定の列を基準に昇順・降順で並び替えるVBAコード – Word VBA解析バイブル

スポンサーリンク

Word VBAで「表の並び替え」をマスターせよ:現場で死なないためのアーキテクチャ設計

Wordにおける表(Table)の操作は、VBA初心者にとっての最初の鬼門だ。ネット上に転がる「とりあえず動くコード」をコピペして、実務で痛い目を見たことはないだろうか?

「セルが結合されているとエラーで落ちる」「ヘッダー行を巻き込んで並び替えてしまう」「実行のたびにカーソルが暴走する」。これらはすべて、オブジェクトの性質を理解せず、場当たり的な制御を行っているから起こる悲劇だ。

今日は、業務自動化の現場で「二度と手直しさせない」ための、堅牢かつ洗練されたTable並び替えの極意を伝授する。

—

1. 現場のプロが守る「鉄則」

Wordの `Table.Sort` メソッドは強力だが、甘く見てはいけない。以下の3点を意識しなければ、コードはすぐに腐る。

  • ヘッダーの除外: 表の1行目は見出しであることが多い。並び替え時にこれを巻き込むとデータが崩壊する。`ExcludeHeader:=True` の指定は必須だ。
  • ソートキーの型指定: Wordはデフォルトでデータの型を自動判定しようとするが、これに頼ってはいけない。数値なのか文字列なのかを明示的に指定することで、予期せぬソート順のバグを封じ込める。
  • エラーハンドリング: 表が存在しない、あるいはセルが複雑に結合されている場合、Wordの挙動は予測不能になる。必ず対象が有効な `Table` オブジェクトであることを担保してから処理せよ。

—

2. 実務で即戦力となるプロダクションコード

このコードは、現在選択している範囲内に表があるかを確認し、指定した列を基準に安全にソートを行う設計だ。

‘ @description 選択中の表を指定された列でソートする
‘ @param targetColumn ソート対象の列番号
‘ @param sortOrder 昇順(wdSortOrderAscending) or 降順(wdSortOrderDescending)
Public Sub SortWordTable(ByVal targetColumn As Integer, _
Optional ByVal sortOrder As WdSortOrder = wdSortOrderAscending)

Dim tbl As Table

‘ 1. エラーハンドリング:選択範囲が表の中にあるか確認
If Selection.Information(wdWithInTable) = False Then
MsgBox “表の中にカーソルを置いて実行してください。”, vbExclamation
Exit Sub
End If

Set tbl = Selection.Tables(1)

‘ 2. 表の並び替え処理
‘ ExcludeHeader:=True で見出し行を保護
‘ FieldNumber は 1始まりの列番号
‘ SortFieldType は明示的に指定(wdSortFieldNumeric, wdSortFieldAlphanumeric等)
On Error Resume Next ‘ セル結合等による予期せぬエラーを捕捉
tbl.Sort ExcludeHeader:=True, _
FieldNumber:=”Column ” & targetColumn, _
SortFieldType:=wdSortFieldAlphanumeric, _
SortOrder:=sortOrder

If Err.Number <> 0 Then
MsgBox “並び替えに失敗しました。セル結合が複雑すぎないか確認してください。”, vbCritical
Else
MsgBox targetColumn & “列目を並び替えました。”, vbInformation
End If
On Error GoTo 0

End Sub

—

3. なぜこの設計なのか:アーキテクトの視点

なぜ `Selection` を使うのか?

本来、大規模な開発では `Document.Tables(n)` のように明示的なインデックス指定が望ましい。しかし、Wordドキュメントの表はユーザーが挿入・削除を繰り返すため、固定的なインデックス指定は保守性の敵となる。現場では「ユーザーが触っている場所」を基準にする `Selection` を使いつつ、処理の冒頭で `wdWithInTable` をチェックする、この「守りの設計」が最も事故が少ない。

`SortFieldType` の重要性

`wdSortFieldAlphanumeric` は汎用性が高いが、数値データだけを扱うなら `wdSortFieldNumeric` を指定すべきだ。「10」が「2」より前に来るような辞書順ソートを防ぐための、エンジニアとしての矜持である。

—

4. 最後に:データベース連携への備え

もし君たちがこの表をExcelや外部DBから生成しているなら、「Word上で並び替えるのではなく、元データ側で並び替えてから流し込む」のが王道だ。

Wordはあくまで「表示」の場所であり、「計算・整列」の場所ではない。もしWord上での並び替えが頻発するような業務フローなら、そのプロセス自体が設計上のボトルネックだ。自動化の目的は「作業の置き換え」ではなく、「無駄な作業の排除」にあることを忘れないでほしい。

このコードをベースに、君たちの業務環境に合わせてカスタマイズしてほしい。迷ったときは、常に「実行時の例外」を想定すること。それが、伝説の自動化エンジニアへの第一歩だ。

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