Rangeの使い方:最終行まで選択を例に
Rangeの使い方・書き方について、データ最終行まで選択する場合を例に説明します、
Rangeの書き方なので、RangeオブジェクトではなくRangeプロパティの解説という事になります。
Range("A2", Range("A2").End(xlDown)).Select
Range("A2", Cells(Rows.Count, 1).End(xlUp)).Select
Selectの部分は、Copyだったりでしたが、基本的な書き方としては同じです。
ちょっと信じられない感じです。
指定方法が分からずに、試行錯誤でこの記述にたどり着いたのなら、それはその人をむしろ誉めたいくらいですが、
書籍や、ネットで情報発信する人が書くべきコードではないと思います。
以下、順に説明しますが、
基本的なRangeの指定方法については、
ExcelマクロVBA入門
そこで、A2~A10を選択するVBAでのRangeの書き方のいろいろです。
ここでは動作確認しやすいようにSelectで説明しますが、
実際には、Copyメソッド等になることが多いと思います。
Range("A2:A10").Select
これは極一般的な書き方なので問題ないでしょう。
Range("A2", "A10").Select
これでも同じ指定となります。
Range("A2", Range("A1").End(xlDown)).Select
これが最初に書いたもので、どうしてこんな書き方になってしまうのか・・・
これは悪い例です。
まあ、それで相談をうけたのですけど。
それでは、これもたまに見かける書き方ですが、
Range("A2", Range("A65536").End(xlUp)).Select
これ、2003までなら良いですけど、2007が出てから久しいですし、今や2013ですから、
固定の65536ってわけにはいきません。
では、1048576とするかって事ですが、これだと互換モード(.xls)では使えません。
Range("A2", Cells(Rows.Count, 1).End(xlUp)).Select
こういう事になりますね。
これは、
Range(セル番地文字, Rangeオブジェクト)
このような指定になっているのです。
WorksheetのRangeプロパティのヘルプより。
セルまたはセル範囲を表す Range オブジェクトを返します。 構文 式.Range(Cell1, Cell2) 式 Worksheet オブジェクトを表す変数。 パラメーター
備考 オブジェクト修飾子を指定せずにこのプロパティを使用すると、ActiveSheet.Range のショートカットとなります。つまり、アクティブ シートから範囲を取得します。アクティブ シートがワークシートでない場合、このプロパティは失敗します。 Range オブジェクトに対して使用すると、このプロパティは、その Range オブジェクトと相対的に動作します。たとえば、セル C3 を選択すると、Selection.Range("B1") は、Selection プロパティで取得される Range オブジェクトと相対的な範囲を取得するので、セル D3 が返されます。一方、コード ActiveSheet.Range("B1") は必ずセル B1 を取得します。 次の使用例は、シート 1 のセル A1 の値を 3.14159 に設定します。 Worksheets("Sheet1").Range("A1").Value = 3.14159 Worksheets("Sheet1").Range("A1").Formula = "=10*RAND()" For Each c in Worksheets("Sheet1").Range("A1:D10") If c.Value < .001 Then c.Value = 0 End If Next c numBlanks = 0 For Each c In Range("TestRange") If c.Value = "" Then numBlanks = numBlanks + 1 End If Next c MsgBox "There are " & numBlanks & " empty cells in this range" Worksheets("Sheet1").Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True |
※若干の編集を加えています。
Range(Cell1, Cell2)
このCell1の説明が、「セル範囲の名前を指定します。」となっていますからね。
しかし、これはヘルプを書いた人の意図と少し違っているものと思われます。
最後の、「Range プロパティの構文 2 を使用」ここに注目してください。
構文1は、
Range(Cell1)
Cell1は、セル範囲の名前を指定
構文2は、
Range(Cell1, Cell2)
Cell1とCell2は、「セル範囲の左上隅と右下隅のセルを指定」
と考えるべきなのです。
このような記述が出来ないことにあります。
Range(Cells(1, 1), Cells(5, 3))、これができるのに、Range(Cells(1, 1))、こちらができないのです。
そして、そもそも、
Range(Cells(1, 1), Cells(5, 3))
この指定は、ヘルプのCell1の説明に反しています。
「セル範囲の名前を指定します。」と書いてあるのに、違う指定となっています。
この理由により、Rangeプロパティの作者の意図は、
構文1と構文2を明確に区分けしているという事です。
構文2のCell指定は、バリアント型で、
「Range オブジェクト、あるいはコード記述時の言語で単一のセルの名前を示す文字列を指定」
となっていますので、先のような文字列とオブジェクトの混在も許されているということです。
ただし、構文2で文字列を指定するという事は、その文字列のRangeオブジェクトへの変換を、
Rangeプロパティにやってもらっているだけのことでしかありません。
ですから、先の書き方が絶対にダメだと言っているわけではなく、
あまり良い書き方ではないという事、初心者に伝えるべき書き方ではないということです。
このような書き方を見せられても、初心者は応用が効かなくなってしまいます。
そして、先のコードも、そのような問い合わせを受けたものです。
構文1
Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).Select
こうなっちゃいますよね、これは構文1に忠実に書いてはいますが、このような書き方は止めましょう。
その為に、構文2が用意されているのですから。
構文2
Range(Range("A2"), Cells(Rows.Count, 1).End(xlUp)).Select
これが推奨の書き方になります。
もちろん、Range("A2")は、Cells(2, 1)のどちらでもよいです。
VBAを覚えようとしている人に見せるコードとしては、
やはり基本に忠実なコードを提示すべきだと思い、かなり気にかかったのでここに書きました。
同じテーマ「マクロVBA技術解説」の記事
オートフィルタ(AutoFilter)の使い方まとめ
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧(カラー定数、XlRgbColor列挙)
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- Rangeの使い方:最終行まで選択を例に
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。