ここから本文です

職場でマクロを作り少しずつ仕事に使ってます。 1万行×1万列のデータを配列に読み...

buc********さん

2017/5/518:08:14

職場でマクロを作り少しずつ仕事に使ってます。
1万行×1万列のデータを配列に読み込もうとしてます。

Sub QQ()
Dim Data(10000, 10000) As Long
For i = 1 To 10000
For j = 1 To 10000
Data(i, j) = Cells(i, j)
Next
Next
End Sub

いつまで経っても終わらないため、途中で無理やり止めました。しかし先輩が作ったマクロは数十秒です。マクロをちらっと見せてもらったら、セルを配列に読み込むところが違ってるようです。1,2行で終わってます。なぜ違うのでしょうか?

閲覧数:
84
回答数:
4
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

ina********さん

2017/5/519:28:56

コード例としてはこんな感じでしょうか。

Sub Sample()
Dim VV As Variant
VV = Range("A1").Resize(10000, 10000).Value
End Sub


>なぜ違うのでしょうか?

セルの読み書き(特に書き込み)は時間が掛かる処理の一つです。

多量のセルデータを扱う時は読み書きを範囲でまとめて一度に
行なうようにします。そうすれば相当スピードアップできます。

  • 質問者

    buc********さん

    2017/5/520:26:58

    出来ました。ありがとうございます。こうやっていたのですね。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

lin********さん

2017/5/521:02:44

42秒でした!

こんなサイトを見つけました。

http://officetanaka.net/excel/vba/speed/s11.htm

10000×10000のデータの作成に時間がかかりましたが(乱数の発生をさせてから、外出したので、どれだけかかったは、分かりませんが)、Windows10 Pro 64bit、CPU: i5、Memory: 8GB、Excel2016の環境で、試したところ、42秒でした。

Sub Sample()
t = Now()
Dim i, j As Long
Dim c As Variant
Dim d(10000, 10000) As Integer
c = Range("A1:NTP10000")
For i = 1 To 10000
For j = 1 To 10000
d(i, j) = c(i, j)
Next j
Next i
MsgBox (t & vbCrLf & Now())
End Sub

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

blu********さん

2017/5/519:44:44

こんにちは。

配列の勉強中ですか?

Dim Data(10000, 10000) As Long
ヒエ~(^_^;)

便利なバリアント型配列を覚えましょうか?
PCのフリーズが鬱陶しいので、A1:E200000
でやってみしょう。

20万行5列です!

Sub Sample1()
Dim Dt As Variant

Debug.Print "配列格納前:" & Time
Dt = Sheets("Sheet1").Range("A1:E200000")
Debug.Print "配列格納後:" & Time
Sheets("Sheet2").Range("A1:E200000") = Dt
Debug.Print "処理終了:" & Time
End Sub

ストレスなくすぐ終わると思います。
やっていることは、Sheet1のデータをSheet2に
そのまま移記しているので、何の意味も無いのですが^_^;

ただ、これを一セルずつやると、どうなるか・・・
結果は歴然としています。

配列を使うメリットは、一括で読込んで配列内で必要な処理
を終え、一括で書きだすということです。

Sheets("Sheets2").Cells(I, 1) = Sheets("Sheets1").Cells(I, 1)
なんてやってたら日が暮れます。
いや夜が明けます。
大量の計算式が設定されていたら、どうなるのでしょう?
一セル毎に書きだすと一々再計算イベントが発生し
データ量が多くなるほど極端にパフォーマンスが悪くなります。

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

で高速化するってか?

そういう問題ではありません。
こんなもの原則不要です。
本当に早いコードとは、そういうものだと考えています。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

tac********さん

2017/5/518:50:31

>Data(i, j) = Cells(i, j)

そもそも配列に入れる必要が有りますか?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる