• 締切済み

VBAで配列のある部分だけをを配列に入れたい

VBAを勉強をしております。 例えばA1からG20までをある配列に入れているとします。 その配列のある部分(例えばB1からC20)を、別の配列にいれるにはどうすれば良いのでしょうか。 以下の方法で試してみましたが、上手くいきません。 Dim A() As Variant Dim B() As Variant A = Range("A1:G20") B = Range(Cells(A(1,2),Cells(A(20,3)))

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

配列変数の意味が、まだよく分かっておられないようですね。 まず、配列変数についてですが、配列変数はメモリにデータが格納されるのですから、「B = Range(Cells(A(1,2),Cells(A(20,3)))」というのはおかしいです。 メモリ上のデータを扱うのであって、エクセル上の実際のセルを指定してはいけません。 例えば、この場合でしたら、Dimで直接配列変数の大きさを指定していませんが、結果として、「Dim A(20, 7)」という配列変数が作られています。 もちろん、この「20」は行、「7」は列の数です。 従って、「Range("G21").Value = A(20, 7)」とやると、「G21」セルに「G20」の値が書き込まれます。 分かりますか? 最初に「A = Range("A1:G20")」とやりましたね。 ですから、セル「A1」の値が配列変数の「A(1, 1)」に入り、セル「A2」の値が配列変数「A(2, 1)」の中に・・・、セル「G20」の値が配列変数「A(20, 7)」の中に入ったのです。 これは、メモリの中の話で、配列変数「A()」は、セルの処理とは無関係です。 従って、配列変数「B」にセル「B1」から「C20」の内容を読み込ませたいなら、「A」のときと同じように、「B = Range("B1:C20")」とするべきですし、配列変数の値をコピーしたいのなら、配列変数「A」の「B1」にあたる場所は、「A(1, 2)」、「C20」にあたる場所は、「A(20, 3)」ですから、ひとつひとつコピーするなら セル「B」列の処理 B(1, 1) = A(1, 2) B(2, 1) = A(2, 1) B(3, 1) = A(3, 2)    | セル「C」列の処理 B(1, 2) = A(1, 3) B(2, 2) = A(2, 3) B(3, 2) = A(3, 3)    | となります。 「B」列の場合ですが、「A(x, 2)」となっていますね。 この「2」が「B」列です。 もちろん、「C」列の場合の「A(x, 3)」の「3」が「C」列を表しています。 というか、読み込んだ場所です。 もちろん、プログラムなのですから、 手作業でひとつずつやるのではなく、 For i = 1 to 2 For j = 1 to 20 B(j, i) = A(j, i + 1) Next J Next i などとやって、配列「A」の値を配列「B」にコピーします。 ちょっと、ややこしい説明になってしまいましたが、分からない所があれば、また説明します。 注意事項として、直接セルの値を読み込ませる場合は、「Dim B() As Variant」ですが、下の場合の処理では、最初に「Dim B(20, 2) Variant」と配列の大きさを直接指定しておかなければなりません。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

だいぶ無理矢理ですが。 sub macro1()  dim a as variant  dim b as variant  a = range("A1:G20").value  b = application.index(a, evaluate("row(1:20)"), array(2, 3))  range("I1:J20").value = b end sub

関連するQ&A