Page 113 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼計算高速化は可能か? いぬだわん 02/9/23(月) 9:25 ┣Re:計算高速化は可能か? Nakamura 02/9/23(月) 11:11 ┃ ┗すごく早くなるんですね! 初心者M 02/9/23(月) 11:29 ┃ ┗Re:すごく早くなるんですね! Nakamura 02/9/23(月) 12:09 ┗Re:計算高速化は可能か? Hirofumi 02/9/23(月) 11:15 ┗Re:計算高速化は可能か? Hirofumi 02/9/23(月) 11:38 ┗ありがとうございます。 いぬだわん 02/9/23(月) 13:08 ─────────────────────────────────────── ■題名 : 計算高速化は可能か? ■名前 : いぬだわん ■日付 : 02/9/23(月) 9:25 -------------------------------------------------------------------------
こんにちは。 いつもたびたびすみません。 こういうデータがあるとします。 A列 B列 C列 D列 E列 F列 1 (空白列) 2 (空白列) 3 (空白列) 2 3 4 3 4 5 (以下略) このようなデータが各列に8000個あるとします。 偶数列に奇数列のデータを1000倍した計算結果を入力します。 ex) B1=+(A1*1000) このProgを下記のようにしたのですが、 このProgでやると、ちょっと処理能力が遅いので、 もう少し高速化することは可能なのでしょうか? '===== Sub Test() Dim i As Integer '任意の変数i Dim t As Integer '任意の変数t For i = 2 To 6 Step 2 For t = 1 To 8000 Cells(t, i).Value = Cells(t, i - 1).Value * 1000 Next t Next i End Sub '===== 画面表示を少なくしたりいろいろ考えたんですけど・・・ これはFor Each?Nextって使えるのでしょうか? |
お早うございます。 こんな感じでどうでしょう? Sub Test() Dim i As Integer For i = 0 To 4 Step 2 With Range("B1:B8000").Offset(, i) .FormulaR1C1 = "=RC[-1]*1000" .Value = .Value End With Next i End Sub それでは |
▼Nakamura さん: こんにちは。 (横から失礼します) スゴーク早くなったのでおどろきました! こんな風に早くなるプログラムを書くには、何に注意されているのでしょうか? アドバイスなどおありでしたら、教えて頂けませんか? |
こんにちは 普段は処理速度を気にして組む事は有りません。 何故かと言えば、最近マシーンの性能も上がっていますし 可読性を重視して組む様にしていますから 今回のご質問の様に、8000回×3=24000回 のループとなると、さすがになんか良い方法が無いか考えます。 基本的には、 1.出来るだけループの回数を減らす。 2.目的に合った関数やメソッドを使う。 3.計算をシートに行わせる。 4.必要の無い時は再計算をしない。 5.必要の無い時は画面の更新をしない。 6.セルを使わずに変数(配列など)を使って処理する。 7.If文が複数条件分岐の場合、ANDやORを使わずにネストにする。 等々有りますが、処理速度の問題が出てから考えれば良いと思います。 それよりも、可読性を重視してメンテナンス性の良い(誰が見ても分かり易い)コード を書く様にした方が良いと思います。 それでは |
乱暴だけど、この方が少し速いよ なぜ乱暴かと言うと、奇数列のデータまで書きなおしてます Sub Test2() Dim i As Integer '任意の変数i Dim t As Integer '任意の変数t Dim vntData As Variant For t = 1 To 8000 With Cells(1, 1) vntData = Range(.Offset(t - 1, 0), .Offset(t - 1, 5)).Value For i = 2 To 6 Step 2 vntData(1, i) = vntData(1, i - 1) * 1000 Next i Range(.Offset(t - 1, 0), .Offset(t - 1, 5)).Value = vntData End With Next t End Sub |
8000行ぐらいならこの方が速いかな Sub Test5() Dim i As Integer '任意の変数i Dim t As Integer '任意の変数t Dim vntData As Variant Dim vntValue(7999, 0) As Variant For i = 1 To 5 Step 2 With Cells(1, i) vntData = Range(.Offset(0, 0), .Offset(7999, 0)).Value For t = 1 To 8000 vntValue(t - 1, 0) = vntData(t, 1) * 1000 Next t Range(.Offset(0, 1), .Offset(7999, 1)).Value = vntValue End With Next i End Sub |
こんにちは。 Nakamuraさん、Hirofumiさん ありがとうございました。 これでいろいろやってみます。 ほんと、いつもすみません(汗)。 |