ExcelVBA ~ ExcelVBA ~ 「ADO+SQL+CopyFromRecordset」と「Worksheet.Openメソッド+代入等々」のどちらが高速か?のテスト。(10行10列、10万行40列)
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
サンプルダウンロード
ダウンロードしたら、読み込み先データのサンプルの中のファイルを好きな場所に置き、プログラムをそのパス(あるいはファイル名)に書き変えて、実行、テストします。

  

基本的には(吸い込むセル範囲が数百行とかそれをほど大きくなければ)、
「ADO+SQL+CopyFromRecordset」を使うほうが、ファイルを開かないせいか、
圧倒的に速いです。
「Worksheet.Openメソッド+代入等々」を使うよりも。
(Openメソッドは非表示にしたとしても「ファイルを開いてしまう」のでその分、遅くなります。例えば100ファイルとか読み込みたい時は遅くなります。)

ただし、もちろん、Openメソッドのほうが都合がいいこともあると思います。
適材適所で。

※補足
なお、「ODBC+SQL+QueryTableオブジェクト」の場合は、10万件のテストでは、
「ADO+SQL+CopyFromRecordset」よりも、2秒ほど遅かったです。
QueryTableオブジェクトで受けるメリットが大きい場合は、
それくらいの遅さなら、「ODBC+SQL+QueryTableオブジェクト」を使うのが
いいかもです。

  
なお、「シートの部分的なセル範囲を吸い込みたい」という場合は、
いったん、「ADO+CopyFromRecordset」で表全体を吸い込んでおいてから、
吸い込んだデータから任意のセル範囲をRangeで指定して、
別のシートに転記するほうが速いかも?しれません。
(コピペだと遅いので、Variant型の変数にセル範囲の値を一括で代入して別シートに貼り付ける、などで。)

転記元(=ソース)のシートのレイアウトがグッチャグチャだったり、1シート内に表がいくつも含まれてしまっている、とか、クロス集計表やリスト表がごちゃ混ぜ、、、ような場合は、Worksheet.Openのほうが便利かもです。
事前に実験してみて、SQLでシート全体が読める場合なら、いったん「ADO+CopyFromRecordset」で表全体を吸い込んでおいてから、吸い込んだデータから任意のセル範囲をRange+Variant配列で転記、が高速かも?しれません。

  
★★★★ 比較結果 ★★★★
(読み込むデータが、10列10行の場合。10万件40列の場合はまた別。
 0万件40列の場合は「ADO+SQL+CopyFromRecordset」のほうが
 1~1.5秒ほど早かったです。
 つまり、「方法02WS_OPEN」が意外と頑張ってた。)

●「ADO+SQL+CopyFromRecordset」を使った場合。
1回目 0.48046875 秒
2回目 0.078125 秒
3回目以降 2回目と変わらず。高速なまま。

●「Worksheet.Openメソッド+代入等々」を使った場合。
1回目 0.6015625 秒
2回目 0.57421875 秒
3回目以降 2回目とほぼ変わらず。遅いまま。

※ノートPCにて、AC電源につないでない結果です。
 ですので、つなぐと、両者とも1回目がもう少し速くなります。
 ただし、「方法01ADO」の2回目の速さは、
 AC電源につないでもつながなくても同様に高速でした。

  

  
●相手のファイルを開くことなく、ADOでシートを吸い込むコード
(「ADO+SQL+CopyFromRecordset」)

基本、Worksheet.Openメソッドよりは高速。
(ただし、10万件以上とかになると、そのときそのときで違うかも。
 速いには速いけど、差が縮まる、とか。)

●相手のファイルを開き、Worksheet.Openメソッドでシートを吸い込むコード
(どちらかというと遅い)
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13300509618