• 締切済み

EXCEL VBA 配列データの部分コピー

EXCEL VBAで配列データの一部分のみ、シートへコピーする方法を教えて下さい。 なるべく処理時間が短い方法がいいです。 (例) Dim varTable() as variant varTable(0,0)="AAA" varTable(0,1)="BBB" varTable(1,0)="CCC" varTable(1,1)="DDD" varTable(0,0)とvarTable(0,1)だけをEXCELのシートへコピーする。 実際には、7データ×400レコードの配列のうち、100レコードずつを4シートに分けてコピーしようとしています。 よろしくお願いします。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> Index()では、データ数の制限等があるのでしょうか。 Excel2000 以前では Index 関数は要素数が 5461 個までの配列にしか 使えません。Excel2002 以降ではこの制限が改善されてますが。  # こういうこともあるのでバージョンは明記して下さい Excel2000 をお使いなら、For ループで回して下さい。シートへの出力 に配列が使える場合なら、20データ×10000 程度でも瞬時です。 Sub Sample()   Dim buf(1 To 10000, 1 To 20) As Variant   Dim i  As Long   Dim j  As Long      ' // 2次元配列サンプルデータを作成   For i = 1 To 10000     For j = 1 To 20       buf(i, j) = "R" & CStr(i) & "C" & CStr(j)     Next j   Next i   MsgBox "サンプルデータをセット。配列から5400,6000,8000番目の" & _       "レコードを取り出します"   ' // 配列から5400、6000、8000レコード目を取り出す   ' // 取り出すデータ数は既知なのだから、いちいち Preserve   ' // しないで、配列要素数を決め打ちした配列にコピーしていく   Dim cnt As Long   Dim v   Dim ret(1 To 3, 1 To 20) ' // 3レコード*20フィールド      cnt = 1   For Each v In Array(5400, 6000, 8000)     For i = 1 To 20       ret(cnt, i) = buf(v, i)     Next     cnt = cnt + 1   Next      ' // セル出力   Range("A1").Resize(3, 20).Value = ret End Sub または、自由自在に配列からデータを取り出したいなら、ADO などでデータ ベースに接続し、sql を使う方法も検討して下さい。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

補足。 #1 は横(列方向)にセルに書き込みました。縦方向なら、 Range("A1").Resize(UBound(varReturn)).Value = _ Application.Transpose(varReturn) です。というわけで、TRANSPOSE も押さえて下さい。

yuki_j
質問者

お礼

ご回答ありがとうございます。 Application.Index()を使用し、部分コピーをすることが出来るようになりました。 しかし、配列のデータ数を増やすと  varReturn=Application.Index(varTable,1) の部分で、『型が一致しません。』とエラーが発生することがわかりました。 具体的には、7データ×400レコードでは問題ないのですが、20データ×1000レコードに増やすとエラー発生します。 配列データの違いとしては数が多くなっただけで、データ型等は同じです。 Index()では、データ数の制限等があるのでしょうか。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんばんは。 ワークシート関数の INDEX を使うとか。 Sub SampleProc()      Dim varTable(1, 1) As Variant   Dim varReturn   As Variant      varTable(0, 0) = "AAA"   varTable(0, 1) = "BBB"   varTable(1, 0) = "CCC"   varTable(1, 1) = "DDD"      varReturn = Application.Index(varTable, 1)   Range("A1").Resize(, UBound(varReturn)).Value = varReturn End Sub INDEX に与えるパラメータによってワークシートで言うところの行、列 どのようにも切り分けられます。 でも、7×400 程度の配列なら For ループで回しても瞬時だと思いますよ。 あとは、Application.Transpose なんかも押さえておくと良いでしょう。

関連する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

  • エクセルVBA 配列の書き方とセルへの一括表示方法

    エクセルのVBAで 下記のようなプログラムを作成しています。 1行目はタイトル行で E列が空白になるまで、 各行のE列~H列の値を変数に入れて、 最後に一括で別の列・行にそれぞれの値を表示・書込したいと思ってますが、 どうもVBAは初めてでよくわかりません。 Dim aaa As String Dim bbb As String Dim ccc As String Dim eee As Double intRow = 2 Do Until Cells(intRow, 5).Value = "" aaa = Cells(intRow, 5).Value) bbb = Cells(intRow, 6).Value) ccc = Cells(intRow, 7).Value) ddd = Cells(intRow, 8).Value) intRow = intRow + 1 Loop aaaの各変数を2行目のA1~intRowまで bbbの各変数を2行目のB1~intRowまで cccの各変数を2行目のC1~intRowまで dddの各変数を2行目のD1~intRowまで セルに一括して表示したいのです。 配列の書き方と、セルの範囲に表示・書込する方法を どうかご教示下さい。お願いいたします。

  • VBAの正規表現

    VBAで正規表現による置換をしたいです。 以下のような行が複数あります。 1 aaa bbb ccc ddd 2 aaa bbb ccc ddd 3 aaa bbb ccce ddd 4 aaa bbb eccc ddd ccc の部分のみ置換したいです。 dim hensuu as string dim replace as string replace = eee hensuu = ccc (省略) strPattern = "(\s*)" & hensuu & "(\s+)" rep = RegExpObj.Replace(buf, "\1" & replace & "\2") 行数1,2 のみを置換したのですが、4も置換されてしまいます。 (\s*) の "*" が良くないのは理解していますが、"+" にしてもうまくいきません。 どなたかどのようにしたら1,2のみ置換できるようになるかをご教授お願いできませんでしょうか よろしくお願いいたします。

  • 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)))

  • エクセルのマクロについて教えて下さい。

    エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、           A         B   C  D   E  F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、     A B  C  D   E   F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。

  • VBAでエクセルのいくつかの表を同じ配列に格納する

    VBA初心者です。 調べてみましたがどうにも情報に行きあたらなく、ご質問をさせていただきます。 添付のようなエクセル上の同一シート上にある3つの表をコピーし、VBAで同じ配列の各列として取り込みをしたいと考えております。 大分類、中分類、小分類のそれぞれの行は同じもののそれぞれの内容を記載しており、 できればこれらを同じ配列の1列目、2列目、3列目に格納をしたいと思っております。 これらの表が1つの表にまとまっていれば、 Dim 配列(1,10) as Variant 配列 =range("A1:C10") で事足りると思うのですが、別々のためこの方法がとれません。 セル指定で行うことも考えましたが、データが10万行を超える場合もあるため、できれば避けたいと思っています。 各表を指定し、配列の1列目、2列目、3列目に一括して代入をご存じでしたらら、どうぞ教えていただきたいと思います。 どうぞよろしくお願いします。

  • EXCELのVBAで空白列を削除して左づめにできますか?

    いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例)  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|   |BBB|CCC|DDD|EEE| 3|AAA|   |CCC|DDD|EEE| 4|AAA|   |CCC|   |EEE| 5|   |   |   |DDD|EEE|     ↓  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD|   |EEE| 3|AAA|CCC|DDD|   |EEE| 4|AAA|CCC|   |   |EEE| 5|DDD|   |   |   |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

  • エクセルについて

     複数のエクセルファイルの中に複数のシートがあります。それを1つのエクセルファイルにまとめるフリーソフトもしくはよい方法があれば教えていただきたいのですがよろしくお願いします。              こんな感じにしたいです。 1.xls sheet1 aaa sheet2 bbb 2.xls sheet1 ccc sheet2 ddd        ↓ 統合.xls   sheet1 aaa sheet2 bbb sheet3 ccc sheet4 ddd

  • データの列を15行毎に平均する

    エクセルで質問です 下記のように集計したいのですが、よいアドバイスをいただけないでしょうか 又はVBAでないと無理でしょうか あまり詳しくありませんのでよろしくお願いします。 <データ>       <集計>    1 aaa bbb ccc    1~15行の平均 2 bbb ccc ddd    16~30行の平均 3 ccc ddd eee     ・ 4 ・  ・  ・      ・ 5 ・  ・  ・      ・ ↓ ・  ・  ・      ・ 15 ・  ・  ・      ・ 16 ・  ・  ・      ・ ↓ ・  ・  ・      ・ 30 ・  ・  ・      ・

  • 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等でどうすれば良いのか知りたいです。

専門家に質問してみよう