★★★ Access2000VBA・Excel2000VBA独学~(多分、全バージョン共通・・・だと思います。)Excelのリスト形式の表を、「セルアドレスベース」ではなく「列名ベース」で読み書きする方法・3つ(7つ?8つ?)~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
目次

※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
★ はじめに
  
  

================
  
  
★ 01(半・名前ベース01):列名に名前の定義をしてそれの列番号をCellsプロパティで使う。
「たった1秒で仕事が片付くExcelの自動化の教科書」、という本の、274ページ以降に書いてあります。
僕も初めて読んだ時は、なるほど!すごい!と思いました。(★要注意!!:ホンモノ志向の本ではなく、「絆創膏プログラミング」の本なので妄信は危険です。が、結構役に立ちます。特に挫折中のかた。でもくどいようですがベースとなっている「思想」が「ダメ」です。特にこの本を買った方、扱うのは絶対に自分のデータだけにしてください。他人のデータや会社のデータを扱わないように気を付けてください。)

列名のセルだけに名前の定義するだけで、「列丸ごと」に名前の定義をするわけではないので、結構、作業がラクです。

Cellsプロパティの中で使うので、「行」に関してはカウンタ変数で表現します。

セルの書式操作や数式操作等、値の読み書き以外のことも同時に行える点がとてもメリットがあると思います。

列が増えるたびに設定をしないといけないのが少々面倒と言えば面倒かもしれません。
ただ、名前の定義もVBAで動かせるので自動化はできると思います。
あと、もしかしたら、ブック内に表の数が多くなったときに管理が面倒くさくなるかもしれません。
(VBAで解決できるかもしれませんが → 翌日、試してみたら全部解決できそうでした。全部、面倒くさくはならなさそうです。列名としてのセルの値と定義した名前が異なっていても機能するので、シート名をプレフィックスとして付けて名前定義しても大丈夫でした。)

なお、SQLのようなリレーションは既定では使えません。
(探せば方法があるのかも?でも、もしクラスモジュールとかまでを使うのなら面倒くさいですね。)

また、処理する先のシートが「開いてないと」あるいは「開いてあっても非表示」でないと操作ができません。

ただ、表の数がそれほど多くなければ、「値を自動的に転記等しながら、同時に、セルの書式操作や数式操作などもしたい」という場合はとても有効かと思います。
  
  

================
  
  
★ 02(半・名前ベース02):列をEnum(列挙)で定義をしてそれが返す数値(ある意味列番号)をCellsプロパティで使う。
「ExcelVBAを実務で使い倒す技術」、という本の、211ページ以降に書いてあります。これも買って読んでみるのもいいと思います。読んだ時は、なるほど!と思いました。
(こちらの本は普通です)

こちらも Cellsプロパティの中で使うので、行はカウンタ変数で表現します。

この方法も、セルの書式操作や数式操作等、値の読み書き以外のことも同時に行える点がとてもメリットがあると思います。一応、VBAでは、プログラムコードも自動的に書き入れることができたかと思いますので、メリットデメリットは前項の方法とだいたいいっしょかと思います。
処理する先のシートが「開いてないと」あるいは「開いてあっても非表示」でないと操作ができないのも同じです。
ただ、前項の01のやりかたのほうがラクはラクです。そちらのほうが、メンテしやすいかもしれません。
(もちろん、ケースバイケースだど思いますので、適材適所でつかうのがよいと思います。)

これも表の数が多くなければ、「値を入れながらセルの書式操作や数式操作などもしたい」という場合はとても有効かと思います。
  
  

================
これ以降は、似た者同士です。
  
  
★ 03(一応完全名前ベース):Microsoft Query+SQL(手動操作:Accessのクエリと同じ操作)

・ただし削除ができない(03~08までは同じです。)

メリットは新しい列をどれだけ挿入しても、どれだけどのように入れ替えても、01や02の方法のような再設定が何もいらない点です。また、相手が閉じたファイルでも「閉じたまま」読み書きできる点もです。

デメリットは、行の削除ができない、などです。
行の削除は相手先のファイルを開いてから、手動かVBAで・しかも行番号で選択して行わないといけないです。

ただ、削除できなくても基本的にはあまり大きな問題ではないので、削除するかわりに、削除フラグを立ててあげるだけでもいいと思います。実際、そのような仕様にすることは(多いかどうかはわかりませんが)あります。テーブル間の整合性を保つためにあえて削除できない仕様にすることも多いです。(初期値で埋めてあげるとか。)
それで「不正」が見つかるケースもまれにあります。(悪いことする人が削除=消えた、と誤解するため。不正処理の証拠が実際には残っているのですけど。Accessのように自動的にログがとれなかったり、ファイル破損があるような場合は「削除しない仕様」もありかと思います。)

そのほかのデメリットとしては、セル書式等を同時にいじれない、数式も同時にいじれないに等しい、などもあります。

ただこちらも、「1回入力したデータを、相手ファイルが閉じたまま、ネットワーク越しに、できるだけ少ないコードで何十通りにも使いまわす・使い倒すのが目的だから、そもそもセル書式とかに用はない。リレーショナルデータベース的に蓄積・データ再利用をしたいから、セル操作はもともと使わない。セル書式はクロス集計表にしてからとか、最終段階で普通にVBAで操作する。数式操作については、VBAとSQLの中で計算をやっちゃえば別に要らないので。」、と決めていれば、あまりデメリットでもありません。

かえって、SQL(もちろんリレーションも)が使えるぶん、メリットのほうが大きく作用します。
シートとシートを2枚でも3枚でもリレーションできます。(2016のリレーションシップと同じ機能:ただし、こちらは20年も前から使える業界標準機能です。もちろん、Excel2000以降の全バージョンで使えます。)

なお、書き込みすると、文字列型のデータには先頭に「'」(シングルクォーテーション)が付く場合があるかもしれません。
が、これについても、そのセルの値を変数に代入したとしても「'」は代入もされないし、さほど大きなデメリットではありません。(数値に「'」が付いたらまずいかもですが)
どうしても取りたかったら、相手ファイルを閉じている間はできませんが、開けばいくらでも取れます。
「'」のついていないセルをコピーしたのち、「'」のついたセルに書式を貼り付けすれば取れるので、VBAでもそういう操作をすればいいでしょう。

また、閉じた状態のファイルへの書き込みであれば、1行目をあらかじめ手入力にて、「削除フラグを立てたうえですべてのセルを初期値」で埋めておくと、文字列型の列(セル)には「'」が付かないっぽいです。

こちらの実験ではそうなりました。
(初期値としては、数値は「ゼロ」、文字列は「----」、日付は「1900/01/01」、時刻は「00:00:00」にするような感じで、空白セルを作らないということです。削除したいレコードについては削除フラグを立てるのみとするか、集計のし間違いを防ぐために初期値ですべての列を埋めてしまう、ということです。)

UNCパスも使えます=ファイルサーバ上の共有フォルダのExcelファイルの読み書きも「相手が閉じたまま」で、できます。その際も動作はそここそ速いと思います。(初回の読込だけ遅いかも)

ちょっと扱いづらくなってしまうかもしれませんが、「UPDATE句」や「INSERT句」も一応、使えます。
例えば「UPDATE句」は、何百行あっても、「ループなしの短い可読性の高いコードでの一括書き換え」ができるのでとても便利です。(少し複雑な条件でも)

※ここでのメリット・デメリットは全部、03~08までは同じです。
  
  
★ 04(同上):QueryTableオブジェクト+SQL(Microsoft Queryを手動ではなくVBA操作)
「Microsoft Query」をVBAで(=文字だけで)操作できるようにしたものです。
新規作成も自動化できます。
かなり便利です。
SQLベースなので、リレーションももちろん使えます。
  
  
★ 05(同上):DAO単独
VBAと同じようなループ処理での読み書きができます。
もちろん、相手のファイルが「閉じたまま」。
その際に、列名を「列名のまんま」何も再設定することなく使えるので便利です。
また、DAOの持つ色んな「オブジェクト、コレクション、メソッド、プロパティ」も使えます。
色んなオブジェクト、メソッドやプロパティが用意されているので、表の先頭行、最終行、指定行番号、指定条件行、セルアドレスに無関係に簡単に移動できますし、レコード数を簡単に知ることもできます。

基本、シートの内容を「レコードセット」という単一オブジェクトと化させて、扱います。
もちろん、いろんな「コレクション、メソッド、プロパティ」が使えます。
列番号(列)なども、「コレクション」として扱うことができます。

また、「レコードセット」は1つのプログラムの中にいくつでも作れます。

そのため、DAOがあるおかげで、表に対してだけは、(クラスモジュールによる)自作オブジェクトを作る必要がだいぶ減るとは思います。(まったくないわけではないと思いますが、前述の01や02の方法も織り交ぜていけば、相当、減るかと・・・。後述のADOでも同じです。)

ちなみにですが、「レコードセット」の形になっていると、Excelの「Range.CopyFromRecordset メソッド 」にて、ループすることなく、その内容を、「一発で」、「ばんっ!!」と、シートに貼り付けできます。
これも便利に使えることがあります。

For Each文も使えます。

なお、文字列型のセルに付いてしまう「'」は、操作先の相手ファイルが閉じられていて、かつ、最初の行に削除フラグを立てたダミーレコードというか、初期値で埋めたレコードを作っておくと、付かないっぽいです。
開いた状態で書き込むと、付いちゃうみたいです。(ご自分でもご検証ください。)

※このメリット・デメリットには全部、03と04のメリット・デメリットも加わります。
また、これ以降、05~08までは同じメリット・デメリットです。

DAO単独では、Accessだとリレーションの「システムとしての固定の設定」ができるのですが、Excelではできないっぽいです。(A表とB表にリレーションを固定して、いつでもその状態で操作できる、みたいなこと。)

あと、DAOだけのメリットとして、「閉じたファイルの空白のシート」に、リスト形式の表を自動で作表もできます。
  
  
★ 06(同上):DAO+SQL
前項のループに加え、SQLが使えます。SQLで読み書きできます。(UPDATE、INSERTなど)
前述のとおり、削除はできませんが・・・。

でも、同じく前述の通り、閉じたファイルの各シート間でのリレーションも組めますし、メリットは大きいです。

あと、SQL文を実行した結果を「レコードセット」にできます。

そして「レコードセット」は1つのプログラムの中にいくつでも作れます。
1枚のベースとなる表から、さらに、一定の条件で抽出した表を、何枚も「レコードセット」として作れる、ということになります。

そのため、この場合も、「表に対して、クラスモジュールで自作オブジェクトを作る」という処理はかなり減ると思います。後述のADOの場合も同じです。

また、SQLが使えるために、ループをしなくても、数百行、数千行のレコード(=行)の一括書き換えが可能です。

条件設定も柔軟で、コードの可読性も良くなると思います。
完全にセルベースでもループばっかりでもないため。
でもループももちろん使えます。
もちろん、DAOの持つ「オブジェクト、コレクション、メソッド、プロパティ」も使えます。

あと、DAOだけのメリットとして、「閉じたファイルの空白のシート」に、リスト形式の表を自動作表もできます。

  
  
★ 07(同上):ADO単独
おおまかには 「DAO単独」の場合と同じです。

あと、ADOではDAOのように「閉じたファイルの空白のシート」に、リスト形式の表を自動作表ができないかもしれませんが、「ADOX」を使うともしかしたらできるかもです。(未チェックです。すみません。)
  
  
★ 08(同上):ADO+SQL
おおまかには 「DAO+SQL」の場合と同じです。

こちらも、「閉じたファイルの空白のシート」に、リスト形式の表を自動作表ができないかもしれませんが、ADOXを使うともしかしたらできるかもです。(未チェックです。すみません。)