• 締切済み

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/7940)
回答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

  • 【VBA】配列の部分コピー

    VBAにて、配列の範囲を指定して別の配列にコピーしたいと思っています。 現在は以下のようにFor文を使用して1つ1つ代入しているのですが、 もっと効率の良い方法はありますか? 処理速度を重視しています。 Dim srcArray As Variant: srcArray = Range("A1:A100") ' コピー元の配列 Dim dstArray As Variant ' コピー先の配列 Dim startIndex As Integer ' コピーする範囲の開始インデックス Dim endIndex As Integer ' コピーする範囲の終了インデックス startIndex = 6 endIndex = 16 ReDim dstArray(endIndex - startIndex) For si = startIndex To endIndex   dstArray(si - startIndex) = srcArray(si, 1) Next si

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • VBAで配列内のマッチ

    VBAでfor文などループを使わないで配列の文字列とマッチするかの判定を行いたいのですが、良い方法はありますか? Dim vrnArray As Variant vrnArray = Array("A", "B", "C", "D", "E", "F", "G") で ret = match???? (vrnArray, "C") retは真 のようなことがしたいです。

  • Excel 2010 VBAで教えてください。

    Excel 2010 VBAで教えてください。 Doubleの配列 Dim A(100) as double に ワークシート "Sheet1" セル A1:A100 の値を一発(For loop等を利用しない) で読み込むにはどうすればよいのでしょうか。 同じく、 Doubleの配列 A(100)を ワークシート "Sheet2" セル B1:B100 に一発で書き出すのはどうすればよいのでしょうか。  Variantにて Dim A as Variant では  A = Sheets("Sheet1").Range("A1:A100") で 読み込めました。 また Sheets("Sheet2").Range("B1:B100")で書き込みできましたが、double等でどうすれば良いのか知りたいです。

  • excel vba 配列の一部 一気に書き出し

    Excel VBAの配列の一部分をワークシートのセルに一気に書き出す方法を教えてください。 Dim A(12000,100) as double があります。 この中の A(1 ~ 12000 , 10) を ワークシートの cells(11,3) へ一気に縦方向に書き出したいのですが(B11から縦方向)、やり方を教えていただけないでしょうか。 cellsとしているのは、あとで 11,3 などを変数で指定したいためです。 doubleでダメな場合は、variantでもOKです。 よろしくお願いします。

  • VBAの配列

    VBAの配列の処理でこまっています。 dim test as Variant test = Array( _ Array("Aさん", 65, 70, 45), _ Array("Bさん", 80, 10, 90)) とした成績データがありまして、あとから(定義の段階でなく)、"Cさん", 70, 70, 75をtest変数に追加したい場合、どのようにすればよいのでしょうか? また、これ(test)を戻り値にした場合、正しく左辺値にはいるのでしょうか?オブジェクトの解放などの問題も知りたいです。 function seiseki () as variant ... 上の処理 seiseki = test end function ...  dim cp as Variant cp = seiseki() 'cp変数にコピーされるのでしょうか?

  • Excel VBA配列をFunctionに渡す

    こんばんは、引数について教えてください。 Excel VBAの関数を作っていましたが、 1.Function ColumnArrayの部分でコンパイルエラーが発生し、  「配列がありません」と表示されます。  引数を配列のみで渡した場合、問題なく渡せるようですが、  他の引数と、CriteriaArrsの配列と一緒に渡せないのでしょうか。  すべて配列として1つにまとめて渡さなければならないのでしょうか。 2.CriteriaArrs = Array("田中", "鈴木")の部分は、文字列の増減が発生しますので  配列はParamArray  CriteriaArrs()とした方がよいのでしょうか 説明が不足している点があるかもしれませんが宜しくお願いいたします。 Function ColumnArray(SheetName As Worksheet, _ StartCell As Range, _ FieldColumn As Long, _ CountColumn As Long, _ CriteriaArrs As Variant _ ) As Long ・・・ End Function ------------------------------------- sub test() Dim CriteriaArrs() As Variant Dim SheetA As WorkSheet DIm RangeA range CriteriaArrs = Array("田中", "鈴木") set SheetA =Worksheet(1) set RangeA=Range("B3") FilterCount = ColumnArray(SheetA, RangeA, 3, 2, CriteriaArrs) end sub

  • VBAの配列について

    VBAの配列について質問があります。 以下のような配列Aと配列Bがあったとします。 やりたいことは、配列Cを作成して、配列Aと配列Bを結合したいです。 ----------------------------------------- Dim 配列A(3) 配列A(0) = 10 配列A(1) = 11 配列A(2) = 12 Dim 配列B(3) 配列B(0) = 100 配列B(1) = 110 配列B(2) = 120 ---------------------------------------- Dim 配列C(6) 配列A(0) = 10 配列A(1) = 11 配列A(2) = 12 配列A(3) = 100 配列A(4) = 110 配列A(5) = 120 ---------------------------------------- 配列Cを作るために、配列Aを拡張して、配列Bを挿入すれば可能 でありますが、関数のようなもので簡単に表現できないもので しょうか? 何かご存知でしたが、ご教授願います。

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • エクセル cellから配列への取り込み

    お世話になります。 環境は、WindowsXpSp3、VB6sp6、MS-excel2003です。 処理内容は「エクセルのセル情報を元に条件判定を行い、結果を出力する」ものです。 現状、cellsオブジェクトの値と色からAND判定を行っています。 cells(r,c).value cells(r,c).Interior.ColorIndex 色々と調べたところ、配列にすると「劇的に速くなる」ということがわかりました。 想像してみて「確かに」と思い、試してみたところ、range().valueとvariant配列で試したところ約30倍の速度になりました。 (この時はvalueのみで試しました。) 「色情報もインデックスだから・・・」と思い、合わせて試してみました。 しかし、セルの色情報となると、これを配列にすることができません。 エクセルの仕様上どうにもならないものなのでしょうか。 もし「裏技」的なものがあればお願いします。 欲しい情報はcellのvalueとColorIndexが対応した配列です。 ソースは関連する部分だけ書きました。 -------------------------------------- Dim varValueRange As Variant Dim varColorRange As Variant varValueRange = Range(Cells(1, 1), Cells(10000,1)).Value varColorRange = Range(Cells(1,1),Cells(10000,1)).Interior.ColorIndex -------------------------------------- varValueRangeの方は問題なく配列になります。 varColorRangeがNullになってしまい、配列になりません。

専門家に質問してみよう