重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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にコピー

A 回答 (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=8 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/16 20:47

ループは要りませんよ



Sub test()
With ActiveSheet.Range("a1:a1000")
.Formula = "=int(rand()*(11-0)+0)"
.Value = .Value
End With
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/16 20:48

わたしの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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/16 20:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!