【入門編】【初心者向け】Word表の特定の列を基準に、行全体を昇順・降順で並び替える基本コード – Word VBA解析バイブル

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

【Word VBA極意】表の並び替えを支配する:特定の列を基準にデータを整列させる魔法のコード

こんにちは。自動化の世界へようこそ。

「マクロの記録」を使って、なんとか操作を自動化できた。そんな喜びを感じているあなた、素晴らしい一歩を踏み出しました。でも、もしあなたが「もっと複雑な、データに基づいた判断をさせたい」と願うなら、今の「記録」という殻を破る時が来ています。

今日、私たちがマスターするのは「Word内の表(Table)を、特定の列を基準に、プログラムから自在に並び替える(ソートする)技術」です。

「ボタンを押せば、バラバラだった名簿が名前順に、あるいは売上順にピシッと整列する」

そんな魔法のような体験を、エンジニアの視点から解き明かしていきましょう。ここをクリアすれば、Word VBAの基本はバッチリですよ。

1. なぜ「マクロの記録」では足りないのか?

「マクロの記録」で並び替えを行うと、記録されたコードには「どのセルを選択して、どのボタンを押したか」という、非常に人間的な(そして脆い)手順が書き込まれます。

しかし、実務のデータは常に一定ではありません。

  • 行数が変わるかもしれない。
  • 並び替えたい列が、時によって2列目だったり3列目だったりするかもしれない。

これらに対応するには、「表(Table)オブジェクト」に対して、「この列(Field)を、このルール(SortField)で並び替えてくれ」と直接命令を出すコードが必要なのです。

2. 核心となる「Sort」メソッドの解剖図

Word VBAにおいて、表の並び替えは `Table.Sort` というメソッドで行います。このメソッドは、非常に強力ですが、引数(命令の詳細)を正しく理解していないと、予期せぬ挙動をします。

最も重要な引数を、図解するように整理してみましょう。

引数名 役割 初学者が意識すべきポイント
`ExcludeHeaderRows` 見出し行を除外するか 超重要! これを `True` にしないと、見出しまで並び替えられてデータの中に紛れ込みます。
`FieldNumber` 何列目を基準にするか 1から始まる列番号を指定します。
`SortField` データの種類 文字列なら `wdSortFieldText`、数値なら `wdSortFieldNumeric` を指定します。
`SortAscending` 昇順か降順か `True` なら昇順(1→10)、`False` なら降順(10→1)です。

3. 実践:特定の列を基準にソートする基本コード

それでは、実際に使えるコードを見てみましょう。
例えば、「1番目の表があり、2列目にある『金額(数値)』を基準に、金額の低い順(昇順)に並び替える」というシナリオです。

Sub SortMyTable()
    ' 変数の宣言:プロフェッショナルの第一歩は、型を明確にすることから始まります
    Dim targetDoc As Document
    Dim myTable As Table
    
    ' 現在開いている文書をセット
    Set targetDoc = ActiveDocument
    
    ' 文書内の「1番目の表」を対象にする
    ' ※表がない場合にエラーが出るのを防ぐため、実務では存在チェックを入れるのが定石です
    If targetDoc.Tables.Count = 0 Then
        MsgBox "文書内に表が見つかりません。", vbExclamation
        Exit Sub
    End If
    
    Set myTable = targetDoc.Tables(1)
    
    ' --- ここからが並び替えのメイン処理 ---
    On Error GoTo ErrorHandler ' 万が一のエラーに備える「守り」のコード
    
    myTable.Sort _
        ExcludeHeaderRows:=True, _
        FieldNumber:=2, _
        SortField:=wdSortFieldNumeric, _
        SortAscending:=True
    
    MsgBox "並び替えが完了しました!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。表の構造(結合セルなど)を確認してください。" & vbCrLf & _
           "Error: " & Err.Description, vbCritical
End Sub

コードの解説:エンジニアの視点

1. `Sort` メソッドの `_`(アンダースコア):
これは「行が続くこと」を示す記号です。1行に長く書くと読みづらいため、引数ごとに改行して、人間が読みやすい「美しいコード」にしています。
2. `wdSortFieldNumeric`:
ここがポイントです。もしここを `wdSortFieldText` にしてしまうと、数値の「10」が「2」よりも前に来てしまいます(文字列として「1」から始まるため)。数値を扱うときは必ず `Numeric` を選びましょう。
3. `On Error GoTo ErrorHandler`:
これは「エラーハンドリング」と呼ばれる技術です。表の構造が複雑な場合、VBAはパニックを起こして止まってしまいます。それを優しくキャッチして、ユーザーに理由を伝えるための「大人な書き方」です。

4. 陥りやすい「罠」:これを知っていれば君はもう初心者じゃない

現場でよく遭遇する、エンジニアを悩ませる2つの罠を教えておきましょう。

罠①:結合されたセル(Merged Cells)

Wordの表で「セルを結合」している場合、`Sort` メソッドは高確率でエラーを吐きます。
`Sort` は、全ての行が「同じ列数」であることを前提として動いています。一部の行だけ列数が違うと、プログラムは「どこまでが1つのデータなのか」を判断できなくなるのです。
対策: 並び替えを行う表では、可能な限りセルの結合を避け、構造をシンプルに保ってください。

罠②:数値に見える「文字列」

セルの中に「100円」のように、数字以外の文字が混ざっていませんか?
これらが混ざっていると、`wdSortFieldNumeric` を指定しても、Wordは「これは数値ではない」と判断し、正しく並び替えができません。
対策: データを流し込む段階で、数値のみが入るように設計(データクレンジング)しておくことが、自動化エンジニアの腕の見せ所です。

まとめ:次は「動的な制御」へ

今日学んだ `Table.Sort` は、単なる並び替えのコマンドではありません。
「データという混沌とした状態を、ルールに基づいて秩序ある状態へ導く」という、自動化の本質的なプロセスです。

1. 見出し行を除外する(ExcludeHeaderRows)
2. 列番号を正しく指定する(FieldNumber)
3. データの型を意識する(SortField)

この3点をマスターしたあなたは、もう「マクロの記録」の限界を超え始めています。
次は、このソートを「特定の条件を満たした時だけ実行する」といった、if文による条件分岐と組み合わせてみてください。

道は続いています。一歩ずつ、楽しみながら進んでいきましょう!

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