Qual a diferença entre .Text, .Value e .Value2
As três principais propriedades de Range nas macros VBA são Range.Text, Range.Value e Range.Value2. todos eles servem um mesmo propósito, pegar o valor contido dentro de uma célula ou intervalo (Range) no Excel. Mas você sabe qual a diferença entre .Text, .Value e .Value2?
Aqui você verá a diferença entre eles, e quando é melhor utilizar um ou outro.
Para que ser o Range.Text
Este serve para obter o valor formatado visualmente de uma célula. Na verdade, .Text obtém o valor da célula e, em seguida, o formata visualmente. O que pode tornar o processo mais lento, já que quanto mais complexa for a formatação visual da célula, mais demorada é a execução do código na macro.
Se você tentar obter o .Text de múltiplas células para uma variável (var = Range(“A1: A10”).Text), você não obtém um resultado em matriz. Em vez disso, se todas as células do intervalo contiverem o mesmo valor formatado da mesma forma, você obtém um único valor formatado, mas se QUALQUER célula tiver valores ou formatos diferentes, você obtém Nulo.
Funcionalidades do Range.Text
- Busca o valor contido em uma célula em forma de texto, exatamente como ele é exibido na tela.
Restrições do Range.Text
- .Text é uma propriedade somente leitura, portanto, você não pode configurá-la diretamente.
- Não é possível obter .Text de um intervalo de células com conteúdos diferentes ao mesmo tempo.
- A principal desvantagem do .Text é que ele lhe dá o valor visualmente formatado, então o valor que você obtém pode ser ##### se o usuário tiver definido um zoom inapropriado ou largura da coluna muito pequeno, ou os números podem ser vistos como algo do tipo 1E + 18.
Para que serve o Range.Value
Certamente o mais conhecido dentre os três, é também a propriedade padrão para Range. Serve para obter o valor subjacente de uma célula, ou seja, leva em consideração a formatação utilizada para identificar o valor da célula que realmente importa.
Por exemplo, caso a célula esteja formatada como uma data ou moeda, o Range.Value converte o valor subjacente em uma data VBA ou variável de moeda antes de passar para a variável VBA usada na declaração de atribuição. Isso pode ser um problema, um vez que a moeda VBA tem apenas quatro casas decimais, o que pode causar uma perda de precisão. Suponha que a célula G4 tenha um valor de 123,456789 formatado como moeda. Então Range(“G4”).Value retornará um valor de 123,4568 em vez do valor real!
Apesar dessa restrição, usar .Value com células formatadas como datas para dentro de uma variável pode ser útil, pois assim é possível usar IsDate() para detectar se a célula realmente contém uma data ou não.
Funcionalidades do Range.Value
- Permite buscar o valor contido em uma célula levando em consideração a formatação utilizada na célula.
- Permite escrever e ler o .Value de várias células ao mesmo tempo.
Restrições do Range.Value
- Pode causar perda de precisão dependendo da formatação utilizada.
Para que serve o Range.Value2
Funciona de maneira semelhante ao .Value porém não faz nenhuma verificação de formatação.
Por não fazer nenhuma verificação e conversão de formatação, .Value2 se mostra mais rápido que as demais alternativas e também não oferece o risco de perda de precisão nos números.
Funcionalidades do Range.Value2
- Permite buscar o valor contido em uma célula como ele é, sem restrições ou ajustes.
- Permite escrever e ler o .Value2 de várias células ao mesmo tempo.
Restrições do Range.Value2
- Como não checa a formatação pode causar um trabalho maior ao usuário, caso precise que a formatação seja levada em consideração.
Comparativo de Performance .Text .Value e .Value2
Caso você apenas queira copiar o valor de uma célula para uma variável, ou para outra célula, confira abaixo qual destes métodos é mais eficiente em termos de velocidade.
Utilizei a seguinte macro para executar os teste:
Sub Teste() Dim Tempo As Double Dim x As Long Dim Var As Variant For i = 1 To 5 Tempo = Timer For x = 1 To 50000 Var = Range("A" & x).Value2 Next x Range("D" & i + 1).Value2 = Round(Timer - Tempo, 4) x = 1 Next i End Sub
Onde haviam números aleatórios nas célula A1:A50000 e cada um deles era atribuído a uma variável chamada Var. Cinco testes iguais foram executados para avaliar a média de tempo. O único trecho alterado no código, para cada um dos testes, era a linha:
Var = Range("A" & x).Value2
Que também foi utilizada como:
Var = Range("A" & x).Text
e
Var = Range("A" & x).Value
O resultado você confere na tabela abaixo.
Teste nº | .Text | .Value | .Value2 |
1 | 0,8594 | 0,3984 | 0,3750 |
2 | 0,8281 | 0,3906 | 0,3828 |
3 | 0,8438 | 0,3984 | 0,3672 |
4 | 0,8281 | 0,3828 | 0,3750 |
5 | 0,8438 | 0,3906 | 0,3750 |
Média | 0,8406 | 0,3922 | 0,3750 |
Neste teste fica claro o óbvio, utilizar o .Value2 é a forma mais eficiente em termos de performance, já que não passa por nenhuma avaliação de formatação da célula, embora seja muito parecido com utilizar apenas .Value, mas com a vantagem de não se correr o risco de perda de precisão.