【入門編】【中級者向け】表内のテキストを読み取り、特定のキーワードでグループ分けして別表へ転記する – Word VBA解析バイブル

スポンサーリンク

Word VBAの真髄:複雑な表データを「意のままに」操るための自動化アーキテクチャ

こんにちは。Word VBAの深淵へようこそ。
マクロの記録を卒業し、自身の指先でドキュメントを制御したいと願うあなたへ。今日は、Word VBAの中でも特に難易度が高く、かつ実務で最も重宝される「表の動的再構築」について伝授します。

単にデータをコピーするだけのコードは、誰でも書けます。しかし、「データの構造を理解し、メモリ上で適切にさばき、新たな表として再定義する」というプロセスを習得すれば、あなたの業務効率は次元が変わります。

準備はいいですか?「表の解析と再構築」という、VBAエンジニアの登竜門を突破しましょう。

—

1. なぜ「表の操作」は難しいのか?

Wordの表(Tableオブジェクト)は、Excelのセルと異なり、非常に「有機的」です。結合セル、ネストされた表、可変的な行数……これらを力技で制御しようとすると、必ずコードはスパゲッティ化し、実行速度は低下します。

極限の知見:
表を操作する際、最も重要なのは「選択(Selection)」を使わないことです。`Selection`は画面のカーソルを動かすため非常に低速です。常に`Range`オブジェクトを使い、メモリ内で完結させるのがプロの作法です。

—

2. 実践:キーワードによるグループ分け転記

今回は、「カテゴリ」という列を持つ既存の表から、特定のカテゴリを抽出して新しい表を作成するコードを解説します。

今回のアプローチ

1. 解析: 元の表を走査し、目的のデータを行単位で取得。
2. 収集: 該当データを一時的に保持。
3. 生成: 新しい表を挿入し、データを流し込む。

実装コード

Sub ExtractAndSortTableData()
Dim doc As Document
Dim srcTable As Table
Dim newTable As Table
Dim i As Long, targetRow As Long
Dim category As String

Set doc = ActiveDocument

‘ 表が選択されているか確認(安全装置)
If Selection.Information(wdWithInTable) = False Then
MsgBox “表内にカーソルを置いてください。”
Exit Sub
End If

Set srcTable = Selection.Tables(1)

‘ 新しい表を作成(元の表の直後に挿入)
Set newTable = doc.Tables.Add(Range:=doc.Range(srcTable.Range.End, srcTable.Range.End), _
NumRows:=1, NumColumns:=srcTable.Columns.Count)

‘ ヘッダーをコピー
For i = 1 To srcTable.Columns.Count
newTable.Cell(1, i).Range.Text = srcTable.Cell(1, i).Range.Text
Next i

‘ データを解析(2行目からループ)
targetRow = 2
For i = 2 To srcTable.Rows.Count
‘ ここでは「1列目」がカテゴリと仮定
category = Left(srcTable.Cell(i, 1).Range.Text, Len(srcTable.Cell(i, 1).Range.Text) – 1)

‘ 特定のカテゴリ(例: “重要”)であれば転記
If category = “重要” Then
newTable.Rows.Add
Dim col As Integer
For col = 1 To srcTable.Columns.Count
‘ セルの内容を流し込む(セルの末尾記号を除去してテキストのみ取得)
newTable.Cell(targetRow, col).Range.Text = _
Left(srcTable.Cell(i, col).Range.Text, Len(srcTable.Cell(i, col).Range.Text) – 1)
Next col
targetRow = targetRow + 1
End If
Next i

MsgBox “転記完了!”
End Sub

—

3. コードの「魂」を理解する

なぜ `Left(…, Len(…) – 1)` を使うのか?

Wordのセル内のテキストを取得すると、必ず末尾に「セル終了記号(Chr(13) + Chr(7))」が含まれます。これをそのまま別のセルに代入し続けると、改行が過剰に増えたり、レイアウトが崩壊します。この除去処理こそが、美しい帳票を作るための「魔法の粉」です。

`Range`オブジェクトの活用

`Selection`を使わず、`srcTable.Cell(i, col).Range`と直接アクセスすることで、処理速度は劇的に向上します。大規模なドキュメントを扱う際、この差は数秒から数分へと開きます。

—

4. 陥りやすいエラーと対策

1. 「インデックスが有効範囲にありません」エラー

  • 原因: 結合されたセルがある場合、`Cell(i, j)`の指定がずれます。
  • 対策: 結合セルがある場合は、`Cell`オブジェクトのループよりも、`Row`単位での処理を優先しましょう。

2. 画面のちらつき

  • 対策: コードの冒頭に `Application.ScreenUpdating = False` を入れ、最後に `True` に戻す。これだけで「処理の重厚感」が変わります。

—

最後に:先輩からのアドバイス

VBAの学習は、エラーとの対話です。「なぜ動かないのか」と悩んだ時こそ、あなたのエンジニアとしての筋力が鍛えられています。

今回作成したロジックは、データの振り分けだけでなく、「特定条件の行を強調する」「特定の文字列を赤字にする」といった応用も可能です。まずはこのコードを書き写し、自分の手でドキュメントが書き換わる快感を味わってください。

ここをクリアしたあなたなら、次は「Wordドキュメントをデータベースのように扱う」というより高度な領域へ進めるはずです。応援していますよ。

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