• ベストアンサー

VBAにて、配列のデータを一度にシート上に貼り付ける方法

シートにデータを貼り付けるための高速化を検討しています。 現在、VBからエクセルの指定セルに直接データを書いていますが、遅くてしかたありません。  (こんな感じです ⇒ Cell(○、□) = データ) 一応、表示更新は、止めています。(ScreenUpdatingプロパティを使っています。) 配列のデータを一度に、あるシート上に貼り付けたいのですが、ループ処理で回すしか方法がありませんか? すいませんが、宜しくお願いします。

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

  • ベストアンサー
  • ebis
  • ベストアンサー率27% (17/61)
回答No.2

3個だけの配列のサンプルですが、どうでしょう 縦に貼り付け Sub test() Dim a(2, 0) As Variant a(0, 0) = "aaa" a(1, 0) = "bbb" a(2, 0) = "ccc" Range("A1:A3").Value = a End Sub 一応横の貼り付けはこうなります。 Sub test2() Dim a(0, 2) As Variant a(0, 0) = "aaa" a(0, 1) = "bbb" a(0, 2) = "ccc" Range("A1:C1").Value = a End Sub 配列は2次元でないと、うまくいきません。

0333
質問者

お礼

早速の回答ありがとうございました。 テストしたところ、画期的に早くなりました。 1次元では、テストしたのですが、同じ値が貼り付けられるので、無理かと思っていましたが... 2次元にして行います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#4564
noname#4564
回答No.1

  > 現在、VBからエクセルの指定セルに直接データを書いていますが、遅くてしかたありません。 >  (こんな感じです ⇒ Cell(○、□) = データ) (1) データベースの処理なら、CopyFromRecordsetメソッドを検討しましょう。(注 1) (2) データベースの処理なら、DAO/ADO + Jet経由で出力できないか、検討しましょう。 (3) レコードセットではない配列なら、Rangeを指定して一括出力できないか検討しましょう。(注 2) (注 1) Excel 97以前では、DAOのレコードセットしか処理できません。     (2000以降は、DAO/ADOのどちらも可)     Excel 95 ではExcelプロセス外のレコードセットを処理できません。 (注 2) 座標のタテヨコ(X,Y)が逆転しないよう注意してください。     (縦横変換が必要な場合、性能上のボトルネックになります)  

0333
質問者

お礼

早速の回答ありがとうございました。 データベースの処理では、ありませんので、Range側で行います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBで配列の差分を取りたいのですが

    VB2005を使用しています。 エクセルに2つのシートには更新前と更新後のデータがあって、 それの差分を取るために一度2次元配列に確保してから処理を行い たいのですが、配列を入れ子にして順にループ、比較させると時間がかかりすぎてしまいます。 どうしたらよいのでしょうか?

  • 選択範囲のデータを配列に一発で取り込みたい

    Office2003を使用しています。 エクセルVBAでセルの選択範囲のデータを一発で配列変数に取り込みたいのですが、そんなこと可能でしょうか? ループ回して取り込むことはできるのですが、 膨大なデータ量ですので高速化したいと思いまして。。 すみませんが、よろしくお願いします。

  • VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。

    マクロを含むエクセル(EXCEL2000)をHTMLのページからハイパーリンクで呼び出しています。そのエクセルでボタン操作に従い罫線やセルの着色を行っています。しかし、着色結果が更新されません。スクロールバー等で画面を移動すると正しく着色されています。このエクセルを通常に起動した場合は、問題なく動作するのですが、シート全体を更新する方法を教えて下さい。 各関数では、以下のスクリーンアップデータの処理を入れています。 Application.ScreenUpdating = False     (処理) Application.ScreenUpdating = False

  • VBAでの100万行以上のデータの取り込み

    どなたかご教示お願いいたします。 VBAで100万行以上のCSVデータの取り込みは可能でしょうか? 初心者なのでファイルを開いてセルに入れてから範囲を指定し配列に 取り込み処理しておりましたが100万行以上だとデータがシートから出てしまいます。 なのでエクセルに展開せずに配列に取り込むなどということはできるのでしょうか? もし可能であればあつかましいのですが、A列の120万行データを配列に取り込むサンプルをご教示いただけるとありがたいのですが・・・ よろしくお願いいたします。

  • VBA高速化にはセルにアクセスせず配列を使え?

    VBAを高速化するにはセルにアクセスせず配列を使えといいますが、 シート中に沢山の計算式が複雑に絡み合っている(沢山のセルを参照した計算式が多数ある)ものを扱う場合には、セルに入っている値を変更しなくては、なにも始まらないです。シート自体を2次元配列のような仮想シートみたいなものにごっそり入れて、まるで本当のシートのように、セル中に格納された計算式も機能し、かつ高速処理になる方法ってあるのでしょうか?

  • VBA 配列とワークシートどっちがいい?

    数値計算するマクロを作っていて思うことがあり質問しました。 ワークシートに3万セルのデータがあり、それを元に計算し、結果を別シートに記入します。 (1)計算をすべてワークシート上で行う方法 (2)データを全て配列に読み込み、配列上で計算し、結果のみ配列に書き出す方法 どちらがいいの? 考えや情報が色々と頭の中でぐるぐる回ってます。 ・せっかくの「表計算」ソフトなのだから当然(1)? ・シート上の方が色々な関数を使える ・配列上の方が計算速いと聞く ・3万セルごときどちらも同じ? ・10万セルの配列読み込み11秒(For Next)2秒(Range型変数使用)の書籍記事 ・100万セルの配列読み込みコンマ数秒(For Next)コンマゼロ数秒(Range型)のweb上記事 今まで私自身が体感したのは、例え3万個といえど ・行削除が多いと遅い ・コピペが多いと遅い(5千回で10秒) ・ファイル数が多いと遅い(open/close1個1秒弱) ・シート上だと関数はやっぱり豊富 ・セルへのアクセスは不明?? どっちがいいですか?100万セルでも同じですか? どっちでやってますか?

  • VBAで2シートあるデータを一度に印刷する方法

    エクセルのシート1とシート2にそれぞれシート3からデータをVLOOKで引き込むように設定をしてあります。 印刷する際に、一括印刷や指定したものだけを印刷するボタンを作成してあるのですが、そこに『シート1のみ印刷・シート2のみ印刷、シート1と2両方印刷』が選択できるようなVBAを追加することは可能でしょうか?? シート1と2はまったく違うデータを引き込んでいます。 VBAは初心者です。 よろしくお願いします。

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • 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シートに分けてコピーしようとしています。 よろしくお願いします。

  • 配列入れ替えの効率的方法は

    VBでグローバル変数配列を3000とっています。 格納されているデータを、1つづつずらして代入し直しをやりたいのですが 配列添え字1のデータを配列添え字0にというふうに3000回のループで 処理する以外に良い方法はないでしょうか 例 for i=0 to 2999 a[i]=a[i+1]