過去ログ

                                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って使えるのでしょうか?
 ───────────────────────────────────────  ■題名 : Re:計算高速化は可能か?  ■名前 : Nakamura  ■日付 : 02/9/23(月) 11:11  -------------------------------------------------------------------------
   お早うございます。

こんな感じでどうでしょう?

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

それでは
 ───────────────────────────────────────  ■題名 : すごく早くなるんですね!  ■名前 : 初心者M  ■日付 : 02/9/23(月) 11:29  -------------------------------------------------------------------------
   ▼Nakamura さん:
こんにちは。
(横から失礼します)
スゴーク早くなったのでおどろきました!

こんな風に早くなるプログラムを書くには、何に注意されているのでしょうか?
アドバイスなどおありでしたら、教えて頂けませんか?
 ───────────────────────────────────────  ■題名 : Re:すごく早くなるんですね!  ■名前 : Nakamura  ■日付 : 02/9/23(月) 12:09  -------------------------------------------------------------------------
   こんにちは

普段は処理速度を気にして組む事は有りません。
何故かと言えば、最近マシーンの性能も上がっていますし
可読性を重視して組む様にしていますから
今回のご質問の様に、8000回×3=24000回
のループとなると、さすがになんか良い方法が無いか考えます。
基本的には、

1.出来るだけループの回数を減らす。
2.目的に合った関数やメソッドを使う。
3.計算をシートに行わせる。
4.必要の無い時は再計算をしない。
5.必要の無い時は画面の更新をしない。
6.セルを使わずに変数(配列など)を使って処理する。
7.If文が複数条件分岐の場合、ANDやORを使わずにネストにする。

等々有りますが、処理速度の問題が出てから考えれば良いと思います。
それよりも、可読性を重視してメンテナンス性の良い(誰が見ても分かり易い)コード
を書く様にした方が良いと思います。
それでは
 ───────────────────────────────────────  ■題名 : Re:計算高速化は可能か?  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/9/23(月) 11:15  -------------------------------------------------------------------------
   乱暴だけど、この方が少し速いよ
なぜ乱暴かと言うと、奇数列のデータまで書きなおしてます

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
 ───────────────────────────────────────  ■題名 : Re:計算高速化は可能か?  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/9/23(月) 11:38  -------------------------------------------------------------------------
   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
 ───────────────────────────────────────  ■題名 : ありがとうございます。  ■名前 : いぬだわん  ■日付 : 02/9/23(月) 13:08  -------------------------------------------------------------------------
   こんにちは。
Nakamuraさん、Hirofumiさん
ありがとうございました。
これでいろいろやってみます。

ほんと、いつもすみません(汗)。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 113