[リストへもどる]
一括表示

投稿時間:2003/08/25(Mon) 21:50
投稿者名:Ess
Eメール:
URL :
タイトル:
VBからExcelのセルに値を代入するときの処理速度
VBからExcelのセルに値を代入するときの処理です。

3.2MByteほどのエクセルファイルから、セルの値を取得するのは早いのですが、
値を代入するのが大変遅くなってしまいました。
内容が同じような2.8MByteのファイルでの同様の処理は圧倒的に速いです。

まとめると、3.2MByteのエクセルファイルのセルに代入する処理が遅い。
なにか原因がわかる方がいらっしゃいましたら、ご教授ください。

一応遅い部分のコードです。
objXlSheet.Cells(intRow, intCol).Value = s '結果を代入(s は'○'とか'×'です)
objXlSheet.Cells(intRow, intCol).Value = CDate(txtDate.Text) '日付を代入

開発環境は、VB6SP5,WinXP,OfficeXP です

投稿時間:2003/08/25(Mon) 23:14
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBからExcelのセルに値を代入するときの処理速度
それだけのコードでは何をしているのかどこが遅いのか解らないでしょう。

データの取得や設定が多いなら、Range オブジェクトを使って見るとか。
ここのExcel&Word関係や掲示板のワード検索をして見るとか。

投稿時間:2003/08/26(Tue) 08:50
投稿者名:Ess
Eメール:
URL :
タイトル:
Re^2: VBからExcelのセルに値を代入するときの処理速度
> それだけのコードでは何をしているのかどこが遅いのか解らないでしょう。
>
> データの取得や設定が多いなら、Range オブジェクトを使って見るとか。
> ここのExcel&Word関係や掲示板のワード検索をして見るとか。

そうですね^^;失礼しました。
フォームにオプションボタンがあって(合格、不合格)、それを押したときに下記のコードを
実行します。その処理がとても遅いのです。

Sub optResultCheck_Click(Index As Integer)
    Dim s as String
    If Index = 0 then
        s = "○"
    Else
        s = "×"
    End If

    'intRow intCol にはあらかじめ数値が入っています
    'objXlSheetはプライベート変数です。Loadイベントで定義してあります。
    objXlSheet.Cells(intRow, intCol).Value = s '結果を代入(s は'○'とか'×'です)
    objXlSheet.Cells(intRow, intCol).Value = CDate(txtDate.Text) '日付を代入
End Sub

よろしくお願いします。

投稿時間:2003/08/26(Tue) 10:12
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: VBからExcelのセルに値を代入するときの処理速度
私の言っているのは、プログラムの処理が早い・遅いと言う事は一つの処理に原因の多くが
ある場合と全体の処理の流れにある場合等要因は色々あると思うのですが。
例えば、大阪から東京へ移動するには何で行けば一番早いですか?
飛行機・新幹線・車 答えは車でした。夜の1時に出発する必要があったからです。

やっている事によっては、Excelを使用せずMS(H)FlexGridコントロール等を使った方がいい場合も
あるかと思います。
今回のイベント処理の場合でも、既存のExcelファイルを開いていて、すでにそのファイルの中には
データが入っている場合と、そうでない場合は根本的に方法が変わってくるかと思います。
細かい事をいえばこれだって 'objXlSheetはプライベート変数です。 事前バインディング
か実行時バインディングなのか解らないし、通常、事前バインディングの方が処理が早いとされて
いますが?。

このイベント処理を見る限りでは、早くなるかどうかは解りませんが、Excel上でマクロを組んで
そのマクロをVBから実行するといった方法位しか思い浮かびません。
というより同じセルにsとCDate(txtDate.Text)を入れているようにしか見えないのですが?。
これも掲載を省略されているのでしょうか? 私には理解出来ません。
CDate(txtDate.Text)の部分にしても一々プロパティを参照するのではなく変数にしておけば
少しは処理が早くなります。(ここのプログラムの最適化(高速化)を参照)

後は、仮定での話になるかと思いますし、一般的には読込・書込みの回数を減らすように
前回の回答の方法や魔界の仮面弁士さんの回答のような方法を取り入れる事かと思います。
又、あらかじめ数値が入っているなら、式も入れておくと言う方法もあるかと思います。

私のよくやる方法は、ここの経過時間計測色々で紹介している関数を使ってプログラムの個々の
処理時間を測定しながらプログラムを試行錯誤しながら無駄な処理を省いたり、早い処理方法を
見つけております。

投稿時間:2003/08/27(Wed) 07:00
投稿者名:Ess
Eメール:
URL :
タイトル:
Re^4: VBからExcelのセルに値を代入するときの処理速度
処理速度は計測していました^^;
ここだけ遅かったのでここだけでいいかな、と思い誤解を招いてしまったようですね。
申し訳ありませんでした。objXlSheet は事前バインディングしてありました。
掲載したコードはとても変なコードでしたね。情けない。

この現象が顕著に現れるのは総メモリが少ないマシンということが判明しました。申し訳ない;
どうやら、このマシンで対象のエクセルファイル(3.2M)を開いて、操作してみても(VBからでなく普通に)
重いファイルだったので、しょうがないのかもしれない、という結論に達しました。

現在は、変更を配列に貯めておいて。終了時に書き込むことで落ち着きました。
ご迷惑おかけして申し訳ありませんでした。
もっと質問の仕方も勉強します。どうもありがとうございました。

投稿時間:2003/08/27(Wed) 10:16
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: VBからExcelのセルに値を代入するときの処理速度
元々Excelには下記のような現象が発生するようなので、ループ回数や
読込・書込みの回数を減らすような方法をお勧めしていたのです。
Win9x 系の機種で使用される場合は特に注意が必要です。

 http://support.microsoft.com/default.aspx?scid=kb;ja;JP414107

投稿時間:2003/08/25(Mon) 23:29
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: VBからExcelのセルに値を代入するときの処理速度
> objXlSheet.Cells(intRow, intCol).Value = s '結果を代入(s は'○'とか'×'です)
> objXlSheet.Cells(intRow, intCol).Value = CDate(txtDate.Text) '日付を代入

Rangeメソッドを使って複数のセル範囲を取得し、そこに値を代入してみては如何でしょう。

例えば、
  With objXlSheet.Range("C3:E17")
      .NumberFormat = "dd日 hh時mm分"
      .Value = Now
  End With
のようにすれば、C3〜E17までの15行3列の範囲、すなわち45個のセル全てに同じ値・設定を施せます。

あるいは、
  Dim V As Variant
  With objXlSheet.Range("C3:E17")
      V = .Value
      V(1, 1) = "1行1列"
      V(1, 2) = "1行2列"
      V(1, 3) = "1行3列"
      V(2, 1) = "2行1列"
      V(2, 2) = "2行2列"
      V(2, 3) = "2行3列"
           :
           :
      .Value = V    '☆
  End With
のように、配列として扱う方法もあります。

この場合、セルへの代入操作は ☆印の行でしか行われませんので、
  objXlSheet.Cells(行, 列).Value = 〜
をセルの数だけ繰り返すよりも、動作を高速化させる事ができます。

投稿時間:2003/08/26(Tue) 14:12
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: VBからExcelのセルに値を代入するときの処理速度
3.2Mbyteのエクセルファイルと2.8Mbyteのファイルで
処理速度が大きく違うのは何故か?なのですよね。
結構大きいファイルですから、エクセル、VBが起動状態で
メモリ使用が大きくなり、メモリがスワップしてるんじゃない
んですかね。(2.8Mではスワップしないが3.2Mでスワップするとかね)
2つのファイル処理中のメモリやCPU等の状態をタスクマネージャ
などで見てみたらどうですか?

あとは、エクセルのVBScriptで同処理を行っても
3.2Mだけ遅くなるのかなど試してみてはどうでしょう。

投稿時間:2003/08/27(Wed) 07:10
投稿者名:Ess
Eメール:
URL :
タイトル:
Re^2: VBからExcelのセルに値を代入するときの処理速度
返信ありがとうございます。
報告してもらった人のマシンのメモリが64M、CPUがCeleron400MHz
のWinXPというマシンでした。
起動しただけで、メモリがいっぱいいっぱいな状態でした^^;
調査したところやはり、CPUもメモリも、いっぱいいっぱいでした。
とゆうわけで、メモリ使用量を減らすコードに変更しました、
なんとか実用できる速度になったので解決いたしました。ありがとうございました。