必要なセルだけを処理したい
VBAでセルの値を使った処理を行う場合、必ず考えないといけなくなるのが、「何行目、何列目まで処理するか?」という点です。それを無視するとシートの最大行や最大列に達してしまい、それ以上の範囲を処理しようとしてエラーが発生してしまいます。
エラーにならないように考えないといけないこととして以下のようなことが挙げられます。
- 空行や空列があった場合どうしたらよいか?
- 値が入っていないけど背景色だけ設定している場合はどうしたらよいか?
- 関数が入っているけど表示は空になっている場合はどうしたらよいか?
このように、いろいろとセルの内容によって考慮しなければならないことが発生しますが、「処理しなければならないセル範囲はどこか」という点については、UsedRangeプロパティを使えば、これらの考慮しないといけないことは解決します。
構文
Property Worksheet.UsedRange As Range
UsedRangeプロパティは親オブジェクトとしてワークシートを指定します。ワークシートに入力されているセルの範囲をRangeオブジェクトを返します。
新規シートに追加しただけで何も入力されていないシートの場合は、入力されているセル範囲がないですがA1セルのみをセル範囲として返します。
そのため、UsedRangeは親オブジェクトとしてワークシートが存在していれば必ずRangeオブジェクトを返してくれます。
セル入力範囲を処理する場合のコード
入力されているセル範囲のセルを1つずつ処理する、というのはセルの処理を行う場合には結構使い道が多いです。
以下のコードはそのひな形として使える形にしています。
やっていることは、ワークシート(変数名:sht)のUsedRangeプロパティが示すセル範囲のセルをFor Eachで1セルずつ取得し、★マークの部分で実施したいセルの処理を書きます。例としてAddressプロパティでのセル座標を出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub UsedRangeSample() Dim sht As Worksheet '// ワークシート Dim r As Range '// セル '// アクティブシートをWorksheetオブジェクトに設定 Set sht = ActiveSheet '// シートのセル範囲を1セルずつループ For Each r In sht.UsedRange '// ★ここにセルの処理を書く '// セル座標を出力 Debug.Print r.Address(False, False) Next End Sub |
他のサンプル
上のUsedRangeプロパティを使ったサンプルコードですが、セル範囲を処理したい場合にはいろんな用途で利用できます。
以下は当サイトでUsedRangeプロパティを使っているページを抜粋しました。それぞれ用途は異なりますが、セル範囲を1セルずつ処理する、という考え方は上のサンプルコードと同じです。リンク先のコードはUsedRangeプロパティを使って実際にやりたいことが具体的に書いていますので、書き方などで迷うことがあったら参考にしてみてください。
- VBAで先頭のシングルクォーテーションを一括削除する
- VBAで数字や数式のセルの書式を文字列から標準に変更する
- VBAでセルの書式変更を反映させる
- VBAで非表示の行や列を見つける
- VBAで2つの表の違いを調べる
- VBAでシートの全セルの全角英数字を半角に変換する
- VBAで最終入力行のすぐ下の空白セルを選択する
- VBAで正規表現でのセル検索と置換を行う
- VBAで指定値を超えたセルを探す
- VBAで配列から重複する値を順序を変えずに削除する
- VBAで現在位置や表の一番下から1つ下のセルを選択
- VBAでシートのスクロール範囲を指定する
- VBAでシートの全セルの背景色をクリアする
- アクティブセルが入力セル範囲内か判定する
- VBAで同じ値のセルがいくつあるかを高速に数える
- VBAで数式が設定されているセルを高速で探す
- VBAで結合セルの場所を高速に探す
- VBAで別ブックのシートやセルを参照する
- VBAでシートの内容をテキストファイルに出力する
- VBAで取消線が付いた文字を削除する
- VBAで指定文字列があるセルに背景色を設定する
- VBAで空行を削除して行を詰める
- データがあるセル範囲に罫線を設定する
- 入力領域の終端セルを参照する
- VBAで2次元配列の初期化と利用方法
- VBAで編集セル範囲の選択と最終行と最終列の取得