[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/02/04(Fri) 11:31
投稿者名:こう
URL :
タイトル:
DoEventsを常に取得出来る方法はありますでしょうか?
恐れ入ります。

DoEventsを常に取得出来る方法はありますでしょうか?

実行中に画面の最小化ボタン押下で最小化するのですが
タスクバー表示時にタスクバーをクリックしても
元に戻りません。
実行中の処理が優先されて認識してくれません。
何かDoEventsを認識させる方法はありますでしょうか?
ご教授下さい。m(_  _)m
宜しくお願い致します。m(_  _)m

投稿時間:2005/02/04(Fri) 12:06
投稿者名:ダンボ
URL :
タイトル:
Re: DoEventsを常に取得出来る方法はありますでしょうか?
> 実行中の処理が優先されて認識してくれません。
> 何かDoEventsを認識させる方法はありますでしょうか?

DoEventsの意味・仕様を誤解していないですかね?

「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御を
オペレーティング システムに渡すフロー制御関数です。」(VBのヘルプ)

「I/Oや画面描画などが無いプログラム部分はO/S割込みの機会が少なくハングしたような振る舞いになるので
積極的にO/S割込みの機会を作りましょう」(私の解釈)

具体的には、CPUをぶん回すようなコーディング箇所にDoEvents命令を入れておく。

投稿時間:2005/02/04(Fri) 13:14
投稿者名:こう
URL :
タイトル:
Re^2: DoEventsを常に取得出来る方法はありますでしょうか?
ご回答有難う御座いました。m(_  _)m

>具体的には、CPUをぶん回すようなコーディング箇所にDoEvents命令を入れておく。

とは実行中処理内でFor文等よく処理が通過する箇所に入れると言うことでしょうか?

投稿時間:2005/02/04(Fri) 14:52
投稿者名:ダンボ
URL :
タイトル:
Re^3: DoEventsを常に取得出来る方法はありますでしょうか?
> とは実行中処理内でFor文等よく処理が通過する箇所に入れると言うことでしょうか?

そうです。For文やLoop文の中の1ステップとして使うのが普通ですね。
googleで「DoEvents VB」で検索してミソ。

hhttp://www5b.biglobe.ne.jp/~yone-ken/VB/stdfunc.html
hhttp://homepage2.nifty.com/kasayan/vba/doevents.htm
hhttp://www.mitene.or.jp/~rnk/TIPS_VB_GEN.htm

投稿時間:2005/02/04(Fri) 16:49
投稿者名:こう
URL :
タイトル:
Re^4: DoEventsを常に取得出来る方法はありますでしょうか?
ご返信有難う御座いました。m(_  _)m

実はそのFor文は、EXCELの操作の処理で、
そのFor文にDoEventsを入れても認識してくれません。

VBがEXCELを操作している処理はDoEvents は認識してくれないのでしょうか?

EXCEL操作をしていない他の処理でのFor文内の DoEvents は認識してくれます。

VBがEXCELを操作している処理とEXCEL操作をしていない他の処理は
全く別ものです.

VBがEXCELを操作している処理内でしかFor文がありません。
タイマーコントロール等でやっても無理でした。
(T△T)

投稿時間:2005/02/04(Fri) 18:21
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^5: DoEventsを常に取得出来る方法はありますでしょうか?
> ご返信有難う御座いました。m(_  _)m
>
> 実はそのFor文は、EXCELの操作の処理で、
> そのFor文にDoEventsを入れても認識してくれません。
>
> VBがEXCELを操作している処理はDoEvents は認識してくれないのでしょうか?
>
> EXCEL操作をしていない他の処理でのFor文内の DoEvents は認識してくれます。
>
> VBがEXCELを操作している処理とEXCEL操作をしていない他の処理は
> 全く別ものです.
>
> VBがEXCELを操作している処理内でしかFor文がありません。
> タイマーコントロール等でやっても無理でした。
> (T△T)

そのEXCELの操作とは、どういうものでしょうか?

例えば、やり方によっては、もっと高速化できたり、さらに細かくループ化できたりして
DoEventsが認識できるようになるかもしれません。ならないかもしれませんが(^^;

差し支えなければ、その部分のコードを掲示してみてください。

投稿時間:2005/02/04(Fri) 18:45
投稿者名:こう
URL :
タイトル:
Re^6: DoEventsを常に取得出来る方法はありますでしょうか?
ご返事有難う御座いました。m(_  _)m

以下のコードです


' ************************************************************
' 予算ファイルを開いて合計ファイルにマージして行く処理
'
' 引数(IN): strDirPath           EXCELファイルの保存先パス
' 引数(IN): strCreatPath         EXCELの保存先パス
' 引数(OUT): arStrFileList()      開くEXCELファイル名格納配列
' 戻り値:   Boolean              true = 正常、false = 異常
' ************************************************************
Private Function MergeExcel(ByVal strDirPath As String, _
                            ByVal strCreatPath As String, _
                            ByRef arStrFileList() As String) As Boolean
On Error GoTo ErrHandler:
    
    Dim xlTotalBook     As Excel.Workbook   '作業する合計Bookの宣言
    Dim xlTotalSheet    As Excel.Worksheet  '作業する合計シートの宣言
    Dim xlSitenBook     As Excel.Workbook   '作業するコピーBookの宣言
    Dim xlSitenSheet    As Excel.Worksheet  '作業するコピーシートの宣言
    Dim xlApp           As Excel.Application
    Dim iProgressBarCount As Integer        'ProgressBarカウント
    Dim strFileName     As String           'ファイル名
    Dim iFileCount      As Integer          'For文カウント
    Dim i               As Integer          'For文カウント
    Dim iExcelFileCount As Integer          '予算ファイルOpenカウント
    Dim blnRet          As Boolean
    
'    ReesizeTimer.Interval = 10
'    ReesizeTimer.Enabled = True
    
    MergeExcel = True


    'Excelを開く
    Set xlApp = CreateObject("excel.Application")

    '合計用ブックを新規作成する
    Set xlTotalBook = xlApp.Workbooks.Add

    xlApp.DisplayAlerts = False     '上書き保存しますか?のメッセージを出さない


    Set xlTotalSheet = xlTotalBook.Worksheets("sheet1")

    For iFileCount = 0 To エクセルファイル数

        blnRet = True
        '.xlsの拡張子を取りファイル名を取得
        strFileName = Replace(arStrFileList(iFileCount), ".xls", "")

        ' ファイルを開いてからのチェック
        If blnRet Then

            'ファイルを開く
            Set xlSitenBook = xlApp.Workbooks.Open(strDirPath & "\" & arStrFileList
(iFileCount))
            'シートをセットする
            Set xlSitenSheet = xlSitenBook.Worksheets(strFileName)

            If blnRet Then

                '支店シートを合計シートにコピー
                iExcelFileCount = iExcelFileCount + 1
                xlSitenSheet.Copy Before:=xlTotalBook.Worksheets(iExcelFileCount)
            
            End If
        
            '終了処理
            xlSitenBook.Close
            Set xlSitenSheet = Nothing
            Set xlSitenBook = Nothing

        End If
        
      
        '画面の最小化制御用にたまったイベントを実行させる
        DoEvents
    
    Next
    
こんな感じです。
宜しくお願い致します。

投稿時間:2005/02/04(Fri) 21:29
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^7: DoEventsを常に取得出来る方法はありますでしょうか?
速度アップでよく使う方法なんですが、処理中は画面の更新を
行わないようにするのはどうでしょうか?

'Excelを開く
Set xlApp = CreateObject("excel.Application")

xlApp.ScreenUpdating = False

中略

xlApp.ScreenUpdating = True

投稿時間:2005/02/07(Mon) 10:11
投稿者名:こう
URL :
タイトル:
Re^8: DoEventsを常に取得出来る方法はありますでしょうか?
ご返信有難う御座いました。m(_  _)m

もともとEXCELは

xlApp.Visible = False

で非表示なので、試した結果変わりませんでした。
ご意見有難う御座いました。m(_  _)m