• ベストアンサー

VBAで、配列のデータをセルに書き戻す方法について

1000行200列の配列があり、配列の5列目と6列目のデータを、セルの10列目と11列目にすばやく書き戻す方法を教えてください。 (方法1) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) FOR 行番号= 1 TO 1000 CELLS(行番号,10).VALUE = DATA(行番号,5) CELLS(行番号,11).VALUE = DATA(行番号,6) NEXT (方法2) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) Dim WORK1() As Long ReDim WORK1(1 To 1000, 1 To 1) Dim WORK2() As Long ReDim WORK2(1 To 1000, 1 To 1) FOR 行番号= 1 TO 1000 WORK1(行番号,1) = DATA(行番号,5) WORK2(行番号,1) = DATA(行番号,6) NEXT RANGE("J1:J1000").VALUE = WORK1() RANGE("K1:K1000").VALUE = WORK2() (方法1)より(方法2)の方が早いのですが、WORKに貯めるのもめんどうなので、 RANGE("J1:K1000").VALUE = DATA(1,5), DATA(2,5), DATA(3,5),~,DATA(999,6),DATA(1000,6)のようなことができればと思います。 よろしくお願いします。

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

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

こんにちは、KenKen_SP です。 >WORKに貯めるのもめんどうなので、 テンポラリー配列を用意しなくても、ワークシート関数の INDEX を使えば 1行で済みます。 ご提示のコードで Long 型配列 DATA は Empty のまま転記されてますが、 これは何らかの処理の記載が省略されているだけですよね? 分かり易いように、A1:E1000 セルの値を配列化した場合のサンプルを記載 しておきます。 Sub Sample()   Dim Buf As Variant      ' (1) A1:E1000 セルのデータを配列化   Buf = Range("A1:E1000").Value   ' (1) で生成した配列において 3列目の全ての要素を取り出す   ' Worksheet Function の Index を使った例   ' 書式:Index(配列, RowIndex, ColumnIndex)   ' 1列全てを取り出す場合は、RowIndex を 0 にする   ' 次の例では、C1:C1000 の内容が G1:G1000 に転記される   Range("G1:G1000").Value = Application.Index(Buf, 0, 3) End Sub

QAZ123
質問者

お礼

教えていただいたINDEX命令により、目的が達成できました。 これで、テンポラリー配列を用意する手間が省けました。 ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >RANGE("J1:K1000").VALUE = DATA(1,5), DATA(2,5), DATA(3,5),~,DATA(999,6),DATA(1000,6)のようなことができればと思います。 Ar を二次元配列の変数として、以下のようにすれば出来るけれども、 U = UBound(Ar, 2) Worksheets("Sheet2").Range("A1").Resize(, U).Value = WorksheetFunction.Index(Ar, 5, 0) >方法1)より(方法2)の方が早いのですが ということ自体にも、一体、どれほどの問題があるのか私には分かりません。 私個人は、上記のような、キワモノのコードはめったに書きません。しょせん、ワークシート上の問題は、ワークシート内で片付けるのが一番で、この場合は、Range オブジェクト変数に格納するほうが分かりやすいです。 それ以上の実験的な問題は、ここのような何でもありのQ&A掲示板ではなく、専門掲示板でお聞きになったほうがよいのではないか、と思います。例えば、レーシングカーのようにチューンしたものと、一般道を走る車とでは、その求める度合いが違います。 >すばやく書き戻す方法 >WORKに貯めるのもめんどうなので、 半年間のご質問を見させていただいて感じましたが、そういうことは、一通りすべてがこなせてからのほうがよいですね。また、基本の型や定石を覚えて、その上で発展していくのはよいのですが、最初から、定石外しをもくろみ、他力本願で、掲示板で応援を求めてしまうと、VBAは、単発のワザしか使えない人になってしまいます。 失礼かもしれませんが、そう感じました。

QAZ123
質問者

お礼

善意で質問に答えてくださる方に、大変失礼だとは思いますが、今回の場合はINDEXという命令語の存在を知りたかっただけなのですが、質問の方法に問題があるのでしょうか? VBAの定石を理解しているのかとたずねられると、当方は、当方に必要なVBAの知識しかないので、その知識にない部分をこのOKWAVEで質問しているだけで、実験的な問題や定石外しのために質問しているのではないのですが。 ともあれ、INDEX命令を教えていただき、ありがとうございました。 ひとつ、これからもよろしくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>WORKに貯めるのもめんどうなので、 配列で操作するのが一番高速で実行出来ます。 >RANGE("J1:K1000").VALUE = DATA(1,5), DATA(2,5), DATA(3,5),~,DATA(999,6),DATA(1000,6) 代入方法(=)としては意味を成していないので不可能です。 プログラムを短くすることは出来ますよ。 Dim WORK(1 to 1000,1 to 2) As Long FOR 行番号= 1 TO 1000 WORK(行番号,1) = DATA(行番号,5) WORK(行番号,2) = DATA(行番号,6) NEXT RANGE("J1:K1000").VALUE = WORK()

QAZ123
質問者

お礼

回答を付けていただき、ありがとうございました。 プログラムを短くすることができました。

関連するQ&A