sexta-feira, 27 de janeiro de 2017

VBA no Office 64 bits

Nunca tive a oportunidade de testar por não usar o Office 64 bits.
Segue o texto com o link para o site original, vou deixar aqui porque no site da Microsoft, os artigos costumam sumir....

https://msdn.microsoft.com/PT-BR/library/office/gg264421.aspx


Visão geral do Visual Basic for Applications de 64 bits

Office 2013 and later
O Microsoft Visual Basic for Applications (VBA) é a versão do Visual Basic fornecida com o Microsoft Office. O VBA do Microsoft Office 2010 inclui recursos de linguagem que permitem que o código do VBA funcione corretamente em ambientes de 32 bits e 64 bits.
Observação Observação
Por padrão, o Office 2010 instala a versão de 32 bits. Você deve escolher explicitamente instalar a versão de 64 bits durante a instalação.
Erros
Observação Observação
Você precisa modificar o código VBA somente se ele for executado na versão de 64 bits do Microsoft Office.
O problema com a execução do código herdado do VBA no Office de 64 bits ocorre porque a tentativa de carregar 64 bits em um tipo de dados de 32 bits trunca a quantidade de 64 bits. Isso pode resultar em saturações de memória, resultados inesperados no seu código e possíveis falhas no aplicativo.
Para resolver esse problema e ativar o código do VBA para que ele funcione corretamente em ambientes de 32 e 64 bits, foram adicionados vários recursos de linguagem ao VBA. A tabela na parte inferior deste documento resume os novos recursos de linguagem do VBA. Três adições importantes são o alias do tipo LongPtr, o tipo de dados LongLong e a palavra-chave PtrSafe.
  • LongPtr - o VBA agora inclui um alias de tipo variável: LongPtr. O tipo de dados real que LongPtr resolve depende da versão do Office que está sendo executada no: o LongPtr resolve o Long em versões do Office de 32 bits e LongPtr resolve o LongLong na versão de 64 bits do Office. Use LongPtr para ponteiros e identificadores.
  • LongLong – o tipo de dados LongLong é um inteiro de 64 bits com sinal disponível somente em versões de 64 bits do Office. Use LongLong para integrais de 64 bits. Funções de conversão devem ser usadas para atribuir o LongLong explicitamente (incluindo LongPtr em plataformas de 64 bits) para tipos de integral menores. As conversões implícitas de LongLong em integrais menores não é permitido.
  • PtrSafe – a palavra-chave PtrSafe assegura que uma instrução Declare possa ser executada com segurança na versão de 64 bits do Office.
Todas as Instruções Declare agora devem incluir a palavra-chave PtrSafe para executar versões de 64 bits do Office. É importante esclarecer que a simples adição da palavra-chave PtrSafe a uma instrução Declare significa apenas que a instrução Declare é destinada explicitamente à versão de 64 bits, todos os tipos de dados dentro da declaração que precisam armazenar 64-bits (incluindo parâmetros e valores de retorno) ainda devem ser modificados para armazenar quantidades de 64 bits.
Observação Observação
As instruções Declare com a palavra-chave PtrSafe é a sintaxe recomendada. As instruções Declare que incluem PtrSafe funcionam corretamente no ambiente de desenvolvimento do VBA7 em ambas as plataformas, de 32 e 64 bits. Para garantir a compatibilidade com versões anteriores no VBA7, use o construto a seguir:
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf
Observe os seguintes exemplos de instrução Declare. Executar uma instrução Declare em versões doe 64 bits do Office resultará em um erro indicando que a instrução Declare não inclui o qualificador PtrSafe. O exemplo do VBA modificado contém um qualificador PtrSafe, mas observe que o valor retornado (um ponteiro para a janela ativa) retorna um tipo de dados Long. Na versão de 64 bits do Office, esse cenário está incorreto porque o ponteiro precisa ser de 64 bits. O qualificador PtrSafe informa ao compilador que a instrução Declare está direcionando a versão de 64 bits para que a instrução seja executada sem erro. Entretanto, como o valor retornado não foi atualizado para um tipo de dados de 64 bits, este será truncado, resultando em um valor retornado incorreto.
Exemplo de instrução Declare de VBA herdado não modificada:
Declare Function GetActiveWindow Lib "user32" () As Long
Exemplo de instrução Declare do VBA modificada para incluir o qualificador PtrSafe ainda usando o valor retornado de 32 bits:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long
Relembrando: a instrução Declare deve ser modificada para incluir o qualificador PtrSafe e quaisquer variáveis dentro da instrução que precisem armazenar quantidades de 64 bits devem ser atualizadas para que as variáveis usem tipos de dados de 64 bits.
Exemplo d instrução Declaredo VBA modificada para incluir a palavra-chave PtrSafe e atualizada para usar o tipo de dado de 64 bits (LongPtr) adequado:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Em resumo, para que o código funcione em versões de 64 bits do Office, é necessário localizar e modificar todas as instruções Declare existentes para que elas usem o qualificador PtrSafe. Também é necessário localizar e modificar todos os tipos de dados dentro dessas instruções Declare que referenciam ponteiros e identificadores para que elas usem novos alias de tipo LongPtr compatíveis com a versão de 64 bits e tipos que precisam armazenar integrais de 64 bits com o novo tipo de dados LongLong. Além disso, é preciso atualizar todos os tipos definidos pelo usuário (UDTs) que contenham ponteiros ou identificadores e integrais de 64 bits para que eles usem tipos de dados de 64 bits e verifiquem todas as atribuições de variável corretas para evitar a ocorrência de erros de incompatibilidade de tipo.

Escrevendo o código que funciona no Office de 32 bits e de 64 bits

Para escrever um código que possa portar as versões de 32 e 64 bits do Office, você só precisa usar o novo alias de tipo LongPtr em vez de Long ou LongLong para todos os ponteiros e valores de identificador. O alias de tipo LongPtr resolverá o tipo de dados Long ou LongLong correto de acordo com a versão do Office que está sendo executada. Observe que, se você precisar de uma lógica diferente para a execução, por exemplo, para manipular valores de 64 bits em grandes projetos do Microsoft Excel, você pode usar a constante de compilação condicional Win64 conforme mostrado na seção a seguir.

Escrevendo o código que funciona no Microsoft Office 2010 (32-bit ou 64-bit) e versões anteriores do Office

Para escrever um código que funcione em versões novas e antigas do Office, você pode usar uma combinação das novas Constantes de Compilação condicional do VBA7 e Win64. A constante de compilação condicional do VBA7 é usada para determinar se o código está sendo executado na versão 7 do Editor do VB (versão do VBA fornecida com o Office 2010). A constante de compilação condicional do Win64 é usada para determinar que versão do Office (de 32 ou 64 bits) está sendo executada.
#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

Resumo das atualizações de linguagem do VBA7

A tabela a seguir resume as novas adições de linguagem do VBA e fornece uma explicação sobre cada uma delas:
Nome
Tipo
Descrição
Palavra-chave
Garante que a instrução Declare seja direcionada para sistemas de 64 bits. Necessário para versões de 64 bits.
Tipo de dados
Alias de tipo que mapeia o Long em sistemas de 32 bits, ou o LongLong em sistemas de 64 bits.
Tipo de dados
Tipo de dados de 8 bytes que está disponível somente em sistemas de 64 bits. Tipo numérico. Números inteiros no intervalo de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. O LongLong é um tipo declarado válido somente em plataformas de 64 bits. Além disso, o LongLong não pode ser convertido implicitamente em um tipo menor (por exemplo, não é possível atribuir um tipo de dados LongLong a um do tipo Long.). Isso é feito para evitar que haja truncamento de ponteiro inadvertidamente. Coerções explícitas são permitidas, portanto, no exemplo acima, é possível aplicar um CLng a um LongLong e atribuir o resultado a um Long. (Válido somente em plataformas de 64 bits.)
^
Caractere de declaração de tipo LongLong
Declara um valor literal explicitamente como um LongLong. Necessário para declarar um literal de LongLong maior que o valor de Long máximo (do contrário, ele será convertido implicitamente em double).
função de conversão de tipo
Converte uma expressão simples em um LongPtr.
função de conversão de tipo
Converte uma expressão simples em um tipo de dados LongLong. (Válido somente em plataformas de 64 bits.)
constante VarType
constante VarType
instrução DefType
Define o tipo de dados padrão para uma gama de variáveis como LongPtr.
instrução DefType
Define o tipo de dados padrão para uma gama de variáveis como LongLong.

Nenhum comentário:

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.