実務のマクロは何が難しいのかと言うと「分からないことを何とかする」が要求されるからです。対象のセルがどこにあるか分からない、シートの名前が何だか分からない、ファイルの名前が分からない、いくつあるか分からない、そもそも何をしたいのかが分からない。まぁ、最後のはともかく、実務で"分からない"は日常茶飯事です。さらに、極論を言えば、本当に分からないのでしたら、絶対にできません。なので「分からないことを何とかする」ときには、分からないことを調べる→分かった→「分かったことに何かをする」という発想と手順が必要です。今回は、"調べる"ことが多い「セル範囲」に関して、基本的な手法をご紹介します。
上図のように選択したセル範囲を対象にします。アドレスで示すなら、Range("B3:E7")です。今回は、このセル範囲が「選択されている」とします。なので、Selectionです。実際には、CurrentRegionで取得されたセル範囲とか、Range(左上, 右下)で特定したセル範囲などが対象になると思います。
このセル範囲の、行数と列数は次のように取得します。
Sub Macro1() MsgBox Selection.Rows.Count End Sub
Sub Macro2() MsgBox Selection.Columns.Count End Sub
このセル範囲内に、いくつのセルがあるかを取得します。
Sub Macro3() MsgBox Selection.Count End Sub
ちょっと補足します。もしかしたら"難しい話"になりますので、よく分からない人は聞かなかったことにしてください。「Selection」は"選択したセル範囲"を表します。選択したセル範囲の個数(Count)なのだから、それって1個じゃね?って感じるかもしれませんが、これ実は「Selection.Item.Count」という意味です。RangeオブジェクトのItemプロパティは"既定のプロパティ"なので省略できます。なので、普通は省略して書くことが多いです。Itemプロパティというのは、イメージとして「その中に入っているモノたち」を表しますので、ここでは「20個のセルたち」です。その数(Count)を調べたのですから、結果は20です。この「Itemプロパティのイメージ」って、必須ではありませんけど、理解していると思わぬところで役立ちます。
ちなみに、Itemプロパティには引数が2つあります。「Item(RowIndex, ColumnIndex)」で、ColumnIndexは省略可能です。この書き方、どこかで見たことがありませんか?そう、「Cells(2, 3)」に似ていますね。実はこうしたCellsの使い方も、本当はItemプロパティが省略された記述です。そもそもCellsプロパティは、"全セル"を返すプロパティです。その全セルに対して、○行目の×列目と指定するので、省略しないで書くのなら「Cells.Item(2, 3)」です。でも、Itemプロパティは記述を省略できるので、普通はそれを「Cells(2, 3)」と書きます。
実務では、このへんをよく使います。特に"右下セル"は、オートフィルタを操作するときなどでは必須ですね。
Sub Macro4() Selection(1).Value = "左上" MsgBox Selection(1).Address(False, False) End Sub
これも、上で解説したように「Selection.Item(1)」です。Itemプロパティは引数ColumnIndexを省略できます。RowIndexのみ指定した場合は「○番目のセル」を表します。位置のカウントは、まず1行目を右方向に進みます。1行目が終わると、2行目を右方向に進みます。
Sub Macro5() Dim i As Long For i = 1 To Selection.Count Selection(i) = i Next i End Sub
上図を見れば、カンの良い方なら、右下のセルをどうやって特定するか分かりますよね。あるセル範囲の"右下セル"というのは、そのセル範囲内で"最後のセル"です。もし、セル範囲内に20個のセルがあるのなら「Selction(20)」です。で、この"セルの個数"というのは「Selection.Count」で取得できるんでしたよね。なので、こうなります。
Sub Macro6() Selection(Selection.Count).Value = "右下" MsgBox Selection(Selection.Count).Address(False, False) End Sub
セル範囲内の、RowsやColumnsを操作します。最初の行や、最初の列は簡単ですね。
Sub Macro7() Selection.Rows(1).Interior.ColorIndex = 3 MsgBox Selection.Rows(1).Address End Sub
Sub Macro8() Selection.Columns(1).Interior.ColorIndex = 6 MsgBox Selection.Columns(1).Address End Sub
では、最後の行や、最後の列はどうやって特定するのでしょう。これも、難しく考えることはありません。上図で、最後の行は「セル範囲内の5行目」です。この「5」とは"行の数"ですよね。
Sub Macro9() Selection.Rows(Selection.Rows.Count).Interior.ColorIndex = 4 MsgBox Selection.Rows(Selection.Rows.Count).Address End Sub
Sub Macro10() Selection.Columns(Selection.Columns.Count).Interior.ColorIndex = 5 MsgBox Selection.Columns(Selection.Columns.Count).Address End Sub
このへんを応用すると、
Sub Macro11() Selection(1) = "2/1" Selection(1).AutoFill Selection.Columns(1) End Sub
とか、
Sub Macro12() Selection.Rows(Selection.Rows.Count).Borders(xlEdgeTop).LineStyle = xlDouble End Sub
なんてことができます。
実務で必要な、基本的な操作は、こんな感じですかね。あとは、これの応用です。大事なことなので繰り返しますが、実際にはこのように「選択したセル範囲(Selection)」を操作することは希です。今回解説で使用した「Selection」の部分を、ケースバイケースで変えてください。