• ベストアンサー

EXCELでVBAをつかったコピーの高速化

EXCELのVBAで、A1からA1000まで乱数をセルに書き込むと8秒かかるのですが、これを高速化することが可能でしょうか? For 行番号 = 1 To 1000 Cells(行番号, 1).Value = Int((10 * Rnd) + 1) Next セルに書き込まずに、1000個の乱数を発生させると1秒もかからないので、8秒のうちのほとんどの時間は、セルへの書込み時間にとられています。 EXCELで列のコピーをした場合は、セルへの書込み時間が早いので、1000個の乱数の結果をいったんメモリに書き込み、列のコピーのように、セルにコピーができれば、高速化が可能かなと思うのですが、VBAでできるのでしょうか?よろしくお願いします。 For 行番号 = 1 To 1000 Int((10 * Rnd) + 1)をメモリに書込み Next メモリの内容をA1:A1000にコピー

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

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

こんにちは。 >1000個の乱数の結果をいったんメモリに書き込み、列のコピーのように、セルにコピーができれば、高速化が可能かなと思うのですが、 このようにするのかな? Sub RundomValues() Dim ar() As Integer Dim i As Integer ReDim ar(1 To 1000, 1 To 1)  Randomize '初期化 For i = 1 To 1000  ar(i, 1) = Int((10 * Rnd) + 1) Next  Range("A1:A1000").Value = ar() End Sub なお、1 ~10 までですから、関数で行っても問題ないとは思いますが、ワークシート関数の乱数 Rand は、バグがあるのと、多様には出ないので、乱数の数が少ないはずです。 http://support.microsoft.com/default.aspx?kbid=834520

QAZ123
質問者

お礼

配列全体を特定のセルにコピーすることができる方法を書いていただき、 助かりました。Range("A1:A1000").Value = ar() こういう事はなかなかHELPでは検索できずに悩んでいました。 いろいろ応用もできると思いますので、このやり方を利用しようと思います。 ありがとうございました。

その他の回答 (2)

  • jindon
  • ベストアンサー率43% (50/116)
回答No.2

ループは要りませんよ Sub test() With ActiveSheet.Range("a1:a1000") .Formula = "=int(rand()*(11-0)+0)" .Value = .Value End With End Sub

QAZ123
質問者

お礼

こういう方法もあるのですね。勉強になります。 回答ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

わたしのPCでは下記で1秒もかかりませんでした。 Sub test1() With Application .ScreenUpdating = False .Calculation = xlCalculationManual For 行番号 = 1 To 1000 Cells(行番号, 1).Value = Int((10 * Rnd) + 1) Next .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

QAZ123
質問者

お礼

本当ですね。今、自宅のパソコンで実行すると1秒かかりませんでした。 一昨日から今日の5時まで、何回やっても8秒かかっていたのですが、 急に早くなりました。この3日間はなんだったんでしょ。 セキュリティソフトをアップデートしたためかな? お手数をおかけしました。

関連するQ&A