Programa Excel VBA rodando apenas a 25% da velocidade

Programa Excel VBA rodando apenas a 25% da velocidade

Eu tenho um programa VBA em execução no meu Ultrabook Acer Aspire S3 quad-core. O problema é que ele usa apenas 25% da CPU (os outros processos combinados usam cerca de 1%). O laptop roda Windows 8.0. A edição do Excel é 2013 (32 bits). Apenas 55% da RAM do sistema é usada, com o Excel usando metade dos 55%.

Acho que talvez apenas 25% sejam usados ​​porque apenas um núcleo é usado pelo Excel. No entanto, não tenho nada para apoiar esta teoria. Como faço para acelerar o programa?

Obrigado.

Responder1

Parece que o programa que você está tentando usar é de thread único, o que significa que ele só pode usar um único núcleo, ele não sabe que os outros existem. Realmente não existe uma maneira concreta de acelerar isso, exceto comprar um processador com uma velocidade de clock de núcleo único mais rápida ou usar um programa que suporte multi-threading.

Responder2

Tudo abaixo se aplica ao Excel 2007 e versões anteriores. De acordo comlink@ Ƭᴇcʜιᴇ007 postado nos comentários acima, há algum suporte nativo para multithreading no Excel 2013. Dito isso, o aviso para esquecê-lo, a menos que você seja um programador experiente, ainda se aplica.

Infelizmente, o VBA não oferece suporte a multithreading, portanto seus cálculos do VBA serão limitados a um núcleo do seu processador.

No entanto, existe um método avançado para enganar o VBA para que ele execute vários threads, gerando arquivos VBscript e executando-os simultaneamente. Isso contorna o problema executando seu código fora do processo do Excel e permite que o Windows gerencie os recursos alocados para os diferentes threads.

Dito isto, fazer isso funcionar provavelmente significará repensar completamente a lógica do seu código (ou seja, você terá que descobrir como dividir as tarefas de uma forma que faça sentido para elas serem executadas simultaneamente), o que pode muito bem ser inviável para o seu projeto. Eu nunca implementei isso sozinho, então não posso ajudá-lo mais do que contando o que já disse.

Se você deseja entrar na toca do coelho, aqui está umpostagem interessante no blogisso mostra um exemplo disso sendo feito. Esteja avisado: a menos que você seja um programador experiente, você pode esquecer essa ideia e simplesmente aceitar que o VBA seja executado em um único thread.

Outros recursos no Stack Overflow para os ousados:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668

É claro que existem outras maneiras de otimizar seu código VBA sem usar vários threads. Sem ver seu código, é impossível fazer sugestões pontuais, mas aqui estão alguns dos suspeitos do costume:

  • Carregue dados da sua planilha em uma matriz para processamento mais rápido. As interações com a planilha são um grande gargalo na execução do VBA e podem ser minimizadas trabalhando com arrays.
  • Um problema relacionado é o Excel recalcular a pasta de trabalho após cada alteração feita em uma célula. Isso pode ser evitado configurando Application.Calculation = xlManual. Apenas certifique-se de configurá-lo Application.Calculation = xlAutomaticantes de sair do seu Sub.

Responder3

Como outros disseram, nativamente o VBA não é multithread. Se você quiser acelerar, considere escrever funções definidas pelo usuário (UDF) em outro idioma.

Eu recomendaria ExcelDNA e usando C# ou VB.Net. Eles são muito fáceis de usar se você já sabe escrever C# e pode controlar o multithreading dentro da UDF.

http://exceldna.codeplex.com/

Responder4

Como os outros acima disseram, o threading seria a resposta, mas não é realmente uma solução viável, e a atualização para 64 bits faria uma diferença insignificante. Uma coisa que você poderia tentar fazer é aumentar a prioridade do processo, você pode ver como fazer issoaqui.

É difícil dizer se isso tornará seu script mais rápido ou não, já que pode haver outro gargalo em outro lugar do programa (por exemplo, leitura/gravação de disco), mas pelo menos permitirá que o Windows saiba que é uma prioridade mais alta do que o seu. outros processos.

informação relacionada