Excel 2007(およびおそらく以前のバージョン)にウィンドウフォーカスがある場合、Excelはフルスピードで実行されます。つまり、ファイルは高速に開き、長時間実行されるVBAマクロはすばやく実行されます。
Excelウィンドウがフォーカスを失うと、Excelのスレッドの優先度が大幅に低下し、フォーカスを移動したときに開いていた大きなファイルがゆっくり開いたように見え、複雑なVBAマクロはlong完了するまでの時間。
フォーカスされているかどうかに関係なく、Excelの優先度を高く保つ方法はありますか?
タスクマネージャーを使用してスレッドの優先度を人為的に上げることができることは知っていますが、これがスプレッドシートまたはOSにどのようなノックオン効果をもたらすかはわかりません。
私のシステムは4Gb RAMの高速デュアルコアで、Vista64を実行しています。
明確化のための編集:
私の問題は、タスクマネージャを介してExcelプロセスの優先度を上げることだけではありません。これは、onlyがウィンドウフォーカスがある場合にExcelに影響するためです。
要点は、Excelがウィンドウフォーカスを失ったときに何が起こるかです。
Excelを広範囲に使用すると、設計上、Excelウィンドウにフォーカスがない場合に意図的にプロセスの優先度を下げるように見えます。
Excelプロセスに高い優先度を設定しても、これが発生するのを防ぐことはできません。Excelにフォーカスがある場合にのみ高いプロセス優先度が与えられますが、フォーカスが失われると劇的に低下します。
通常のExcelの使用法(おそらくそれを使用しているすべての人の99%)では、この効果に気付かないでしょうが、大規模なスプレッドシート(約2000のワークシートだと思います)と実行に数分かかる複雑なVBAマクロでは、効果は非常に大きいです目立つ。
理想的には、Excelウィンドウがフォーカスされているかどうかに関係なく、同じスレッドの優先順位を維持する必要があります。
今までは、処理中にコンピューターから数分間座っていたので、Excelウィンドウがクランチしているときに誤ってクリックしないようにしていますが、もっと良い解決策があることを望んでいました...おそらくある種のレジストリハック?
編集:
私はネット上でこの問題に関するもう1つの言及を見つけただけです このリンク
これは関連する見積もりです...
ただし、Excel 2000ウィンドウをユーザーに表示し、ウィンドウのフォーカスを維持すると、マクロは期待される速度で実行されます。この場合も、ウィンドウにフォーカスがある必要があります。そうしないと、マクロの速度が再び低下します。
Windowsの非サーバーエディションは、デフォルトで、フォアグラウンドプロセスに優先度ブーストを提供します。 Excelをバックグラウンドにプッシュすると、以前はフォアグラウンドにあったブーストが失われます。代わりに、他のいくつかのプログラムが優先順位を上げる。
プログラムがこのブーストを取得しないように設定を変更できます。注:これはExcelだけでなく、ブーストの対象となるプログラムにも影響します。
Windows XPで設定を微調整する方法は次のとおりです。
詳細タブをクリックします。最初のパネルはProcessor Schedulingです。
デフォルトの「プログラム」から「バックグラウンドサービス」に変更すると、Excelがバックグラウンドで希望どおりに動作するようになります。
私の場合、Excelプロセスの優先度をAbove Normalに変更しても問題はないと思います。それは問題ではないはずです。
システムプロセスと競合する最高にしないでください。
それをsuspendしないでください。
Mark Russinovich's Process Explorer を使用する場合
システムで実行されているプロセスの優先順位を確認します。
次の優先度の値とそれらの関連付けが表示されます。
24 Realtime
13 High : procexp.exe itself is here, with winlogon, csrss
11 : smss is actually at 11
10 Above Normal :
9 : lsass, services.exe are here
8 Normal : Most things are here
6 Below Normal
4 Idle
process Explorerを使用して、Excelの優先順位を付け直してみてください。
8の上に移動しますが、12を超えないようにします
Above Normalat10すべきだと思います。
同じように、フォーカスが合っていないときに一部のプロセスがプロセッサ時間を使いすぎていると思われる場合は、優先度をIdleまで下げることができます。
私は通常、そのためにこの手法を使用します。
ここで考慮すべき点がいくつかあります。プロセスの優先度を変更すると、その基本優先度はすべてのスレッドと、プロセスが開始する他のプロセスに継承されます。現在の優先度は、基本優先度と、ブーストする必要があるかどうかを決定するいくつかの要因で構成されます。フォアグラウンドにあること自体が必ずしも優先度を上げるとは限りませんが、待機状態から抜け出す、またはIOは短い一時的なブーストを与えることができます。
これらの非常に集中的なワークブックで作業するときに優先度を高くしてExcelプロセスを実行することは理にかなっていると思います。 "優先度の高いExcel"と呼ばれる2つ目のショートカットがこれを行う良い方法だと思います。まず、適切なスイッチを使用して開始コマンドを実行する1行のバッチファイルを作成します。例:
_start "high priority Excel" /max /high "C:\Program Files\Microsoft Office\Office12\Excel.EXE"
_
(64ビットバージョンのWindowsでは、2010以降でのみ使用可能な64ビットバージョンのOfficeも実行していない限り、これはstart "high priority Excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\Excel.EXE"
になります_start "high priority Excel" /max /high "C:\Program Files\Microsoft Office\Office14\Excel.EXE"
_)ウィンドウのタイトルに注意してください好きなものにすることができますが、オプションではありません。
ここで、これをたとえばHiperExcel.cmdとして便利な場所に保存します。たとえば、officeフォルダー、c:\ scriptsフォルダーなど、またはホームフォルダーを使用して、マシン間を移動できるようにします。このファイルを指す新しいショートカットを作成し、開始フォルダーをファイルが保存されているフォルダーにします。ファイルのアイコンを選択します。Excel.exe実行可能ファイルを参照してから、明確にするために通常のExcelアイコン以外のものを選択します。
新しいショートカットをクリックすると、優先度の高いプロセスとして実行されているExcelが呼び出され、基本優先度は13になります。実行すると、非リアルタイムプロセスの最大優先度は15になります。他の何かが後押しされたとしても、優先度を高くするべきではありません。フォアグラウンドプロセスは、フォアグラウンドにあるだけでは優先度が上がるわけではないことに注意してください(NT4.0以降ではありません)。では、何が起こっているのでしょうか。
これまでにわかったことを要約します。プロセスは優先順位に従って順番を取りますが、優先順位の低いプロセスを完全に排除するわけではありません(まあ、スレッドですが、議論を容易にするために、プロセスに物事を保持できます)。プロセスがその「ターン」を取得するとどうなりますか?クォンタムと呼ばれる単位時間実行されます。クォンタムの長さはどれくらいですか?場合によります...
これは、フォアグラウンドプロセスがより多くのリソースを使用できるようになる場所です。ターンを取得すると、そのターンはバックグラウンドプロセスのターンよりも3倍長く続く可能性があります。そのため、(優先度によっては)あまり頻繁に実行されない場合がありますが、実行されると、実行時間が長くなります。
短いクォンタムまたは長いクォンタムを使用するか(デフォルトはワークステーションOSで短い、サーバーで長い)、フォアグラウンドプロセスをブーストするかどうか(w/sで可変、デフォルトでサーバーで固定)を選択でき、ブーストされている場合は、いくら(事実上最大3回)。さて、これのトリッキーな部分は、乗数を変更することを選択した場合、すべての量子の値が非常に短くなるのに対して、フォアグラウンドブーストを無効にした場合、すべてが長くなりますが、量は等しくなります。もちろん無効にすると、バックグラウンドWindowsサービスはユーザーアプリケーションと同じ量を取得しますが、これは理想的ではない可能性があります。ビットマスクを使用して、HKLM\System\CurrentControlSet\Control\PriorityControl\Win32PrioritySeparationにあるレジストリの値を設定する必要があります。物事を簡単にするために、あなたが望む最もありそうな値は次のとおりです:
2 =デフォルト値、最大ブーストでデフォルトを使用することを意味します。ワークステーションのO/Sのデフォルトは短く、可変です。 8 =固定、短いクォンタム(前景と背景が等しい)40(10進数、x28 hex)=固定および長い(これはサーバーのデフォルトと同じ)36(decimal、x24 hex)=短い、可変、ただし前景プロセスのブーストは最小限。これはおそらく、他のアプリが競合する量を減らすために最も大きなメリットをもたらすものだと思いますが、フォアグラウンドにあるときにExcelがより多くのリソースを取得できるようにします(優先度も上げる限り)。
試してみてください。これがお役に立てば幸いです。もちろん、マイレージは異なる場合があります。
余談ですが、他の多くのアプリケーションやプロセスには、ボトルネックとしてCPUがありません。Outlookの同期とIEブラウジングの例には、おそらくネットワークがあり、Outlookの場合はディスクIOがあります。速度のより重要な要素なので、フォアグラウンドでブーストが得られるかどうかにかかわらず、目に見えるパフォーマンスへの影響は、おそらく単純な観察でわかるものを下回ります。
プロセスの優先度を「通常より上」または「高」に上げても問題はありません。「リアルタイム」に設定しないでください。特に申し訳ありませんがExcelであなたを助けることはできません。
優先度の操作がExcelではなくWindows自体によって行われている可能性があります。 Windowsには、foregroundにWindowsがあるプロセスの優先度が上がるメカニズムがあります。そのため、Excelがフォーカスを失うと、その優先度は通常に戻ります(わずかに低くなります)。
クイック検索でこれについて見つけることができるMSDNの唯一のページは Priority Boosts です。
NORMAL_PRIORITY_CLASS
を使用するプロセスがフォアグラウンドに移動すると、スケジューラは、フォアグラウンドウィンドウに関連付けられているプロセスの優先度クラスを引き上げて、バックグラウンドプロセスの優先度クラス以上になるようにします。プロセスがフォアグラウンドでなくなると、優先度クラスは元の設定に戻ります。
私が聞いたところによると、その優先度の向上を無効にする方法があります。
これを試してみてください、それは私のために働きました。
あまりいい方法ではありませんが、実際には計算速度が2倍になっただけです。すごい! (ただし、結果は確認しますが、よくわかりません...)
ユーザーフォームは1024 * 768で画面の中央にある必要があります。ソフトウェアでユーザーフォームを右クリックするだけです。
完全な計算ですが、計算中はコンピュータを使用しないでください(他のプログラム、ウィンドウなどを起動します)。
それがあなたのためにどのように機能したかを教えてください!
'In General
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Private Const MOUSEEVENTF_RIGHTUP As Long = &H10
Private Sub Optimizer()
'activate the window
'AppActivate "Inbox - Microsoft Outlook"
'move the cursor where you need it, I guessed at 200,200
'Warning here : check the center coordinates of your userform!
SetCursorPos 512, 374
'send a down event
mouse_event MOUSEEVENTF_RIGHTDOWN, 0&, 0&, 0&, 0&
'and an up
mouse_event MOUSEEVENTF_RIGHTUP, 0&, 0&, 0&, 0&
End Sub
'Inside your code
Call Optimiser`
フルスピード計算の長い夜の後、そしてチェックの後、今朝の結果は...完全に間違っていました。
ですから、それは単なるバグだと思います。計算が適切に行われていません。
計算でユーザーフォームをクリックすると、プロセス速度が速くなりますが、シートを完全に再計算することはできません。私はprioとリアルタイムでいたことを正確に示しています。
もう1つの優れた点は、prio_x64_199_2367.exeを使用してプロセスタスクを微調整することです。 http://softziz.com/2010/11/prio-64-bit-1-9-9/
これにより、将来の使用のために、タスクマネージャー内のCTRL ALT DELで定義されたプロセスの優先順位が保存されます。
敬具、
ジョン