見出し画像

マクロのある暮らし(2回目) - セルの範囲

こんにちは!なるーらぼです。1回目はセルの参照についてお話ししました。今回はさらにセルの範囲についてお話ししていきたいと思います。

表の範囲

こんな表があったとします。

この表のを範囲で表すと「C5:E26」です。最後の行は26なのですが、これをマクロで取得しようとすると、いろんなやり方があります。

表の一番最後の行より下へマクロでデータを設定していきたいとき、どうされてますか?

どこかの列を決めて、ずーーーーっと下へセルの値を見ていく、そしてデータがなくなったら「最後の行だ!」とするというのが一番わかりやすい方法ですよね。

Sub note_mu()
 Dim count As Integer
 count = 5
 With Sheet1
  Do While .Range("C" & count).Value <> ""
   count = count + 1
  Loop
 End With
 MsgBox "最後の行は" & count & "です!"
End Sub

あら、でもこのコードだと最後の行は27になってしまいます。
最後の行の次の行、ということなら悪くはないかもしれませんが。

一方、Excelの操作に慣れていらっしゃる方は「コントロールキーを押しながら下矢印を押せば最後の行までジャンプするので、それをマクロでやればいいのでは」と考えるでしょう。

Sub note_mu()
 Dim count As Integer
 Sheet1.Range("C5").Select
 count = Selection.End(xlDown).Row
 MsgBox "最後の行は" & count & "です!"
End Sub

この場合はEndメソッドを使って、移動方向を「xlDown」に指定してやることでジャンプ先の範囲を得ることができます。あとは行番号が入っているRowプロパティを参照すればOKです。

ループも一切なしでめちゃくちゃ簡単になりましたよ!

では次のようになってしまったとしたら…

それに気づかずにさきほどのコードを動かすと…

おおっ!このまま最後の行を間違えたままデータをセットしてしまうと上書きしてしまうことになります!!

ではここで、Excelの操作に慣れていらっしゃる方はさらに思うかもしれません。「表の中でコントロールキーとAキーを押すと、表の範囲が欠けているセルがあっても表の範囲が選択されるよね」と。

こうして選択できた範囲から最後の行を取り出すとしたら、どうすればいいでしょうか?実際にその操作をマクロの記録で見てみてください。単に範囲が選択されただけにすぎないと思います!

これではどうにもなりませんよね…

では別の方法を考えましょう。Excelのワークシートには「UsedRange」というプロパティがあります。ちょっと無理やりですが、ほかに編集されているセルがなければ次のようにできるでしょう。

Sub note_mu()
 Dim count As Integer
 count = Sheet1.UsedRange.Row _
     + Sheet1.UsedRange.Rows.Count - 1
 MsgBox "最後の行は" & count & "です!"
End Sub

これで表になっている範囲から最後の行を取り出すことができました。この方法は利用範囲の最初の行に利用範囲にある行数を「Rows.Count」プロパティで求めて、最後に1つ多い分をマイナスしているということになります。

これなら欠けていても問題ないでしょう。列の場合はRowになっているところを「Column」にすれば同様にできます。

この方法は他にも転用することができますよね。たとえば、ある範囲に含まれる行数や列数を求めたり、ある範囲の最初の行番号や列番号を得ることもできるでしょう。

最後に

先ほどの例では利用済みの範囲をもとに求めましたが、範囲に名前が定義されているのであれば、そちらも利用することができます。

「C5:E26」に「何かの表」という名前が定義されている場合は以下のようにも書くことができます。

Sub note_mu()
 Dim count As Integer
 With Sheet1.Range("何かの表")
  count = .Row + .Rows.count - 1
 End With
 MsgBox "最後の行は" & count & "です!"
End Sub

ただ、この方法は名前で定義された範囲が誤っていると含まれる行数が代わってきてしまうため注意が必要です。

Excelでデータ表を管理するのは大変ですね!

この記事が気に入ったらサポートをしてみませんか?