ExcelVBA ~ Variant型の変数を用意して、その配列機能を使ってセルの値を高速転記する方法
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  

たとえばですが、

『 「A1:B3」のセル範囲の値を、「F1」セルの位置に転記したい。
   (=「F1」セルを起点として、転記したい。)』

という要望があったとき、これを簡単に「転記」するには、
「Variant型の変数はLetを使ってセル範囲を代入すると、(内部的に)自動的に配列に変化する機能?性質?を持つ」、
という、そのことを使います。

この場合、Range.Copyメソッドを使うよりも、「はるかに高速に」転記できます。
場合によっては100倍以上、高速に動作します。
なので、ExcelVBAではよく使われます。
(基本、遅いから。)

一番シンプルな転記例としては、基本的には以下のようなプログラムになります。

  
Range.Rangeプロパティを使うと、
起点となる1つのセルを「A1セルとみなした」、そういうかたちのセル範囲の指定ができます。

ポイントは、「.Value」プロパティをしっかり書く、ということと、
転記先のセル範囲について、「その列数と行数を、転記元のそれと一致させる」、
つまり、「転記元と転記先のセル範囲の大きさを一致させる」ということです。
それにより、コードがわかりやすくなります。
(特に初心者にとっては。)

さらに、「Let」や「ActiveSheet」をちゃんと書くと、
初心者や独学者にとってはさらに、わかりやすくなります。
  

ちなみに上記の例だと、その転記先は
「ActiveSheet.Range("F1").Range("A1:A3")」、
というコードが表しています。

これは・・・、

『「F1」セルを起点として、
 「F1セルをA1と見立てた」、そういう「"A1:A3"」分の広さの範囲』、

・・・という意味になります。

そういう広さの範囲に転記する・・・ということになります。

最初に「ary」という変数に代入したセル範囲の値たちは、
もちろん「普通にA1セルが起点」の「A1:A3」というセル範囲の値たちでしたから、
起点となるセルが「F1」と異なりはするものの、
転記元と転記先のセル範囲の大きさは、
『 同じ「A1:A3」分の大きさ 』ということで、
これで、「合致している」、とわかりますよね?

(※「起点となるセルは異なるものの、タテとヨコのサイズは同じ」、とわかりますよね?まわりくどくてすみません!)

最初は、まず、これが理解できればOKです。
  
  

で、これを、転記先のセル範囲の指定だけを少し汎用化すると、以下のようになります。
つまり、「転記先のセル範囲をいちいち書き変えなくて済む」ようになります。

  
この例では、
Range.Rangeプロパティを使うのをやめて、
Range.Resizeプロパティを使っています。

Range.Resizeプロパティは、
Range.Resize(行数, 列数)という風に、可変的に数値指定ができますので。

また、Range.Resizeプロパティも、Range.Rangeプロパティと同様に、
「ある1つのセルを起点として使う」ということをしています。

たとえば、
「ActiveSheet.Range("F1").Resize(UBound(ary, 1), UBound(ary, 2))」
ということだと、
「ActiveSheet.Range("F1").」が起点となるセルのことで、
「Resize(UBound(ary, 1), UBound(ary, 2))」が、それを起点とした(行数, 列数)、
という意味になります。

「UBound(ary, 1)」で行数指定をし、
「UBound(ary, 2)」で列数指定をしています。

もう少し詳しく書くと(これで意味がわからなくなったらごめんなさい!)、
Variant型の変数の「ary」の中には、
「A1:A3」というセル範囲の値が、
「タテヨコを維持したままで」入っていますので、
これは、行は3行、列は1列、を意味しています。

さらに、
「UBound(ary, ××)」の「××」は、「次元」を表しています。
例えばタテヨコのある表なら、
「1」が縦方向の数値(1次元目、という意味)で、
「2」が横方向の数値(2次元目、という意味)を表します。

で、今回の例の場合、
「ary」は「A1:A3というセル範囲の値と同等」ですから、

「UBound(ary, 1)」は、
「A1:A3というセル範囲の値」の1次元目=縦方向=行数=3という数値(行)、

「UBound(ary, 2)」は、
「A1:A3というセル範囲の値」の2次元目=横方向=列数=1という数値(列)、

という意味になります。
  

結果、
「ActiveSheet.Range("F1").Resize(UBound(ary, 1), UBound(ary, 2))」は、
「ActiveSheet.Range("F1").Resize(3, 1)」と解釈し直され、
『 アクティブシートの「F1」セルを起点とした「3行×1列」のセル範囲 』、
という意味になります。

そこへ「転記する」、わけです。

なお、
タテヨコのある表の場合、常に、
縦方向が1次元目、
横方向が2次元目、
ですから、
「UBound(ary, ××)」は、
「UBound(ary, 1)」と「UBound(ary, 2)」だけを使うことになり、
ここの数字の変更は不要です。
逆に変更したらいけません。

転記「元」のデータが、
1列であっても、逆に2列以上であっても、このままでOK、だし、
1行であっても、逆に2行以上であっても、このままでOK、
ということです。

3Dの「立体的」なデータの集まりだと、「UBound(ary, 3)」が必要になってきますが、Excelの表では常に2Dですからそれはありません。
串刺し集計の場合は3D的にはみえますが、
でも、複数ある表の1つ1つは2次元ですから、
「UBound(ary, 1)」と「UBound(ary, 2)」までです。

  

というわけで、

「ActiveSheet.Range("F1").Resize(UBound(ary, 1), UBound(ary, 2))」

のF1を除いた部分、つまり

「ActiveSheet.Range("××").Resize(UBound(××××, 1), UBound(××××, 2))」は、

常に一定の、決まりきった、「定型の構文」です。

  

以下のような意味の「定型の構文」となります。

「ActiveSheet.Range("起点のセル").Resize(UBound(配列データ, 1), UBound(配列データ, 2))」

  

繰り返しになりますが、
Excelの表を配列として扱う場合、
セル範囲をVariant型の変数に代入した場合の「配列データ」は、
「タテヨコ表=2次元表」を意味します。

1列しかなかったとしても「タテヨコ表=2次元表」の1列分、
という理解になり、

1行しかなかったとしても「タテヨコ表=2次元表」の1行分、
という理解になります。
  

なお、もし同じシート上への転記でなく、別のシートに転記したければ

Let ActiveSheet.Range("F1").

の部分を、

Let Worksheets.Item("別のシート名").Range("好きな起点のセル").

と書き直せばOKです。

LetとItemは省略を認められてしますので、

Worksheets("別1のシート名").Range("好きな起点のセル").

と書いてもOKです。

  

ただ、Excelに限らず、VBAの「省略可能」という「クソ仕様」は、
「初心者を間違いに陥れる」「諸悪の根源」なので、本当は省略しないほうがいいです。

  

また、
「Range(×××)」というセル範囲指定の部分は、
もちろん、
「Cells(×××)」という形のセル範囲指定に書き変えてもOKです。
  

  
ところで、一番最初のコードを、もうひとつ「別の形」、つまり、
「配列を使わない方法」でも、少し汎用的にできます。

例えば以降のサンプルのようになります。
(セルをクリアする機能等々を追加しましたので長いですが。)

結果として(配列利用の2つめのケースとは逆に)、
「Range.Resizeプロパティ」は使わずに、
「Range.Rangeプロパティ」を使います。
最初のサンプルと同じように。

  

★2つめと、3つめ、のコード、どちらの汎用化がいいのか?

状況次第だと思います。
自分にはよくわかりません。

転記元のデータが「セル範囲で」、
そのセル範囲のタテヨコサイズを、「まんまで」、
転記先に転記する場合は、どちらでもいいと思います。

複雑になるとか、さらに「より汎用化したい」、ということなら、
2つめの「配列」を使った方法が良いのかもしれません。

たとえば、

・「最初から配列でしかなかった変数の値」をシートに表示したいとき(=転記元が単なる変数であって、シートのデータじゃないときなど。例えばADOやDAOのレコードセットの値をシートに表示したいとき)

とか、

・WorksheetFunction.Transposeメソッドなどを使って、タテヨコを逆転させたいとき、

などは、

「転記元」と同じタテヨコサイズを「まんまで」転記先のタテヨコには利用できないので、配列を使った方法しか無理だとは思います。
  

なお、
「転記先の指定に配列を使うか使わないか」は変わってきますが、
「Range.Resizeプロパティ」や、
「Range.Rangeプロパティ」の、
いずれかを使う、
あるいは、
何も使わずに普通にA1起点の転記先とする、
というのは同じだと思います。

もちろん、転記先に、RangeでもCellsでもどちらも使っていいのも同じだと思います。