Limitar o uso da CPU do Excel


31

Existe uma maneira de limitar a quantidade de uso da CPU que o Excel tem acesso ao executar? Eu tenho um script VBA que calcula um monte de fórmulas de matriz gigante. Todo o cálculo leva talvez 20 minutos usando 100% da minha CPU, mas não posso usar minha máquina durante esse período e prefiro executá-la em segundo plano com 50% de uso da CPU, para que eu possa continuar fazendo outras coisas. Alguma sugestão?

Meu sistema operacional é o Windows 7 Enterprise de 64 bits e a versão do Excel é de 2007 a 32 bits.


11
Janelas? Qual versão?
DavidPostill

Windows 7. Vou adicioná-lo ao post
learningAsIGo

8
Obter uma CPU multicore? Se você já possui um (quem não tem?) E o Excel está usando todos os núcleos (o que eu não sabia que o Excel poderia fazer), defina sua afinidade no Gerenciador de tarefas.
precisa saber é o seguinte

2
Isso não responde à pergunta, mas desative as atualizações da janela antes de começar a calcular e atualizar milhares de células. Se você tiver algum gráfico, desative-o também. O VBA é lento, mas quando é realmente lento, geralmente é um ou os dois responsáveis.
Coxy

11
@cat: Não, um uso de 100% da CPU no Windows Task Manager significa 100% em todos os processadores lógicos. Se apenas um núcleo for preenchido, ele será de 25% (em um núcleo duplo comum com hiper rosqueamento) ou ~ 36% (aumento de turbo).
Martheen Cahya Paulo 15/01

Respostas:


54

Se uma função VBA é chamada de várias fórmulas ou se seu script gera ou força o recálculo de várias fórmulas, isso definitivamente deve fazer uso do recurso de cálculo multithread do Excel. Respectivamente, isso pode executar várias instâncias da sua função VBA para cada fórmula ou recalcular várias células simultaneamente enquanto o script vba está sendo executado em um único thread.

Você pode limitar o número de threads usados ​​pelo Excel para recalcular fórmulas na seção Opções do Excel ... Guia Avançado ... Fórmulas.

insira a descrição da imagem aqui


O sub VBA não é o problema, é a fórmula de matriz do Excel que o código VBA gera.
learningAsIGo

@learningAsIGo Certo, simplifiquei minha resposta. Deixe-nos saber se definir o número de threads como 1 ajuda.
Mck

11
Isso parece ter feito o truque. Defino-o para 3 núcleos e atinge no máximo 75% da CPU, deixando-me espaço de sobra para fazer outras coisas. Obrigado!
saber é o seguinte

27

Em vez de diminuir a prioridade, tente alterar a afinidade no Gerenciador de tarefas. Se você tiver mais de 1 CPU, poderá limitar o número de CPUs que o Excel usará. Isso liberará as outras CPUs para trabalhar em outras coisas.

Clique com o botão direito do mouse em Excel na guia Processos e selecione Definir afinidade. Escolha CPU (s) em que deseja executar o Excel.


3
Observe que, por afinidade, o Windows considera cada núcleo também uma CPU. (Então isso iria funcionar se você tem um dual core ou quad.)
jpmc26

11
Bem, se falando especificamente sobre núcleos, por que não os segmentos HyperThreading? Eles também são CPUs lógicas distintas. Ou seja, uma CPU quad-core com HT terá 8 CPUs lógicas.
Ruslan

Faço isso o tempo todo ao executar o HandBrake e só quero navegar na Internet por uma hora sem pausar ou interromper o processo de transcodificação. Eu acho que vale a pena mencionar que depois de algum tempo os núcleos são liberados de volta ao programa e a afinidade "redefine", pelo menos isso acontece comigo com o freio de mão.
precisa saber é o seguinte

2
@MonkeyZeus Normalmente, a afinidade não é salva quando um processo termina. Aplica-se apenas ao processo atualmente em execução. Pode ser que o HandBrake esteja gerando novos processos ou você tenha iniciado novos.
Jpmc26

@ jpmc26 É bom saber! Definitivamente, eu mesmo não iniciei um novo processo, por isso deve gerá-lo por conta própria.
precisa saber é o seguinte

7

Você pode tentar diminuir a prioridade do processo do Excel, localizando a abertura do gerenciador de tarefas, alternando para a guia "Detalhes" ou "Processos" (dependendo da versão do Windows), clicando com o botão direito do mouse no processo do Excel.exe e selecionando um prioridade mais baixa. Isso deve dar mais tempo de CPU para outros processos.


11
Parece não funcionar: defino a prioridade como muito baixa e ainda fica atrasada no computador.
learningAsIGo

11
Talvez tente aumentar a prioridade do seu navegador ou o que você está tentando fazer ao mesmo tempo? Eu encontrei essa discussão sobre a eficácia da mudança de prioridades .
Slithy Toves

3
@ SlithyToves: Isso realmente não deveria importar. Priority determina qual programa obtém a CPU, se houver vários candidatos. Definir o Excel como muito baixo significa que ele só recebe uma fatia da CPU quando todos os outros programas são concluídos. No entanto, quando o Excel faz obter uma fatia CPU, ele não vai desistir dessa fatia. Apenas perderá a competição pelo próximo intervalo de tempo da CPU.
MSalters

3

Existem funções de suspensão e espera disponíveis no VBA ou por meio de uma declaração. No entanto, a "regra geral simplista demais" é nunca usar Sleep (). (google '"nunca use a programação sleep ()"')

Página de documento do Application.Wait ( https://msdn.microsoft.com/en-us/library/office/ff822851.aspx ). Observe que a suspensão e a espera farão com que o Excel não responda pela duração especificada e isso pode causar "naufrágios de trem".

Se o seu cálculo envolve algum tipo de loop, então uma maneira de lidar com isso para seu objetivo específico (perder tempo de cálculo da disponibilidade da CPU) é criar uma função de espera especial que, por exemplo, faz um loop em DoEvents () por 1 segundo e então retorna.

O DoEvents basicamente diz ao seu código / intérprete que dê tempo ao sistema operacional, etc. Isso definitivamente fará com que seu código demore mais. Também pode permitir que você edite a planilha enquanto o cálculo está em andamento, portanto, sua milhagem pode variar. Teste.

Consulte, por exemplo, https://stackoverflow.com/questions/469347/is-there-an-equivalent-to-thread-sleep-in-vba



0

Eu tive o mesmo problema quando meu laptop tinha 4 GB de memória. Assim que eu atualizei para 16 GB, o problema parou. Apenas outra solução possível.


0

Adicione as 2 linhas a seguir em algum lugar próximo ao início da sua macro:

'Turn off screen updating

 Application.ScreenUpdating = False

E estas 2 linhas perto do fim:

'Turn screen updating back on

 Application.ScreenUpdating = True

Terá menos trabalho a fazer enquanto você faz outra coisa.


-2

Se você estiver usando um escritório de 32bi em um sistema operacional de 64 bits, use este aplicativo: http://www.ntcore.com/4gb_patch.php

Este aplicativo permitirá que o Excel ou qualquer outro escritório de 32 bits use mo


A pergunta é sobre limitar a CPU, sua resposta é sobre a ativação do AWE em aplicativos que provavelmente nem tirarão proveito do AWE.
Martheen Cahya Paulo 15/01

-5

Use o OpenOffice ou o LibreOffice: seu poder de script é muito mais eficaz que o MS, e você pode literalmente ter um "acelerador" em seus cálculos.

EDIT: Por que voto negativo? dê uma olhada no manual e veja por si mesmo. Você pode converter seus cálculos em Java e ficar bem com todo o poder de otimização da JVM, por exemplo.


3
Não diminuí a votação, mas presumo que seja porque você propôs uma solução alternativa para a pergunta muito direta feita no OP: "Existe uma maneira de limitar a quantidade de uso de CPU que o Excel tem acesso ao executar? "
precisa saber é o seguinte

@Monkpit minha história com o OpenOffice começou com um problema semelhante, a portação levou aproximadamente uma semana para todos os documentos que tínhamos, mas depois disso eu fiz uma opinião, que nunca mais usarei o MS Office.
Alexey Vesnin

O OpenOffice é profundamente superior ao Office, pelo fato de 99% das pessoas usarem o Office sobre o Libre, então desenvolvedores (provavelmente como esse cara). Foi por isso que eu votei mal.
Thomas Shera

@ThomasShera Bem, eu não consigo entender nada - por que há tantos anos os caras da Microsoft não conseguem consertar as coisas ? Não, não novidades necessário, há complementos - basta fazer o seu produto realmente trabalhando ...
Alexey Vesnin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.