必要なセルだけを処理したい

VBAでセルの値を使った処理を行う場合、必ず考えないといけなくなるのが、「何行目、何列目まで処理するか?」という点です。それを無視するとシートの最大行や最大列に達してしまい、それ以上の範囲を処理しようとしてエラーが発生してしまいます。

エラーにならないように考えないといけないこととして以下のようなことが挙げられます。

  1. 空行や空列があった場合どうしたらよいか?
  2. 値が入っていないけど背景色だけ設定している場合はどうしたらよいか?
  3. 関数が入っているけど表示は空になっている場合はどうしたらよいか?

このように、いろいろとセルの内容によって考慮しなければならないことが発生しますが、「処理しなければならないセル範囲はどこか」という点については、UsedRangeプロパティを使えば、これらの考慮しないといけないことは解決します

構文

Property Worksheet.UsedRange As Range

UsedRangeプロパティは親オブジェクトとしてワークシートを指定します。ワークシートに入力されているセルの範囲をRangeオブジェクトを返します。

新規シートに追加しただけで何も入力されていないシートの場合は、入力されているセル範囲がないですがA1セルのみをセル範囲として返します。

そのため、UsedRangeは親オブジェクトとしてワークシートが存在していれば必ずRangeオブジェクトを返してくれます。

セル入力範囲を処理する場合のコード

入力されているセル範囲のセルを1つずつ処理する、というのはセルの処理を行う場合には結構使い道が多いです。

以下のコードはそのひな形として使える形にしています。

やっていることは、ワークシート(変数名:sht)のUsedRangeプロパティが示すセル範囲のセルをFor Eachで1セルずつ取得し、★マークの部分で実施したいセルの処理を書きます。例としてAddressプロパティでのセル座標を出力しています。

他のサンプル

上のUsedRangeプロパティを使ったサンプルコードですが、セル範囲を処理したい場合にはいろんな用途で利用できます。

以下は当サイトでUsedRangeプロパティを使っているページを抜粋しました。それぞれ用途は異なりますが、セル範囲を1セルずつ処理する、という考え方は上のサンプルコードと同じです。リンク先のコードはUsedRangeプロパティを使って実際にやりたいことが具体的に書いていますので、書き方などで迷うことがあったら参考にしてみてください。

  1. VBAで先頭のシングルクォーテーションを一括削除する
  2. VBAで数字や数式のセルの書式を文字列から標準に変更する
  3. VBAでセルの書式変更を反映させる
  4. VBAで非表示の行や列を見つける
  5. VBAで2つの表の違いを調べる
  6. VBAでシートの全セルの全角英数字を半角に変換する
  7. VBAで最終入力行のすぐ下の空白セルを選択する
  8. VBAで正規表現でのセル検索と置換を行う
  9. VBAで指定値を超えたセルを探す
  10. VBAで配列から重複する値を順序を変えずに削除する
  11. VBAで現在位置や表の一番下から1つ下のセルを選択
  12. VBAでシートのスクロール範囲を指定する
  13. VBAでシートの全セルの背景色をクリアする
  14. アクティブセルが入力セル範囲内か判定する
  15. VBAで同じ値のセルがいくつあるかを高速に数える
  16. VBAで数式が設定されているセルを高速で探す
  17. VBAで結合セルの場所を高速に探す
  18. VBAで別ブックのシートやセルを参照する
  19. VBAでシートの内容をテキストファイルに出力する
  20. VBAで取消線が付いた文字を削除する
  21. VBAで指定文字列があるセルに背景色を設定する
  22. VBAで空行を削除して行を詰める
  23. データがあるセル範囲に罫線を設定する
  24. 入力領域の終端セルを参照する
  25. VBAで2次元配列の初期化と利用方法
  26. VBAで編集セル範囲の選択と最終行と最終列の取得