|
Windowsは「見た目では何もソフトを起動していない」状態であっても
常に何らかの処理をし続けているらしいです。それは以下のようなマクロ
によって、実行中のウィンドウタイトルを列挙してみれば分かります。
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, _
lPalam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Sub RefreshWinList()
Dim dumb As Boolean
dumb = EnumWindows(AddressOf EnumWinProc, 0&)
End Sub
Function EnumWinProc(ByVal hWndX As Long, _
lParam As Long) As Boolean
Dim Name As String
Dim Leng As Long, Ret As Long
Name = String(250, Chr(0))
Leng = Len(Name)
Ret = GetWindowText(hWndX, Name, Leng)
Debug.Print Name
EnumWinProc = True
End Function
で、そこへ何かのソフト(マクロを実行する前提だから、常識的にExcelは入る)
を立ち上げて処理を始めると、Windowsはそれに対して重点的にメモリーや
CPUの働きを割り当てるようにします。これはOSに限ったことではないのですが、
「同時に複数の処理を進める」ということが出来ないため、必要な処理を並べて
はいるが、ユーザーの求めに応じて(というか推測して?)自動的に優先順位を決め、
その順位の高いものにはより長い時間をシェアする、というような仕組みに
なっているらしいのです。となるとExcelのマクロを実行中は、必然的にExcel
の処理が多くなるため、Windows自身が出すメッセージの処理が後回しにされて
しまいます。例えばIEを立ち上げても、そのイベントを知らせるメッセージなどは
滞ることになるわけです。そこでIEが現在どのような処理をしているか ? という
ことを逐次Windowsに問い合わせるため
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate url
Do While ie.Busy
DoEvents
Loop
Do While ie.ReadyState <> 4
DoEvents
Loop
などとして、ある条件を満たすまでループするようにします。
>分かりやすい具体例
とのことですが、上のコードは掲示板でも良く見かけると思います。
|
|