先日の記事「【Wordマクロ】特定の列のフォント書式を変更する
」に関連した記事をMicrosoft Excel MVPの伊藤さんが書かれていますので紹介いたします。
表の列を選択するWordマクロ
(インストラクターのネタ帳)
表のColumnsプロパティを使って列を選択するというものです。
そうなのです。列の選択ですから、Columnsプロパティが直感的でわかりやすいですね。
記事では、このプロパティを見つける方法を細かく紹介いただいており非常に参考になります。
私はこのプロパティについて言及をしておりませんでした。ご紹介をありがとうございます。
また、それを受けて、Microsoft Office System MVP のきぬあささんが記事を書かれました。
表の特定の列に対して処理を行うWordマクロ
(初心者備忘録)
こちらの記事では、なぜSelectionオブジェクトとRangeオブジェクトで選択範囲が異なってしまうのかの考察と、Cellsプロパティを用いたRangeオブジェクトで処理をするための方法が紹介されています。
こちらもなるほど!という方法ですね。
Selectionを用いずに列に処理をする方法として、これ使えますね。ありがとうございます。
今回の記事では、Columnsプロパティを使う場合の注意点について紹介します。
Columnsプロパティを使うときの注意点
前回の記事で私がColumnsプロパティを使わなかった理由を紹介しておりませんでした。
私は経験上、列の処理にはColumnsプロパティは使わない方がいいと思っていたので、その前提で書いてしまいました。
そう感じるようなった経緯をあらためて思い出してみたところ、1つ理由が挙げられます。
Columnsプロパティは、表内のセルが横方向で結合しているときには使えないのです。
まず、正常に動作する場合を紹介します。以下のような文書の先頭にある表でマクロを実行します。
サンプルマクロは以下の通りです。
Sub test1()
ActiveDocument.Tables(1).Columns(2).Select
End Sub
このマクロを実行すると、以下のようになります。
ActiveDocument.Tables(1)は現在文書の1番目の表です。
そして、Columns(2)で2列目を指定し、選択しているわけです。
ところが、以下のような文書の先頭にある表で同じtest1マクロを実行します。
この表は、3行目の2列目と3列目が結合されています。そのため、エラーメッセージ「セル幅が全て同じではないため、このコレクションの個別の列にアクセスすることができません。」が表示されるのです。
Columnsプロパティを用いて列を選択する方法は、セルの結合が成されていない場合には直感的で便利な方法なので、ぜひ覚えておきたいですね。
セルが結合している場合には処理できないのでその点に注意が必要です。
セルが結合していても使えるRangeによる選択範囲の指定
上記のようなセル結合の場合に使えるのが以下のサンプルマクロです。
先日の記事「【Wordマクロ】特定の列のフォント書式を変更する
」をベースに同じ考え方でマクロを書きました。
Sub test2()
Dim myDoc As Document
Dim myTable As Table
Dim myRowMax As Integer
Dim Pos_Start As Long
Dim Pos_End As Long
'現在の文書をmyDocオブジェクトに設定
Set myDoc = ActiveDocument
'文書の1つめの表をmyTableオブジェクトに設定
Set myTable = myDoc.Tables(1)
'myTableの行数をmyRowMaxに代入
myRowMax = myTable.Rows.Count
'選択範囲の先頭と末尾の値を取得
'先頭の場合、1行目2列目のセルの開始位置
Pos_Start = myTable.Cell(1, 2).Range.Start
'末尾の場合、表の最後の行の2列目のセルの終了位置
Pos_End = myTable.Cell(myRowMax, 2).Range.End
'現在文書(myDoc)内のRangeで範囲を指定して選択
myDoc.Range(Pos_Start, Pos_End).Select
'オブジェクト変数の開放
Set myDoc = Nothing
Set myTable = Nothing
End Sub
このマクロを実行します。
途中でStopステートメントを入れてローカルウィンドウで変数の値を見てみます。
つまり、開始位置と終了位置は以下の位置を示しています。
さて、この範囲を選択するということは、マウスにより以下のようにドラッグして選択するのと同じことです。
結果として、以下のように範囲選択されます。
Rangeの位置の考え方
上記の開始位置、終了位置ですが、ローカルウィンドウに表示された4文字目、72文字目という数字に従いカーソルを動かせば、位置を特定できます。
表内のRangeの位置は以下のように順序づけられています。この場合、表の右端の改行記号も1文字として数えます。
今回の場合、4文字目というのは、文書先頭にカーソルを置いて、⇒矢印キーを4回押した位置です。
72文字目というのも同様に、文書先頭にカーソルを置いて、⇒矢印キーを72回押した位置なのです。
(実際には段落記号の後ろにはカーソルはおけないので、Cell(5,3)の先頭になりますが)
複数列を選択する方法
上記のマクロを応用すると、以下のように2列選択するマクロも作れます。
Sub test3()
Dim myDoc As Document
Dim myTable As Table
Dim myRowMax As Integer
Dim Pos_Start As Long
Dim Pos_End As Long
'現在の文書をmyDocオブジェクトに設定
Set myDoc = ActiveDocument
'文書の1つめの表をmyTableオブジェクトに設定
Set myTable = myDoc.Tables(1)
'myTableの行数をmyRowMaxに代入
myRowMax = myTable.Rows.Count
'選択範囲の先頭と末尾の値を取得
'先頭の場合、1行目2列目のセルの開始位置
Pos_Start = myTable.Cell(1, 2).Range.Start
'末尾の場合、表の最後の行の3列目のセルの終了位置
Pos_End = myTable.Cell(myRowMax, 3).Range.End
'現在文書(myDoc)内のRangeで範囲を指定して選択
myDoc.Range(Pos_Start, Pos_End).Select
'オブジェクト変数の開放
Set myDoc = Nothing
Set myTable = Nothing
End Sub
▼関連記事
【Wordマクロ】特定の列のフォント書式を変更する
表の列を選択するWordマクロ
(インストラクターのネタ帳)
表の特定の列に対して処理を行うWordマクロ
(初心者備忘録)