C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Excel操作中のプログレスバーがうまく動作しない


(過去ログ 28 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■13288 / inTopicNo.1)  Excel操作中のプログレスバーがうまく動作しない
  
□投稿者/ こぱ (1回)-(2008/01/26(Sat) 19:16:35)

分類:[.NET 全般] 

開発環境:WindowsXP,Excel2003
使用言語:VisualBasic6.0

VisualBasicを始めて2週間程で、まだ初心者です。
このような質問サイトに投稿するのも初めてです。
何かと失礼があると思いますが、その際にはご指摘を
お願いします。

VBでExcelを操作し、データの更新及び上書き保存を行う
プログラムを作成しています。
処理時間が20秒程かかる為、下記URLのサンプルを使用し、
処理中にプログレスバーを表示するようにしました。

http://www.winapi-database.com/CommonControls/ProgressBar/progressbar.html

Form1にあるコマンドボタンを押すと、コマンドクリックの
イベントにより、プログレスバーを設定したForm2を
表示します。

続けて、Form2_Loadイベントでプログレスバーのカウントを
開始した後、Form1へ戻り、Excel操作を実行するように
しました。

実際には、Form1のクリックイベントの中にExcel操作を入れて
いますので、同時進行すると考えたのですが・・・

実際の動作は、コマンドボタンを押すとプログレスバーが
表示されますが、カウントが始まらず、Excelの処理が
開始され、Excel処理が終了してからプログレスバーの
カウントが開始されてしまいます。

デバックすると、プログレスバーの起動処理を行った後に
Excel処理へ移行しているのですが、画面に表示される内容は
前述のようになってしまいます。

Form1のコマンドボタンとForm2の記述は下記の通りです。
Form2に関しては、サンプルプログラムをほぼ丸ごと使用させて
頂き、Form2_Load時に起動するようにしました。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
'Form1のコマンドボタンクリック時の設定
Private Sub Command1_Click()

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim sndForm As Form2

Set sndForm = Form2
Call sndForm.Show

Set xlApp = CreateObject("Excel.Application")
Set xlBook1 = xlApp.Workbooks.Open(〜〜〜〜〜
Set xlSheet =~〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

’以下Excel操作の記述

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


'Form2_Loadイベント時の設定(プログレスバーの起動)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Dim cnt As Long 'カウント用
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub Form_Load()
'タイマーイベントを禁止
Me.Timer1.Enabled = False

'コモンコントロールを初期化する
Dim cc As tagINITCOMMONCONTROLSEX
cc.dwSize = Len(cc)
cc.dwICC = ICC_PROGRESS_CLASS

'プログレスバーの作成
hProgWnd = CreateWindowEx(0, PROGRESS_CLASS, "Progress Bar", _
WS_CHILD Or WS_VISIBLE Or WS_BORDER Or PBS_SMOOTH, _
10, 10, 290, 20, Me.hWnd, 0, App.hInstance, 0)
'範囲の設定(0〜100)
Call SendMessage(hProgWnd, PBM_SETRANGE, 0, GetLong(100, 0))
'ステップの設定
Call SendMessage(hProgWnd, PBM_SETSTEP, 1, 0)

'プログレスバーの値を0にする
Call SendMessage(hProgWnd, PBM_SETPOS, 0, 0)
cnt = 0
'タイマーイベントを許可
Me.Timer1.Interval = 100 '100ミリ秒
Me.Timer1.Enabled = True

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub Timer1_Timer()
'プログレスバーのカウント
cnt = cnt + 1
Call SendMessage(hProgWnd, PBM_SETPOS, cnt, 0)
Me.Label1.Caption = Str(cnt) + "%"
If cnt > 99 Then
'カウントを終了
cnt = 0
Me.Timer1.Enabled = False
End If
End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Call sndForm.ShowのところでForm2_loadイベントが発生し、
その後ExcelApplicationに移動しているのをデバックで
確認しています。

ちなみに、Excel処理の動作とプログレスバーの動作は、
単体ではどちらも正常に動く事を確認しています。

説明がうまく出来ないのですが、お分かり頂けたでしょうか。
よろしくお願いします。




引用返信 編集キー/
■13293 / inTopicNo.2)  Re[1]: Excel操作中のプログレスバーがうまく動作しない
□投稿者/ Azulean (21回)-(2008/01/26(Sat) 19:32:45)
> 実際の動作は、コマンドボタンを押すとプログレスバーが
> 表示されますが、カウントが始まらず、Excelの処理が
> 開始され、Excel処理が終了してからプログレスバーの
> カウントが開始されてしまいます。
Excel処理の間、ずっと忙しい状態になるため、Timer_Timerイベントが発生しないからです。
DoEventsを混ぜればそれとなく動くかもしれませんが、他のForm1のボタンが押せたりする可能性があるので十分に注意してください。

通常、こういった場合はスレッドを分けて忙しい処理をするスレッドと画面の表示更新を行うスレッドに分けますが、VB6だと難しいと思われます。
APIを呼ぶことになるのかな?
引用返信 編集キー/
■13296 / inTopicNo.3)  Re[2]: Excel操作中のプログレスバーがうまく動作しない
□投稿者/ こぱ (2回)-(2008/01/26(Sat) 19:43:02)
No13293 (Azulean さん) に返信
即答ありがとうございます。

> Excel処理の間、ずっと忙しい状態になるため、Timer_Timerイベントが発生しないからです。

なるほど、構成自体に無理があるのですね。

> DoEventsを混ぜればそれとなく動くかもしれませんが、他のForm1のボタンが押せたりする可能性があるので十分に注意してください。

ちょっとやってみます。
他にも方法が無いか調べながらやって見ますね。

ありがとうございました^^
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -