Não estou pedindo ajuda com nenhum script, mas minha pergunta é para esclarecimento. Ultimamente, tenho feito muitos scripts VB no Excel, então estou realmente me referindo ao Excel nesta questão. Qual é a diferença entre .text, .value e .value2? Como quando devo usar target.text, target.value e target.value2? Eu nunca usei a opção value2, mas ainda gostaria de saber para que ela é usada.
Às vezes, se eu uso .text, ocorre um erro e preciso usar .value quando estou apenas verificando ou manipulando o texto em uma célula. Às vezes, quando penso que devo usar .value, recebo um erro e preciso usar .text. Geralmente, ele aceita ou não um problema, mas às vezes faz diferença. Eu sei que tem que haver alguma lógica nisso, mas não consigo entender.
Também descobri que, se você o deixar como destino sem especificar .text ou .value, ele funcionará inicialmente, mas algo que alguém fará eventualmente causará um erro no script, por isso é sempre melhor usar algo. . Acho que o que estou perguntando é se alguém pode me dar algum tipo de orientação, regra geral, sobre como usar adequadamente cada um e quando ele precisa ser usado.
Obrigado pela explicação pessoal. Eu meio que entendo melhor. Ambas são boas explicações. Abaixo está um pequeno exemplo de alguns dos meus códigos que funcionam. Eu pensei que deveria ser target.text, mas seria um erro quando eu usei target.value funcionou.
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
Ainda estou um pouco confuso porque, quando penso em valor ou valor2, especialmente depois das respostas que você forneceu, acho que elas devem ser usadas apenas para números. No entanto, no meu exemplo, estou falando estritamente de texto, que é muito do que meu script se refere (texto nas células, mais do que números).
Respostas:
.Text
fornece uma sequência que representa o que é exibido na tela da célula. Usar .Text geralmente é uma má ideia, pois você pode obter ####.Value2
fornece o valor subjacente da célula (pode estar vazio, sequência, erro, número (duplo) ou booleano).Value
fornece o mesmo que .Value2, exceto se a célula foi formatada como moeda ou data, fornece uma moeda VBA (que pode truncar casas decimais) ou uma data VBA.Usar .Value ou .Text geralmente é uma má ideia, porque você pode não obter o valor real da célula e é mais lento que .Value2
Para uma discussão mais extensa, veja meu Texto x Valor x Valor2
fonte
Date
aDouble
(usando.Value2
) quando o que você precisa é umDate
. Não deve.Value
ser preferido.Value2
quando você procura umDate
valor? O artigo vinculado também não deixa isso muito claro. Desempenho porque não há conversão? Claro, mas se o seu código VBA estiver trabalhando com aDate
, você perderá essa vantagem realizando a conversão, de forma implícita ou explícita ... (contexto - sinta-se à vontade paraFormat$(Range.Value2, Range.NumberFormat)
.Exceto o formulário de primeira resposta Bathsheba, exceto as informações do MSDN para:
.Value
.Value2
.Text
você pode analisar essas tabelas para entender melhor as diferenças entre as propriedades analisadas.
fonte
.Value
como propriedade padrão o tempo todo - para texto e números. Use.Value2
quando pensar em data e alguns números. E use.Text
sempre se precisar manter a formatação de qualquer coisa que tenha na célula / intervalo. Portanto, seu exemplo de pergunta, se correto!target.Value
vai te dar umVariant
tipotarget.Value2
também lhe dará umVariant
tipo, mas umDate
é coagido a umDouble
target.Text
tenta coagir a umString
e falhará se o subjacenteVariant
não for coercível a umString
tipoA coisa mais segura a fazer é algo como
E verifique o tipo da variante usando
VBA.VarType(v)
antes de tentar uma coerção explícita.fonte
Em relação às convenções em C #. Digamos que você esteja lendo uma célula que contenha uma data, por exemplo, 22/10/2014.
Ao usar:
.Text
, você obterá a representação formatada da data, conforme visto na pasta de trabalho na tela:22/10/2014 . O tipo desta propriedade é sempre,
string
mas nem sempre pode retornar um resultado satisfatório..Value
, o compilador tenta converter a data em umDateTime
objeto: {2014-10-22 00:00:00} Provavelmente só é útil ao ler datas..Value2
, fornece o valor real subjacente da célula. No caso de datas, é uma série de datas: 41934 . Esta propriedade pode ter um tipo diferente, dependendo do conteúdo da célula. Para os folhetins de data, o tipo édouble
.Portanto, você pode recuperar e armazenar o valor de uma célula em qualquer um deles
dynamic
,var
ouobject
observe que o valor sempre terá algum tipo de tipo inato no qual você terá que agir.fonte
.Text é o valor exibido da célula formatada; .Value é o valor da célula possivelmente aumentado com indicadores de data ou moeda; .Value2 é o valor subjacente bruto retirado de qualquer informação estranha.
Se você estiver processando o valor da célula, a leitura do .Value2 bruto é marginalmente mais rápida que .Value ou .Text. Se você estiver localizando erros, o .Text retornará algo como
#N/A
texto e poderá ser comparado a uma string, enquanto .Value e .Value2 serão bloqueados comparando o valor retornado a uma string. Se você tiver alguma formatação de célula personalizada aplicada aos seus dados, o .Text pode ser a melhor opção ao criar um relatório.fonte
Por curiosidade, eu queria ver como é o
Value
desempenhoValue2
. Após cerca de 12 tentativas de processos semelhantes, não pude ver nenhuma diferença significativa na velocidade, portanto sempre recomendo o usoValue
. Usei o código abaixo para executar alguns testes com vários intervalos.Se alguém vir algo contrário em relação ao desempenho, poste.
fonte