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.
windows-7
worksheet-function
microsoft-excel-2007
vba
learningAsIGo
fonte
fonte
Respostas:
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.
fonte
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.
fonte
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.
fonte
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
fonte
Alguns anos atrás, uma pergunta semelhante foi feita com uma solução: Existem soluções que podem limitar o uso da CPU de um processo?
O Process Tamer funciona para Windows 7. http://www.donationcoder.com/Software/Mouser/proctamer/
fonte
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.
fonte
Adicione as 2 linhas a seguir em algum lugar próximo ao início da sua macro:
E estas 2 linhas perto do fim:
Terá menos trabalho a fazer enquanto você faz outra coisa.
fonte
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
fonte
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.
fonte