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

投稿時間:2003/08/01(Fri) 16:24
投稿者名:ゆじゅ
Eメール:
URL :
タイトル:
VB-EXCEL 処理速度
こんにちわ。

○開発環境
 WinXP
 VB6(SP5)
 EXCEL2000

上のような環境で開発をしております。

VBからEXCELオブジェクトを使用し、罫線や枠や文字の設定をし、
印刷・保存等の処理を行っているのですが、
ApplicationオブジェクトのVisible=Trueにしたときの処理速度より、
Visible=Falseのときの処理の遅いという状態になっています。
Visible=Trueで10秒の処理が、
Visible=Falseだと20秒かかってしまうというような状態です。
これは通常考えると逆のような気がするのですが、どうなのでしょうか?
Visible=Trueだと処理が動いている最中に画面を触られてしまうと、
Selectionに対する処理などで不都合が起きてしまいます。
WindowState=xlMinimizedで画面を最小化(?)することで、
回避しようとしているのですが、タスクに出てきてしまうため、
根本的に解決していない気がします。
処理時間が倍も違ってしまうのでどうにかして解決したいのですが、
何か解決するような方法はありますでしょうか?

投稿時間:2003/08/01(Fri) 20:04
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VB-EXCEL 処理速度
> 何か解決するような方法はありますでしょうか?

どのような処理をしているのかにもよると思うのですが、その辺が解らない以上
答えようがないのでは。

>ApplicationオブジェクトのVisible=Trueにしたときの処理速度より、
>Visible=Falseのときの処理の遅いという状態になっています。

上記の状況が、再現できるコードを作成して投稿して頂ければ試して見る事が出来るのですが。
案外、再現できるコードを作成していると原因が解るかも知れません。

投稿時間:2003/08/04(Mon) 15:35
投稿者名:ゆじゅ
Eメール:
URL :
タイトル:
Re^2: VB-EXCEL 処理速度
>どのような処理をしているのかにもよると思うのですが、その辺が解らない以上
>答えようがないのでは。

>上記の状況が、再現できるコードを作成して投稿して頂ければ試して見る事が出来るのですが。
>案外、再現できるコードを作成していると原因が解るかも知れません。

ご回答ありがとうございます。
現コードをそのままのせることがちょっと難しいので、
再現できるコードを作成して試してみます。
作成できればまた投稿させていただくのでよろしくお願いいたします。

処理的には、真っ白のシートに1からEXCEL帳票を作成するプログラムです。(約30帳票)
各フォームモジュールから、標準モジュールにある共通関数的なものを呼び出しまくっている感じです。
共通関数にはRangeをSelectしたり、そのSelectionに対して、
配置・罫線・文字種・文字位置・結合などを行う処理がそれぞれ作成されています。
値を表示するのは2次元配列で一気に行ったりしています。

素人ながら、画面に出てくることによってCPUやメモリが優先的に使用されるとか、
そのようなことを考えたりしています。どうでしょう?

(どうでもいいことかも知れませんが、私も滋賀人です♪
 八日市は結構近かったりします。
 いろいろお世話になるかもしれませんが、よろしくお願いいたします。)

投稿時間:2003/08/04(Mon) 20:04
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: VB-EXCEL 処理速度
ユーザーから操作されたくない、という事であれば、Excel.Applicationオブジェクトの
Interactive プロパティを使って、ユーザーからの操作を禁止するという手もあります。


> 共通関数にはRangeをSelectしたり、そのSelectionに対して、
> 配置・罫線・文字種・文字位置・結合などを行う処理がそれぞれ作成されています。

「RangeオブジェクトをSelectしてから、Selectionを操作する」のではなく、できるだけ
直接「Rangeオブジェクトを操作する」ようなコーディングにする事をお奨めします。

SelectやActive系の処理は、Excel内部でフォーカスの移動を伴いますので、
その分、処理速度は低下しますし、必要なコード量も増加してしまいます。


> 素人ながら、画面に出てくることによってCPUやメモリが優先的に使用されるとか、
> そのようなことを考えたりしています。どうでしょう?

ActiveX DLLやActiveXコントロールといった「インプロセス」なオブジェクトなら、
非表示にしておいた方が、(一般的には)高速に処理されます。

しかし、Excelはアウトプロセスで処理されるものですので、
Excel自体が表示されていて、かつ、アクティブ状態になっていた方が、
高速に処理される結果となります。

# ただし、処理内容やOSの種類、あるいは設定状態などによっては、
# あまり速度差が無い事もありますけれどね。

投稿時間:2003/08/05(Tue) 14:49
投稿者名:ゆじゅ
Eメール:
URL :
タイトル:
Re^4: VB-EXCEL 処理速度
>ユーザーから操作されたくない、という事であれば、Excel.Applicationオブジェクトの
>Interactive プロパティを使って、ユーザーからの操作を禁止するという手もあります。

>「RangeオブジェクトをSelectしてから、Selectionを操作する」のではなく、できるだけ
>直接「Rangeオブジェクトを操作する」ようなコーディングにする事をお奨めします。

>SelectやActive系の処理は、Excel内部でフォーカスの移動を伴いますので、
>その分、処理速度は低下しますし、必要なコード量も増加してしまいます。
>ActiveX DLLやActiveXコントロールといった「インプロセス」なオブジェクトなら、
>非表示にしておいた方が、(一般的には)高速に処理されます。
>しかし、Excelはアウトプロセスで処理されるものですので、
>Excel自体が表示されていて、かつ、アクティブ状態になっていた方が、
>高速に処理される結果となります。

>#ただし、処理内容やOSの種類、あるいは設定状態などによっては、
>#あまり速度差が無い事もありますけれどね。

ご回答ありがとうございます。
魔界の仮面弁士さんがおっしゃるようにプログラムを修正してみたところ、
感覚ですが15〜25%ぐらい処理速度が向上したように感じます。(当社比)
ただ、デバッグ中は処理遷移がわかりづらくなってしまう感じなので、
切り分けて使おうと思います。

結局、

With Excel.Applicationオブジェクト
    .WindowState = xlMinimized    '画面最小化
    .Visible = True               '可視状態
    .Interactive = False          'ユーザー操作無効
End With

みたいな感じで処理することにします。

ありがとうございました。