

プロシージャの内容：  
シート上に100行強のデータがあります。ABC列の内容をキーに１行づつSQLServerへデータを取得しにいって、当該行H列に結果を格納する内容です。  
行のコレクションをForEach文でループ。SQLServerへの接続はループ開始前で、ループ内でレコードセット取得・クローズを繰りかえす感じです。

問題点：  
Apprication.ScreeUpdatingがTRUEな状態に関わらず、処理が完了するまで画面のレスポンスがほぼ得られない状況をどうにかしたいです。  
「ほぼ得られない」というのは、始まってすぐはUserForm上のProgressBarが進行を表すものの、途中から画面が固まってしまい、進行を表さないということです。  
処理最後にはプログラミングしているメッセージボックスが現れるので、一応にその完了を把握できている、という状況です。

処理が重いから仕方がないこと、と今まで放置してきた事案ですが  
何か解決策はありますか？

メモリが食っているから生じていることなのかどうかも分からないのですが（調べ方知らない）、仮にそうだとした場合、適時メモリ開放するようなことができれば  
画面反映はスムースに行われるでしょうか？？

こちらのサイトで様々な事案を解決できたので、こんなことも解決できるかな？と思い掲載させて頂きました。何卒よろしくお願い申し上げます。

===追記===

[code]

    UserForm1.ProgressBar1.Value = 0
    UserForm1.ProgressBar1.Min = 0
    UserForm1.ProgressBar1.Max = 100
    
    Range("A9999").Select
    Selection.End(xlUp).Select
    MaxLine = ActiveCell.Row
    Set DataSheet = Range("A2:A" & MaxLine)
    
    For Each x In DataSheet
        W_LCnt = W_LCnt + 1
    
            strSQL = "SELECT XXXXX"   
            RS.Open strSQL, Conn, adOpenStatic, adLockReadOnly, -1
    
            If RS.EOF Then
                x.Offset(0, 5).Value = "なし"
            Else
                RS.MoveFirst
                x.Offset(0, 5).CopyFromRecordset RS
            End If
            RS.Close
    '#        DoEvents
            UserForm1.ProgressBar1.Value = W_LCnt / 100
    Next x
    
[/code]


CC BY-SA 4.0
2018-07-07T00:47:34.267
45376
2018-11-26T02:26:09.047
2018-07-09T00:39:31.417
25696
25696
question
vba
Excel VBA プロシージャの処理が終わるまで画面が固まる状況を克服したい


[DoEvents](https://msdn.microsoft.com/ja-jp/vba/language-reference-
vba/articles/doevents-function) という関数があります。  
ループ中にこの関数を呼ぶと、OSが他のイベントも制御できるようになるので解決できるかもしれません。

[この記事](http://officetanaka.net/excel/vba/function/DoEvents.htm)などが参考になると思います。


CC BY-SA 4.0
2018-07-07T01:32:18.190
45377
2018-07-07T01:32:18.190
45376
answer


現状のコードを見て気になった点です。

1)DoEventsがコメントアウトされていますが、実際はアンコメントされていますよね？

2)変数W_LCntは、処理件数ということですか？  
だとすると、  
UserForm1.ProgressBar1.Value = W_LCnt / 100  
ではなく、  
UserForm1.ProgressBar1.Value = (W_LCnt / (MaxLine - 1)) * 100  
ではないでしょうか？

これでもプログレスバーは途中で停まってしまうでしょうか？

SQLの処理を時間のかかる処理に置き換えて、私の環境で実行しましたが、  
1)と2)を直すと、ちゃんとプログレスバーは表示されました。


CC BY-SA 4.0
2018-11-26T02:26:09.047
50623
2018-11-26T02:26:09.047
31109
45376
answer