Notifications
Clear all

O clássico problema de compatibilidade 32/64bits - Ajuda com variável "Long"

4 Posts
2 Usuários
0 Reactions
1,463 Visualizações
(@mateusutz)
Posts: 8
Active Member
Topic starter
 

Olá pessoal,

Estou com um projeto aqui que está me dando dor de cabeça... Sou novo na programação VBA (comecei há umas 3 semanas) e no meu primeiro projeto encontrei esse problema da compatibilidade. Fiz ele em 32-bits e quando meu primeiro usuário foi usar em sua máquina apareceram os erros de compatibilidade.

Fiz algumas pesquisas e achei algumas coisas sobre a solução disso. Mas como ainda estou aprendendo, várias das explicações eram confusas ainda pra mim e eu tentei ir pela tentativa e erro. O problema é que tô só no erro ainda...

A ajuda que peço é com duas situações:

1) Uso de variável Long dentro de subs

Eu tentei usar o seguinte código para tentar funcionar nas versões 32/64, mas sem sucesso:

Sub CarregarListBox()

#If VBA7 Then
Dim UltimaLinha As LongPtr
#Else
Dim UltimaLinha As Long
#End If

Dim Linha As Integer
UltimaLinha = Sheets("Corretoras").Range("A200").End(xlUp).Row
For Linha = 2 To UltimaLinha
Corretoras.ListBox1.AddItem Sheets("Corretoras").Range("A" & Linha)
Corretoras.ListBox1.List(Corretoras.ListBox1.ListCount - 1, 1) = Sheets("Corretoras").Range("B" & Linha)
Corretoras.ListBox1.List(Corretoras.ListBox1.ListCount - 1, 2) = Sheets("Corretoras").Range("C" & Linha)
Corretoras.ListBox1.List(Corretoras.ListBox1.ListCount - 1, 3) = Sheets("Corretoras").Range("D" & Linha)
Next
End Sub

Eu pensei que inserindo as condicionais para ver a versão do VBA funcionaria. Mas quando eu executo a sub, acontece o erro de "Tipos incompatíveis" (vide print anexo). Estou escrevendo algo errado?

 

2) Uso de variável Long com ByVal:

E o meu segundo caso-problema é quando tenho a declaração de uma Long como ByVal:

Private Sub Adicionar(ByVal LinhaBox As Long, ByVal Solicitacao As String)

Como faço essa condicional das versões nesse caso?

 

Obrigado pelo força pessoal!

Boa semana à todos.

 
Postado : 21/09/2020 1:10 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Boa tarde, @mateusutz

Vou repetir parcialmente a resposta dada ao colega @cimerio recentemente:

Evite usar os tipos de dados LongPtr e também LongLong para variáveis que não estejam relacionadas a ponteiros e identificadores. Eles foram concebidos apenas para compatibilizar códigos entre as versões 32 e 64 bits e não para uso em variáveis ordinárias, pelo menos até esse momento. Até porque internamente o LongPtr é convertido para Long, portanto não há vantagem em seu uso:

"Note

LongPtr is not a true data type because it transforms to a Long in 32-bit environments, or a LongLong in 64-bit environments. Using LongPtr enables writing portable code that can run in both 32-bit and 64-bit environments. Use LongPtr for pointers and handles."

Fonte: Microsoft Docs - LongPtr Data Type

LongPtr assim como LongLong é pra uso quase exclusivo em compatibilidade de API's do Windows e algumas variáveis de bibliotecas externas, quando exigido, não para variáveis comuns.

Use, de preferência, sempre o tipo Long quando os dados couberem em variáveis Integer ou Long e até mesmo Byte, pois por mais estranho que possa parecer é mais rápido e  há muito tempo foi identificado que internamente esses os dois primeiros tipos acabam sendo transformados, em última análise, em Longs, portanto nem mesmo a economia de espaço em memória justifica. Nas palavras da própria Microsoft:

"...Traditionally, VBA programmers have used integers to hold small numbers, because they required less memory. In recent versions, however, VBA converts all integer values to type Long, even if they're declared as type Integer. So there's no longer a performance advantage to using Integer variables; in fact, Long variables may be slightly faster because VBA does not have to convert them."

Fonte: The Integer Data Types

Portanto, para sua questão 2 também, defina como Long e tudo OK.

 

 
Postado : 21/09/2020 2:55 pm
(@mateusutz)
Posts: 8
Active Member
Topic starter
 

@anderson

Gostaria de iniciar com um "obrigado pela resposta", mas confesso que senti um tom de hostilidade em seus comentários. Tinha para mim que este fórum era receptivo com seus membros e suas dúvidas, não importando o nível destes.

Anexei uma imagem pq ela apresenta exatamente o meu problema. Mostro a sub por completo e ainda qual é a mensagem de erro. O arquivo inteiro, além de ser extenso, não contempla informações cabíveis à questão aqui. Pois, como pode ler no código que coloquei na descrição do tópico, apresento a Sub do início ao fim. Apresenta tudo que é necessário para receber ajuda. 

O erro tem a ver com a compatibilidade sim pq estava funcionando perfeitamente em minha versão 32-bits. Somente quando adicionei a condicional no início da Sub, para definir qual variável Long será utilizada, e abri tentei executar em uma versão 64-bits é que tive problemas. 

Tendo a achar que você sequer se deu ao trabalho de olhar o código que postei. Se o fizesse, teria visto que a variável na recebe nenhuma string, mas sim uma simples contagem de linhas.

Já fiz minhas pesquisas e digo no tópico que não consegue entender de uma forma simples e clara qual seria a solução. E minha intenção de publicar a dúvida no fórum é de conseguir ajuda precisa e especializada de membros com experiência. Se eu realmente quisesse assistir 500 vídeos no Youtube, estaria lá e não aqui.

Enfim, tudo que estou tentando descobrir é como deixar meu código funcionando em qualquer versão do office, seja 32 bits seja 64 bits. Tenho variáveis do tipo Long sendo utilizadas e sei que ela é declarada de forma diferente em cada versão. Só quero saber como fazer esta declaração - e saber na prática, com exemplo de código.

Se não puder me ajudar desta forma, desejo que fique bem e que tenha uma ótima semana!

 
Postado : 21/09/2020 3:43 pm
(@mateusutz)
Posts: 8
Active Member
Topic starter
 

@edsonbr

Muitíssimo obrigado pela elucidação! Pelo que vi na internet, havia entendido que deveria usar "LongPtr" para rodar em 64-bits e "Long" para rodar em 32-bits. 

Vou manter então apenas como "Long" conforme sua instrução. Obrigado!

 
Postado : 21/09/2020 3:47 pm