• ベストアンサー

ExcelVBAで動的配列の部分取り出し

Variant型配列で Dim myZaiko Worksheet("bbb").Activate myZaiko=worksheet("bbb").range("A1:E100") とした時に 別のWorksheet("aaa")にA列とC~E列をそれぞれmyZaikoから取り出して貼り付けるということは可能なのでしょうか? ニュアンスとしては下のような感じなのですが指定の仕方がわかりません。 Worksheet("aaa").Activate Worksheet("aaa").range("A1:A100").value=myZaiko(A列だけ) Worksheet("aaa").range("C1:E100").value=myZaiko(C~E列) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

1個ずつ取り出すような気がします。 Dim myZaiko Dim i As Long Dim j As Long    myZaiko = Worksheets("bbb").Range("A1:E100").Value    For i = 1 To 5   For j = 1 To 10     MsgBox myZaiko(j, i)   Next j Next i 一例ですが、 Dim myZaiko を Dim myZaiko As Range myZaiko=worksheet("bbb").range("A1:E100") を Set myZaiko=worksheets("bbb").range("A1:E100") として Worksheet("aaa").range("A1:A100").Value=myZaiko を Worksheets("aaa").range("A1:A100").Value=myZaiko.Columns(1).Value と、いうようなやり方はだめでしょうか。

siranagi
質問者

お礼

後半部、これもNo.3の方と同じような感じですよね。 こっちの方が考えていたのにあってましたね。 お二方、感謝します。 動的配列の取りだし方、という点でこちらの方が優れてましたね。 ありがとうございました。

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

A1:E100の範囲のデータを I列にA列・K~M列にC~E列のデータを入れるとするなら Sub try() Dim r As Range Set r = Range("A1:E100") Range("I1:I100").Value = Intersect(r, Range("A:A")).Value Range("k1:M100").Value = Intersect(r, Range("C:E")).Value End Sub では意味無し?

siranagi
質問者

お礼

ありがとうございます。 たぶんこれがもっとも簡単なのでしょうね。 Intersectを初めて見ました。 まだ知識が足りてないと実感しました。 さらに精進します。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

Sub test() Dim myZaiko1, col1, myZaiko2, col2 Set myZaiko1 = Worksheets("bbb").Range("A1:F100") Set myZaiko2 = Worksheets("aaa").Range("A1:F100") 'myZaiko2.Value = myZaiko1.Value   そのままコピーするのならこれだけで済むが、列ごとにしたいというのであれば、以下。 Set col1 = myZaiko1.Columns Set col2 = myZaiko2.Columns For i = 1 To 6 col2(i).Value = col1(i).Value Next End Sub

siranagi
質問者

補足

きちんと書いてないのが悪いんですが、実行速度向上を狙ってましたので残念ながら意にそぐわなかったです。 ごめんなさい。

関連するQ&A

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

  • 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

  • ExcelVBAで配列に一気にデータを入れる

    かすかな記憶で申し訳ありませんが、変数をVariant型で宣言しておくと、","で区切られた文字列は、一気に配列として代入出来ると聞いた気がしています。色々と試してみたのですが、よくわかりません。よろしくお願いいたします。 Dim a as Variant dim myText as string myText = "月曜,火曜,水曜,木曜,金曜,土曜,日曜" のような感じで(実際のカンマで区切られた文字列は100個ぐらい要素があります)一気に代入して、aを配列として扱いたいのです。 よろしくお願いいたします。

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

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

  • エクセル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で配列?

    以下は、文字列"t", "e", "s", "t"を配列に取り込み、セルに表示する例ですが、 ar = Array("t", "e", "s", "t") なら作動しますが、セル範囲から取り込もうと、 ar = Range("A1:D1").Value とするとエラーになります。 どうしてでしょうか? Sub test() Dim ar As Variant Dim n As Integer ar = Array("t", "e", "s", "t") 'ar = Range("A1:D1").Value For n = LBound(ar) To UBound(ar) Cells(n + 1, 5) = ar(n) Next n End Sub

  • 配列をテキストファイルに書き込むことは不可能でしょうか?

    Sub Macro1() Dim No As Long No = FreeFile 文字列 = "1234" Open "D:\Test.txt" For Output As #No Print #No, 文字列 Close #No End Sub 上記のMacro1の文字列の書き込みは可能なのですが Sub Macro2() Dim No As Long Dim 配列 As Variant Range("a1").Value = "1☆2☆3☆4☆" No = FreeFile 配列 = Split(Range("A1").Value, "☆") Open "D:\Test.txt" For Output As #No Print #No, 配列 Close #No End Sub だと「Print #No, 配列」で「型が一致しません」とエラーになってしまいます。 テキストファイルに配列を書き込みたいのですがどうすればいいのでしょうか? よろしくお願い致します。

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

  • エクセル:セルの検索

    Sheet1のC~G列を検索し、 [AAA]が見つかれば「成功」、見つからなければ「失敗」と表示するコードを作りました。 (実際のコードでは、AAAが見つかったセルBBBの.Addressや.Valueを使いたいので「Set BBB」などという書き方をしています)   Dim AAA As String Dim BBB As Range Set BBB = Worksheets("Sheet1").Range("C:G").CurrentRegion.Find(What:=AAA, LookAt:=xlWhole) If BBB Is Nothing Then MsgBox "検索に失敗" Else MsgBox "検索に成功" End If このコードで、C~D列にAAAがある場合は見つかるのですが、 E~G列にAAAがある場合は見つからず「検索に失敗」とメッセージが出ます。 また、 別のシートでも全く同じコードを使っているのですが、こちらは正常に動作します。 上に挙げたコードと違うところは検索範囲がE~I列だというだけです。 上記コードでとあるシートにおいてのみE~G列にある値が検索に引っかからない理由として、 どのようなことが考えられるでしょうか。 保護はかかっていません。 値が微妙に違うということもありません。 大文字小文字、半角全角の指定はしておりませんが、 C列で検索に引っかかった値をそのままG列に移動しただけで見つからなくなります。 なお、AAAに入れているデータは、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub のTarget.Addressで、「$A$20」のような形で入っています。 Sheet1のC~G列に用意している値も「$A$20」のような形で直接書き込んでいます。

  • エクセル 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になってしまい、配列になりません。

専門家に質問してみよう