- ベストアンサー
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にコピー
- みんなの回答 (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
その他の回答 (2)
- jindon
- ベストアンサー率43% (50/116)
ループは要りませんよ Sub test() With ActiveSheet.Range("a1:a1000") .Formula = "=int(rand()*(11-0)+0)" .Value = .Value End With End Sub
お礼
こういう方法もあるのですね。勉強になります。 回答ありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
わたしの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
お礼
本当ですね。今、自宅のパソコンで実行すると1秒かかりませんでした。 一昨日から今日の5時まで、何回やっても8秒かかっていたのですが、 急に早くなりました。この3日間はなんだったんでしょ。 セキュリティソフトをアップデートしたためかな? お手数をおかけしました。
お礼
配列全体を特定のセルにコピーすることができる方法を書いていただき、 助かりました。Range("A1:A1000").Value = ar() こういう事はなかなかHELPでは検索できずに悩んでいました。 いろいろ応用もできると思いますので、このやり方を利用しようと思います。 ありがとうございました。