atualizado para o Windows 10 - Macros quebradas

3

Problema:

Eu finalmente atualizei para o Windows 10 e algumas macros no Excel 2010 que eu uso com freqüência não funcionam mais. Eles param instantaneamente quando eu os executo e tudo que recebo é um " erro de automação ". Eles não fazem referência a nenhum programa / arquivo externo; apenas muita cópia / colagem e classificação dentro de algumas folhas. As macros parecem rodar nos computadores de outras pessoas (no Windows 10) como costumavam fazer.

Coisas que já fiz:

  • reinicialização obrigatória
  • Reparo do excel
  • reinstale o excel
  • mexer com permissões de macro
  • use cópias da pasta de trabalho que funcionam em outros computadores
  • As coisas estranhas: se eu criar uma nova macro, habilitar a pasta de trabalho e copiar e colar em minhas macros antigas + o conteúdo da pasta de trabalho e tentar executar as macros, elas funcionarão. Assim que eu sair e reabrir, as macros param de funcionar. Isso vale para as macros de teste realmente simples que eu tentei fazer. Uma macro que copia uma carta de uma célula para outra falha depois que a pasta de trabalho salva é fechada e reaberta.

Eu sinto que estou esquecendo algumas coisas que testei, mas isso deve cobrir a maior parte.

    
por KernelSanders______ 22.05.2016 / 21:51

1 resposta

0

Como você não está respondendo aos comentários por mais tempo, só posso supor que com a atualização do sistema operacional, você também atualizou de 32 bits para 64 bits.

Se você está declarando chamadas de API, você precisará torná-las PtrSafe .

Por exemplo, considere a seguinte chamada de DLL:

Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
    ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

Qualquer ponteiro de endereço de memória e identificadores de janela precisam ser definidos como LongPtr , porque o modo como o SO de 64 bits gerencia sua memória. O tipo de retorno para a função acima é aceitável para manter como Long , porque não está endereçando a memória ou um identificador.

Depois de fazer seu ponteiro de memória e janela manipular conversões, você precisa informar ao Excel que é "seguro" usar declarando sua função como PtrSafe (Pense em "ponteiro seguro" para os ponteiros de memória):

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" ( _
    ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

Take notice of the three changes made in our declaration:

Declare Function changed to Declare PtrSafe Function

     

(Isso informa ao Excel que todos os ponteiros foram alterados e que a função é segura de usar)

     

ByVal Key As Long changed to ByVal Key As LongPtr

     

e finalmente

     

ByVal NewKey As Long changed to ByVal NewKey As LongPtr

Então agora a questão permanece. E se eu quisesse distribuir isso para diferentes arquiteturas do sistema operacional?

Você está com sorte, pois o VBA permite utilizar uma instrução If...Then especial para suas declarações de módulo. Então, para o código acima, você pode distribuir para 32 & SO de 64 bits com a seguinte declaração:

#If VBA7 Then '64-bit Office
    Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" ( _
        ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
#Else
    Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
        ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
#End If
    
por 14.02.2018 / 23:33