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

Microsoft Visual Basic for Applications (VBA) é a versão do Visual Basic fornecido com o Microsoft Office. No Microsoft Office 2010, o VBA inclui os recursos do idioma que permitem o código VBA para funcionar corretamente em ambientes de 32 bits e 64 bits.

Observação

Por padrão, o Office 2010, 2013 e 2016 instalam a versão de 32 bits. Você deve escolher explicitamente instalar a versão de 64 bits durante a instalação. A partir do Office 2019 e do Microsoft 365, o padrão é a versão 64 bits.

A execução de código VBA que foi elaborado para a versão do Office 2010 (versão VBA anterior e 6) em uma plataforma de 64 bits pode resultar em erros, caso não seja modificado o código para executar em versões de 64 bits do Office. Os erros resultarão porque a versão anterior e 6 do VBA implicitamente visa plataformas de 32 bits e normalmente contém instruções Declare que ligam para a API do Windows usando tipos de dados de 32 bits para ponteiros e identificadores. Como a versão anterior e 6 do VBA não tem um tipo de dados específicos para ponteiros ou identificadores, ele usa o tipos de dados Long, que é um tipo de dados de 4 bytes de 32 bits, para ponteiros e as indicadores de referência. Ponteiros e identificadores em ambientes de 64 bits são 8 bytes quantidades de 64 bits. Essas quantidades de 64 bits não podem ser realizadas em tipos de dados de 32 bits.

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 de código VBA herdado do Office de 64 bits é a que tentando carregar 64 bits em um tipo de dados de 32 bits trunca a quantidade de 64 bits. Isso pode resultar em limites memória, resultados inesperados no seu código e falha de aplicativos.

Para resolver esse problema e habilitar o código VBA para funcionar corretamente em ambientes de 32 bits e 64 bits, vários recursos do idioma foram adicionados ao VBA. A tabela no final deste documento resume os novos recursos de idioma do VBA. Três adições importantes são a LongPtr alias tipo, o LongLong tipo de dados e o PtrSafe palavra-chave.

  • LongPtr. VBA agora vem com o alias variável do tipo LongPtr. Tipo de dados reais LongPtr resolve depende da versão do Office que está sendo executado em; LongPtr gera Long em versões de 32 bits do Office, e LongPtr gerar LongLong em versões de 64 bits do Office. Use LongPtr para ponteiros e as identificadores.

  • LongLong. As LongLong tipo de dados é um inteiro de 64 bits ue só está disponível em versões de 64 bits do Office. Use LongLong para integrais 64 bits. Funções de conversão que devem ser usadas para atribuir explicitamente LongLong (incluindo LongPtr em plataformas de 64 bits) em tipos integrais menores. Conversões de LongLong para integrais menores não são permitidas.

  • PtrSafe. A PtrSafe palavra-chave assegura que uma instrução Declare possa ser executada com segurança na versão de 64 bits do Office.

Importante

Ao executar nas versões de 64 bits do Office, as instruções Declare devem incluir a palavra-chave PtrSafe. É importante entender que simplesmente adicionar a palavra-chave PtrSafe a uma instrução Declare significa apenas que a instrução Declare visa explicitamente 64 bits. Todos os tipos de dados dentro da declaração de que precisa armazenar 64 bits (incluindo parâmetros e valores de retorno) ainda devem ser modificados para armazenar quantidades de 64 bits.

Observação

Instruções Declare com a palavra-chave PtrSafe é a sintaxe recomendada. Declarar instruções que incluem PtrSafe funcionam corretamente no ambiente de desenvolvimento VBA7 em plataformas de 32 bits e 64 bits.

Para garantir a compatibilidade com o VBA7 e anteriores, use a seguinte construção:

 #If VBA7 Then 
 Declare PtrSafe Sub... 
 #Else 
 Declare Sub... 
 #EndIf

Considere o seguinte exemplos de instrução Declare. Executando o não modificada Declare declaração no que versões de 64 bits do Office pode causar um erro indicando que o Declare política não inclui o PtrSafe qualificador. O exemplo VBA modificado contém a PtrSafe qualificador mas observe que o valor de retorno (um ponteiro para a janela ativa) retorna um Long tipo de dados. No Office de 64 bits, isso está incorreto porque o ponteiro deve estar 64 bits. As PtrSafe qualificador informa ao compilador a instrução Declare está buscando 64 bits para a declaração executar sem o erro. Mas como o valor de retorno não foi atualizado para um tipo de dados de 64 bits, está truncado e o valor de retorno, resultando em um valor incorreto retornado.

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 de 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 o código funcionar em versões de 64 bits do Office, você precisa localizar e modificar os existentes todos os Declare instruções para usar o PtrSafe qualificador. Também precisa localizar e modificar todos os tipos de dados em esses Declare instruções que fazem referência identificadores ou ponteiros para usar o novo compatíveis com 64 bits LongPtr alias tipo e tipos de que precisam pressionar 64 - bits integrais com as novas LongLong tipo de dados. Além disso, você deve atualizar os tipos definidos de usuários (UDTs) com sugestões ou identificadores e 64 bits integrais usarem tipos de dados de 64 bits e verifique se todas as variáveis tarefas estão corretas evitar erros de incompatibilidade de tipo.

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

Para escrever código que pode comportar entre versões de 32 bits e 64 bits do Office, você só precisa usar o novo LongPtr alias tipo em vez de Long ou LongLong para todas as sugestões e valores identificadores. O tipo alias LongPtr resolverá o correto tipo de dado Long ou LongLong dependendo de qual versão do Office estiver executando.

Observe que se precisar de uma lógica diferente para executar, por exemplo, é necessário manipular os valores de 64 bits em grandes projetos do Excel, você pode usar o Win64 constante compilação condicional 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 o código que funcione tanto em versões novas quanto em versões mais antigas do Office, você pode usar uma combinação das novas VBA7 e condicional Win64 para constantes compiladores. As Vba7 constante de compilação condicional são usadas para determinar se o código está executando a versão 7 do editor do VB (a versão VBA que acompanha o Office 2010). As Win64 constante de compilação condicional são usadas para determinar qual versão (32 bits ou 64 bits) do Office está em execução.

#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
PtrSafe Palavra-chave Garante que a instrução Declarar seja direcionada para sistemas de 64 bits. Obrigatório em 64 bits.
LongPtr Tipo de dados Alias de tipo que mapeia o Long em sistemas de 32 bits, ou o LongLong em sistemas de 64 bits.
LongLong Tipo de dados tipo de dados de 8 bytes só está disponível 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.

LongLong é um tipo declarado válido apenas em plataformas de 64 bits. Além disso, LongLong não podem ser convertidas implicitamente para um tipo menor (por exemplo, você não pode atribuir um LongLong para uma Long). Isso é feito para evitar truncamento nos ponteiro inadvertidos.

Permissão explícitas coercivas são permitidas, para que no exemplo anterior, você pudesse aplicar CLng para um LongLong e atribuir resultado para um Long (é válida somente plataformas de 64 bits).
^ Caractere de declaração de tipo LongLong Declara explicitamente um valor literal como um LongLong. Necessário para declarar um LongLong literal maior que o valor de Long (do contrário, ele será convertido implicitamente em duplo).
CLngPtr função de conversão de tipo Converte uma expressão simples em um LongPtr.
CLngLng 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.)
vbLongLong constante VarType LongLong inteiro (é válido somente plataformas de 64 bits).
DefLngPtr instrução DefType Define o tipo de dados padrão para uma gama de variáveis como LongPtr.
DefLngLng instrução DefType Define o tipo de dados padrão para uma gama de variáveis como LongLong.

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.