セル範囲の操作


実務のマクロは何が難しいのかと言うと「分からないことを何とかする」が要求されるからです。対象のセルがどこにあるか分からない、シートの名前が何だか分からない、ファイルの名前が分からない、いくつあるか分からない、そもそも何をしたいのかが分からない。まぁ、最後のはともかく、実務で"分からない"は日常茶飯事です。さらに、極論を言えば、本当に分からないのでしたら、絶対にできません。なので「分からないことを何とかする」ときには、分からないことを調べる→分かった→「分かったことに何かをする」という発想と手順が必要です。今回は、"調べる"ことが多い「セル範囲」に関して、基本的な手法をご紹介します。

上図のように選択したセル範囲を対象にします。アドレスで示すなら、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」の部分を、ケースバイケースで変えてください。