用語:~Excel2000~RangeプロパティでのRangeオブジェクトの取得と、Cellsプロパティでのそれとの違いについて※まだ書きかけです。※間違ってたらすみません。※メモ書きなので、自分でも意味不明な箇所も多いです。※本記事は、僕自身が「ヘルプ」を読んで、そこに書いてあったことを自分なりにまとめなおして書いただけですので、間違いがあったらすみません。文」以外のことは全部、ヘルプに書いてあります。ヘルプも読んでみてください。Web記事や市販書籍だけだと間違います。『だまされるな!RangeとCellsの使い分け!https://excel-ubara.com/excel5/EXCEL813.html』←どうしてもExcelで数万行のテーブルを頻繁に扱うデータベースなどを作らないといけなくなった、どうしても速度が出ない、というようなかた向けです。最初からリレーショナルデータベースとExcelと連携で使う人にはさほど関係ありません。(「だまされるな!」はさすがに「極端な意見」なので、「自分のことだけが自動化できればいい、他人のファイルは扱わない、ファイルも同時に2つくらいしか扱わない、という方は参考程度で。勉強にはすごくなります。)このWebページの巻末にある関連ページも、CellsとRangeの使い分けには、非常に参考になると思います。セルや行・列の操作方法を知ろう」がすごく参考になります。セルの「Selection」を「Range(××)」や「ActiveCell」などに書き換えることでいろいろに使えます。VBA初心者の方は買っておくととっても良いと思います。セルの操作」の部分もとても参考になります。上記2冊は、ExcelVBAビギナー必携だと思います。他の本は、以下に記した「真の基本の市販書籍」以外は、ビギナーさんは買わなくても良いと思います。(僕もビギナーですので)この2冊は、決して「レベルとして簡単」ではないですが、初心者の立場に立ってできるだけ易しく書いてあります。初心者の方を「誤った道」に行かせないように作ってありまして、「ExcelVBAのレジェンドさんたちの初心者本やその関連団体の本」や「教科書を名乗る書籍」、「思想が極端なサイトの一部のWebページ」を読んで「騙される、勘違い人間」になる、よりは100倍良いかと思います。※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。はじめにRangeオブジェクトを取得するには、RangeプロパティやCellsプロパティを使うことができます。(Rangeオブジェクト=セル・セル範囲、取得≒選択)ほかに、Range+Cells、Offsetプロパティ、Unionメソッド、でも取得できますが、ここではRangeプロパティとCellsプロパティだけの「取得」の雰囲気の違いを少しご説明します。※僕自身が「ヘルプ」を読んで、そこに書いてあったことを自分なりにまとめなおして書いただけですので、間違いがあったらすみません。文」のこと以外は全部、ヘルプに書いてあります。ヘルプも読んでみてください。Web記事や市販書籍だけだと間違います。Rangeプロパティ(01)「絶対」的な感じのセル操作(セル取得)についてRangeプロパティでRangeオブジェクトを取得する場合、親オブジェクトの記述を省略するか、あるいは逆に、親オブジェクトに明示的に「ActiveSheet」や「Worksheetオブジェクト」を指定すると、次の(ア)や(イ)のような形のセル取得やセル範囲取得ができます。(ア)「A1」とか「C1」といった感じで、「A1形式」での「単一セル」の取得(≒選択)ができます。」といった感じの、「A1形式」での「セル範囲」の取得(≒選択)もできます。(※:親オブジェクトの記述を省略すると、「親にActiveSheetが指定された」とみなされます。「ActiveSheetのセルやセル範囲」、ということになります。今現在アクティブなワークシートのセルやセル範囲を選択できます。当然ですが、アクティブでない(今目に見えてない)ワークシートのセル・セル範囲は取得できません。アクティブでないワークシートのセル・セル範囲を取得したい場合は、ActiveSheetではなくて「Worksheetオブジェクト」を親オブジェクトとして明示的に指定する必要があります。変数」といった感じで、数字の部分を数値型の変数に置き換えることで、繰り返し処理(ループ処理)をセルの縦方向にだけ、やりやすいです。横方向はやりにくいです。(「A1形式」の場合、横方向は数値ではなく、A、B、C、・・・とアルファベットで変数を使って指定しなければならないため。繰り返し処理ではアルファベットを使っての処理はもともと難しいです。Next」と書くと、「セル範囲のすべてのセル」を処理の対象とできますので、つまりは、セルの横方向への処理も、一応は可能となります。文」の中で、「何らかの基準でセルを区別するための、条件分岐の命令」を書けば、ある条件下のもと、特定のセルをとばしとばしにして一括処理ができます。文」を使うしかないことになります。(そうしたほうが手っ取り早くて便利・・・、ということにはなります。使うほうが速いのか遅いのかはこちらでは未確認ですので、ご自分でも調べてみてください。遅かったとしてもそれほど大きな問題にはならないと思いますけど・・・。プロパティなどでのRangeオブジェクト指定」も使えます。明示的なオブジェクト名」でも可。条件分岐での処理を書いてもOK。・・・」という文は書かなくてもいいっぽいです。上記構文の「コレクション」の部分は、基本、コレクション(コレクションオブジェクト)を用います(=コレクション名を書きます)。これはWordでもAccessでも同じです。Excelの場合は、「Rangeオブジェクト(セル範囲)」のように、「もともとコレクション的な構造を持つオブジェクト」でもOKのようです。「Application.Selection」や「Windows(××).Selection」など・・・、つまり、「シート上で実際にドラッグなどで選択されているセル範囲」を使うこともできます。(※「Application.」や「Windows(××).」は一応省略できます。指定したとみなされます。ところで親オブジェクトを省略するとエラーになってしまうようなものもあります。)なお、「セル範囲」ということで言うと、「名前の定義」をしたセル範囲も使えます。文」でセルの一括操作できます。』といったかたちでセルの一括操作ができます。』といった感じで使えます。この場合、Rangeをセルのアドレスで表現しなくて済み、定義した表の名前で表現できるので、あとからプログラムを読み返すときに読み返しやすくなります。引継ぎ者もラクになります。文」は、基本、オブジェクト操作やオブジェクト変数操作に使う繰り返し文で、オブジェクトに対する一括処理がとってもしやすいです。コレクションの中の単一オブジェクトを(最小限の少ないプログラムコードで)すべて走査してしてくれます。コレクションの中の単一オブジェクトの「すべて」を走査してしてくれので、処理を適用したい・あるいは・したくない単一オブジェクトの条件を、IF文などで指定すれば済んでしまいます。前述のとおり、コレクションだけでなく、セル範囲の中のすべてのセル、また、DAOやADOなどのオブジェクト(列とか)にも利用できます。一般変数=文字ベースデータの変数の繰り返し処理・一括処理には、基本、使えません。カウンタ用の変数も必要です。(ただし、一般変数でもそれが「配列」になっていたら、配列に対しては使えます。配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。』と記載されています。文」では、カウンタ変数は、「コレクション内の全ての単一オブジェクトたち」に対しては、基本的には、必要ありません。その他の何かの処理・操作には必要となることがあるかもしれませんけど・・・。カウンタ変数が基本、要らないのでとても便利です。文」のほうが便利なことも少なくないかもしれません。適材適所で使えると思います。次の例は、A1~F1までの1行の6つのセルをすべてチェックして、もしセルの値が1よりも大きかったら値の文字の色を赤にするプログラムです。'一括処理用の空のオブジェクト変数を用意。'A1~F1のセルを1つずつすべて以降のように処理しろ。文が自動的にやってくれる・・・」みたいな感じ。・・・」はしなくていいっぽいです。'やりたい一括処理(=セル1個あたりの処理。あまりに高速なので一括でやったように目に映ります。ここではA1~F1までの6個分のセルの処理なので、同じ処理を6回繰り返すことになります。'文字の色を赤にしろ。'一括処理用の空のオブジェクト変数を用意。'A1~F1のセルを1つずつすべて以降のように処理しろ。文が自動的にやってくれる・・・」みたいな感じ。・・・」はしなくていいっぽいです。'やりたい一括処理(=セル1個あたりの処理。あまりに高速なので一括でやったように目に映ります。ここではA1~F1までの6個分のセルの処理なので、同じ処理を6回繰り返すことになります。'文字の色を赤にしろ。Sub''(02)「相対」的な感じのセル操作(セル取得)についてなお、RangeプロパティでRangeオブジェクトを取得する場合、そのRangeオブジェクトの親オブジェクトをWorksheetオブジェクトではなく、Rangeオブジェクトにすると、「相対的なアドレス」でのセルの扱いができるようになります。「セル範囲」の一番左上のセルが相対的に「A1」になります。(=「セル範囲」の一番左上のセルを、「相対的な”A1”」とみなすことが可能となります。Activesheet.Range("A4:D7").Range("A1").Address$A$4この例のように、Rangeプロパティの1つ上の階層の(=1つ親の)オブジェクトがRangeオブジェクトだった場合に、その親オブジェクト側にて、例えば「A4:D7」といった感じで「連続するセル範囲」が指定されていた場合、「子」側の「A1」は相対的なものとなります。「Range("A1")」の「"A1"」は、「A4:D7」というセル範囲の中の、一番左上のセルのアドレスを意味します。上記の例では、イミディエイトウィンドウ「$A$4」とに表示されます。これは、正しい動作です。1つ親のRangeオブジェクトの記述が省略されれば、ActiveSheet上のすべてのセルがセル範囲としてみなされるので、その一番左上のセルは「$A$1」となります。(03)注意事項1つ親のオブジェクトの記述を省略すると、「ActiveSheet」を指定したとみなされ、「絶対的なアドレス」でのセル操作となります。「ActiveSheet」がワークシートじゃないと失敗します(エラーになります)。Activesheet.Range("A4:D7").Range("A1").Addressとやるとエラーになります。・オブジェクトブラウザで「ActiveSheet」で検索します。・「検索結果」に出てきたものをどれでもいいのでクリック。・下のほうの「説明ペイン」を見ます。Object」とあるので「オブジェクト」とわかります。Object」と表示されたものは、「オブジェクトである」と決まっていますので・・・。Cellsプロパティ(01)「絶対」的な感じのセル操作(セル取得)についてCellsプロパティでRangeオブジェクトを取得する場合、親オブジェクトの記述を省略するか、あるいは逆に、親オブジェクトに明示的に「ActiveSheet」や「Worksheetオブジェクト」を指定すると、次の(ア)や(イ)のような形のセル取得やセル範囲取得ができます。(ア)「1,1」といった感じで、「R1C1形式」での単一セルの取得(≒選択)ができます。」のような、「セル範囲」の取得自体は「できません」。シート上の「すべてのセル」か、単一セルしか取得できません。(※:親オブジェクトの記述を省略すると、「親にActiveSheetが指定された」とみなされます。「ActiveSheetのセルやセル範囲」、ということになります。10))」といった感じで、Rangeプロパティと組み込み合わせるしかないようです。※J列は左から10列目。)ただし、Cellsプロパティでは、「1,1」を「変数,変数」といった感じで、数字の部分を数値型の変数に置き換えることで、繰り返し文(ループ処理)もいっしょに使うと、「セルの縦方向にも横方向にも」一括処理がやりやすいです。文」を使わなくても、一応、変数と繰り返し文だけで、横方向(列方向)の一括処理ができます。(それが良いことなのか悪いことなのかはTPOによって変わってくると思いますが...。文」を使わない場合に限っては)繰り返し処理を縦方向にしか扱いづらいですが、Cellsプロパティではセルの横方向にも、変数を使って、自動的に高速に繰り返し処理(一括処理)ができることになります。したらRangeプロパティよりも便利なこともあるかもしれません。文」を使ってしまうほうがわかりやすいし、早いです。のちのちのコードの読み返しもしやすいかもです。文」』を使うことをメインとし、特別な事情があるときだけCellsプロパティを使う・・・というようなかたちでも、もしかしたら・・・、良いのかもしれません。逆に、慣れてきたらCellsプロパティをたくさん使って、プログラムをどんどん書いていけばいいと思います。Cellsプロパティを使うほうが処理速度が一応速いらしいですし、その他のメリットもあるようですので・・・(02)「相対」的な感じのセル操作(セル取得)についてなお、CallsプロパティでRangeオブジェクトを取得する場合、そのRangeオブジェクトの親オブジェクトをWorksheetオブジェクトではなく、Rangeオブジェクトにすると、「相対的なアドレス」でのセルの扱いができるようになります。これはRangeプロパティの場合と同じです。「セル範囲」の一番左上のセルが相対的に「1,1」になります。(=「セル範囲」の一番左上のセルを、「相対的な”1,1”」とみなすことが可能となります。)ひいては、「”セル範囲内”での縦横両方向のループ処理」についても、Rangeプロパティよりもやりやすいです。1).Address$A$4Cellsプロパティの1つ上の階層の(=1つ親の)Rangeオブジェクトにおけるセル範囲が「A4:D7」の場合、相対的な「R1C1形式」での「1,1」、つまり、セル範囲の一番左上のセルのアドレスは、「$A$4」となり、正しいです。1つ親のRangeオブジェクトの記述が省略されれば、ActiveSheet上のすべてのセルがセル範囲として捉えられるので、その一番左上のセルは「$A$1」となります。(03)注意事項1つ親のオブジェクトの記述を省略すると、「ActiveSheet」を指定したとみなされ、「絶対的なアドレス」でのセル操作となることもRangeプロパティと同じです。こちらも、「ActiveSheet」がワークシートじゃないと失敗します(エラーになります)。1).Addressとやるとエラーになります。「R1C1形式」は以下のような値を使ってセルを特定します。挫折するオブジェクト式やプログラム(プロシージャ)の書き方、挫折しない書き方、の違い。送信メールが受信トレイに入ってしまうトラブルの回避、など。ODBCでQueryTableオブジェクトを自動作成するサンプルコード)。2000以降の全バージョンで使えると思います。~ついでに、セルの値で結果表示を自動で切り替える「パラメータクエリ」のVBAでの自動作成も。~★★Access2000VBA・Excel2000VBA独学~Win32API。eChromeを例に。(Excel、Word、Access、などが32bit版のモノでしか使えませんが、OSは64bitでも大丈夫です。政府やニュースが言うところの「過去最高益」のウソというか、まやかしというか、とにかくそこから人件費総額の過去最高額との差分を引いた数字で発表してほしいです。ないと「過去との」比較になりません。「安全」な、Youtube動画のダウンロード方法6つ。挫折するオブジェクト式やプログラム(プロシージャ)の書き方、挫折しない書き方、の違い。送信メールが受信トレイに入ってしまうトラブルの回避、など。ODBCでQueryTableオブジェクトを自動作成するサンプルコード)。2000以降の全バージョンで使えると思います。~ついでに、セルの値で結果表示を自動で切り替える「パラメータクエリ」のVBAでの自動作成も。technology.。