Ogranicz użycie procesora Excela


31

Czy istnieje sposób, aby ograniczyć do jakiego stopnia wykorzystanie procesora Excel ma dostęp podczas działania? Mam skrypt VBA, który oblicza kilka formuł gigantycznej tablicy. Całe obliczenie zajmuje około 20 minut przy użyciu 100% mojego procesora, ale nie mogę w tym czasie korzystać z mojego komputera i wolałbym, aby działał w tle przy około 50% użycia procesora, dzięki czemu mogę kontynuować inne rzeczy. Jakieś sugestie?

Mój system operacyjny to Windows 7 Enterprise 64-bit, a wersja Excel to 2007-32 bit


1
Windows? Która wersja
DavidPostill

Windows 7. Dodam go do postu
learningAsIGo

8
Masz procesor wielordzeniowy? Jeśli już go masz (kto nie?), A program Excel używa wszystkich rdzeni (czego nie wiedziałem, że program Excel może zrobić), ustaw jego powinowactwo w Menedżerze zadań.
user253751,

2
To nie odpowiada na pytanie, ale upewnij się, że wyłączysz aktualizacje okien, zanim zaczniesz obliczać i aktualizować tysiące komórek. Jeśli masz jakieś wykresy, wyłącz je. VBA działa powoli, ale kiedy jest naprawdę wolny, zwykle jest to jeden lub oba z nich.
Coxy

1
@cat: Nie, 100% użycie procesora w Menedżerze zadań Windows oznacza 100% we wszystkich procesorach logicznych. Jeśli wypełniony będzie tylko jeden rdzeń, będzie to albo 25% (na zwykłym podwójnym rdzeniu z hiperwątkowością), albo ~ 36% (turbo boost).
Martheen Cahya Paulo

Odpowiedzi:


54

Jeśli funkcja VBA jest wywoływana z kilku formuł lub jeśli skrypt generuje lub wymusza ponowne obliczenie kilku formuł, to zdecydowanie powinno skorzystać z funkcji obliczeń wielowątkowych programu Excel. Odpowiednio uruchomiłoby to wiele wystąpień funkcji VBA dla każdej formuły lub ponownie obliczyło wiele komórek jednocześnie, gdy skrypt vba działa w jednym wątku.

Możesz ograniczyć liczbę wątków używanych przez program Excel do ponownego obliczania formuł w Opcjach programu Excel ... Karta Zaawansowane ... sekcja Formuły.

wprowadź opis zdjęcia tutaj


Sub VBA nie jest problemem, to formuła tablicy Excela generowana przez kod VBA.
learningAsIGo

@learningAsIGo Racja, uprościłem swoją odpowiedź. Daj nam znać, czy ustawienie liczby wątków na 1 pomaga.
mtone

1
Wydaje się, że to załatwiło sprawę. Ustawiłem go na 3 rdzenie i maksymalizuje przy 75% CPU, pozostawiając mi dużo miejsca na inne rzeczy. Dzięki!
learningAsIGo

27

Zamiast obniżać priorytet, spróbuj zmienić powinowactwo w Menedżerze zadań. Jeśli masz więcej niż 1 procesor, możesz ograniczyć liczbę procesorów używanych przez program Excel. Pozwoli to innym procesorom działać na innych rzeczach.

Kliknij prawym przyciskiem myszy Excel na zakładce Procesy i wybierz Ustaw koligację. Wybierz procesory, w których chcesz uruchomić program Excel.


3
Należy zauważyć, że w przypadku koligacji system Windows uważa również każdy rdzeń za procesor. (Więc to zadziałałoby, jeśli masz podwójny lub czterordzeniowy rdzeń.)
jpmc26

1
Cóż, jeśli mówimy konkretnie o rdzeniach, dlaczego nie wątki HyperThreading? Są to również odrębne logiczne procesory. Czterordzeniowy procesor z HT będzie miał 8 logicznych procesorów.
Ruslan

Robię to cały czas podczas uruchamiania HandBrake i chcę po prostu przeglądać Internet przez godzinę bez wstrzymywania lub zatrzymywania procesu transkodowania. Myślę, że warto wspomnieć, że po pewnym czasie rdzenie wracają do programu, a powinowactwo „resetuje się”, przynajmniej zdarza mi się z hamulcem ręcznym.
MonkeyZeus,

2
@MonkeyZeus Zazwyczaj powinowactwo nie jest zapisywane po zakończeniu procesu. Dotyczy to tylko aktualnie uruchomionego procesu. Może się zdarzyć, że HandBrake sam pojawiał się nowe procesy lub zacząłeś nowe.
jpmc26

@ jpmc26 Dobrze wiedzieć! Zdecydowanie sam nie rozpocząłem nowego procesu, więc musi on sam się odradzać.
MonkeyZeus

7

Możesz spróbować obniżyć priorytet procesu programu Excel, otwierając menedżera zadań, przechodząc do karty „Szczegóły” lub „Procesy” (w zależności od wersji systemu Windows), klikając prawym przyciskiem myszy proces programu excel.exe i wybierając niższy priorytet. To powinno dać więcej czasu procesorowi na inne procesy.


1
Nie wydaje się działać: ustawiłem priorytet na bardzo niski i nadal pozostaje w tyle za komputerem.
learningAsIGo

1
Może spróbuj zwiększyć priorytet swojej przeglądarki internetowej, lub cokolwiek, co próbujesz zrobić jednocześnie? Znalazłem dyskusję na temat skuteczności zmiany priorytetów .
Slithy Toves

3
@SlithyToves: To naprawdę nie powinno mieć znaczenia. Priorytet określa, który program otrzymuje procesor, jeśli jest wielu kandydatów. Ustawienie bardzo niskiego poziomu programu Excel oznacza, że ​​pobiera wycinek procesora tylko wtedy, gdy wszystkie inne programy są gotowe. Jednak, gdy Excel ma dostać kawałek procesora, to nie poddawaj się, że plaster. Po prostu przegra konkurencję o kolejny wycinek czasu procesora.
MSalters

3

Dostępne są funkcje uśpienia i oczekiwania w VBA lub poprzez deklarację. „Nadmiernie uproszczoną zasadą” jest jednak nigdy nie używać funkcji Sleep (). (google „„ nigdy nie używaj funkcji spania () ”)

Strona z dokumentami dotycząca Application.Wait ( https://msdn.microsoft.com/en-us/library/office/ff822851.aspx ). Pamiętaj, że tryb uśpienia i czekania spowoduje, że program Excel przestanie odpowiadać przez określony czas, co może powodować „wraki pociągów” w wycinku czasu.

Jeśli twoje obliczenia obejmują jakąś pętlę, to jednym ze sposobów radzenia sobie z tym do określonego celu (przepadek czasu obliczeniowego dla dostępności procesora) jest utworzenie specjalnej własnej funkcji oczekiwania, która na przykład zapętla DoEvent () na 1 sekundę i następnie wraca.

DoEvents w zasadzie mówi Twojemu kodowi / tłumaczowi, aby poświęcił czas na system operacyjny itp. Z pewnością spowoduje to, że Twój kod zajmie więcej czasu. Może także pozwolić ci edytować arkusz podczas trwania obliczeń, więc twój przebieg może się różnić. Test.

Zobacz na przykład https://stackoverflow.com/questions/469347/is-there-an-equivalent-to-thread-sleep-in-vba



0

Miałem ten sam problem, gdy mój laptop miał 4 GB pamięci. Gdy tylko zaktualizowałem go do 16 GB, problem ustąpił. Kolejne możliwe rozwiązanie.


0

Dodaj następujące 2 wiersze gdzieś na początku makra:

'Turn off screen updating

 Application.ScreenUpdating = False

I te 2 linie pod koniec:

'Turn screen updating back on

 Application.ScreenUpdating = True

Będzie wtedy miał mniej pracy do zrobienia, gdy będziesz robić coś innego.


-2

Jeśli korzystasz z biura 32bi w 64-bitowym systemie operacyjnym, powinieneś użyć tej aplikacji: http://www.ntcore.com/4gb_patch.php

Ta aplikacja umożliwi Excela lub dowolne inne biuro 32-bitowe do korzystania z mo


Pytanie dotyczy ograniczenia procesora, twoja odpowiedź dotyczy aktywacji AWE w aplikacjach, które prawdopodobnie nawet nie skorzystają z AWE.
Martheen Cahya Paulo

-5

Użyj OpenOffice lub LibreOffice: jego moc skryptowa jest znacznie bardziej efektywna niż MS, i możesz dosłownie mieć „przepustnicę” w swoich obliczeniach.

EDYCJA: Dlaczego głosować negatywnie? spójrz na instrukcję i przekonaj się sam. Na przykład możesz przekonwertować swoje obliczenia na Javę i być w porządku z całą dławiącą mocą JVM.


3
Nie głosowałem negatywnie, ale zakładam, że dzieje się tak, ponieważ zaproponowałeś obejście zamiast rozwiązania bardzo bezpośredniego pytania zadanego w OP: „Czy istnieje sposób na ograniczenie dostępu procesora do osiągnięć programu Excel? „
Monkpit

@Monkpit moja historia z OpenOffice zaczęła się od podobnego problemu, przenoszenie zajęło około tygodnia dla wszystkich dokumentów, które mieliśmy, ale potem wydałem opinię, że już nigdy nie użyję MS Office.
Alexey Vesnin

OpenOffice jest znacznie lepszy od pakietu Office, ponieważ 99% ludzi będzie korzystać z pakietu Office zamiast Libre, więc deweloperzy (prawdopodobnie jak ten facet). Dlatego przegłosowałem.
Thomas Shera,

@ThomasShera Cóż, w ogóle nie rozumiem - dlaczego przez tak długie lata faceci Microsoftu nie mogli tak po prostu naprawić ? Nie, nie są potrzebne nowe rzeczy, żadnych dodatków - po prostu
spraw,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.