No estoy pidiendo ayuda con ningún script, pero mi pregunta es para aclarar. Últimamente he estado haciendo muchas secuencias de comandos VB en Excel, por lo que realmente me estoy refiriendo a Excel en esta pregunta. ¿Cuál es la diferencia entre .text, .value y .value2? ¿Como cuando debo usar target.text, target.value y target.value2? Nunca utilicé la opción value2 pero todavía me gustaría saber para qué se utiliza.
A veces, si uso .text me da un error y necesito usar .value cuando solo estoy revisando o manipulando el texto dentro de una celda. Luego, a veces, cuando creo que debería usar .value, recibo un error y necesito usar .text. Por lo general, acepta cualquiera o sin un problema, pero a veces hace la diferencia. Sé que tiene que haber algo de lógica en esto, pero parece que no puedo entenderlo.
También descubrí que si lo dejas como objetivo sin especificar .text o .value, funcionará inicialmente, pero algo que alguien haga eventualmente causará un error en el script, por lo que siempre es mejor usar un .something en él . Supongo que lo que estoy preguntando es si alguien puede darme algún tipo de guía, regla general, sobre cómo usar cada una de manera adecuada y cuándo debe usarse.
Gracias por la explicación chicos. De alguna manera lo entiendo mejor. Ambas son buenas explicaciones. A continuación se muestra un pequeño ejemplo de algunos de mis códigos que sí funcionan. Pensé que debería ser target.text, pero sería un error, así que cuando usé target.value funcionó.
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
Todavía estoy un poco confundido porque cuando pienso en el valor o valor2, especialmente después de las respuestas que proporcionó, creo que solo deberían usarse para los números. Sin embargo, en mi ejemplo estoy hablando estrictamente de texto, que es mucho de lo que se refiere mi script (texto en las celdas, más que números).
Respuestas:
.Text
le proporciona una cadena que representa lo que se muestra en la pantalla para la celda. Usar .Text suele ser una mala idea porque podría obtener ####.Value2
le da el valor subyacente de la celda (podría estar vacío, cadena, error, número (doble) o booleano).Value
le da lo mismo que .Value2, excepto si la celda fue formateada como moneda o fecha, le da una moneda VBA (que puede truncar lugares decimales) o una fecha VBA.Usar .Value o .Text suele ser una mala idea porque es posible que no obtenga el valor real de la celda, y son más lentos que .Value2
Para una discusión más extensa vea mi Texto vs Valor vs Valor2
fuente
Date
a un aDouble
(usar.Value2
) cuando lo que necesitas es unDate
. ¿No.Value
debería preferirse a.Value2
cuando se busca unDate
valor? El artículo vinculado tampoco lo deja muy claro. Rendimiento porque no hay conversión? Claro, pero si su código VBA funciona con aDate
, perderá esa ventaja al realizar la conversión usted mismo, implícita o explícitamente ... (contexto: siéntase libre de peso)Format$(Range.Value2, Range.NumberFormat)
.Excepto el primer formulario de respuesta de Bathsheba, excepto la información de MSDN para:
.Value
.Value2
.Text
podría analizar estas tablas para comprender mejor las diferencias entre las propiedades analizadas.
fuente
.Value
como propiedad estándar todo el tiempo para texto y números. Úselo.Value2
cuando piense en la fecha y algunos números. Y use.Text
siempre si necesita mantener el formato de cualquier cosa que tenga en la celda / rango. ¡Entonces, su ejemplo de pregunta si es correcto!target.Value
te dará unVariant
tipotarget.Value2
le dará unVariant
tipo también, pero aDate
se coacciona a unDouble
target.Text
intenta coaccionar a ayString
fallará si el subyacenteVariant
no es coercable a unString
tipoLo más seguro es hacer algo como
Y verifique el tipo de la variante usando
VBA.VarType(v)
antes de intentar una coerción explícita.fuente
En cuanto a las convenciones en C #. Digamos que está leyendo una celda que contiene una fecha, por ejemplo, 2014-10-22.
Cuando usas:
.Text
, obtendrá la representación formateada de la fecha, como se ve en el libro de trabajo en pantalla:2014-10-22 . El tipo de esta propiedad es siempre
string
pero no siempre puede devolver un resultado satisfactorio..Value
, el compilador intenta convertir la fecha en unDateTime
objeto: {2014-10-22 00:00:00} Lo más probable es que solo sea útil al leer fechas..Value2
, le proporciona el valor real subyacente de la celda. En el caso de las fechas, es una serie de fechas: 41934 . Esta propiedad puede tener un tipo diferente según el contenido de la celda. Sin embargo, para las series de fechas, el tipo esdouble
.Para que pueda recuperar y almacenar el valor de una celda en cualquiera
dynamic
,var
oobject
pero tenga en cuenta que el valor siempre tendrá algún tipo de tipo natural que tendrá que actuar en consecuencia.fuente
.Text es el valor mostrado de la celda formateada; .Value es el valor de la celda posiblemente aumentada con indicadores de fecha o moneda; .Value2 es el valor subyacente bruto despojado de cualquier información extraña.
Si está procesando el valor de la celda, entonces leer el .Value2 sin procesar es marginalmente más rápido que .Value o .Text. Si está localizando errores, .Text devolverá algo así
#N/A
como texto y se puede comparar con una cadena, mientras que .Value y .Value2 se ahogarán al comparar su valor devuelto con una cadena. Si tiene algún formato de celda personalizado aplicado a sus datos, entonces .Texto puede ser la mejor opción al crear un informe.fuente
Por curiosidad, quería ver cómo se
Value
comportaba en contraValue2
. Después de aproximadamente 12 pruebas de procesos similares, no pude ver diferencias significativas en la velocidad, por lo que siempre recomendaría usarValue
. Usé el siguiente código para ejecutar algunas pruebas con varios rangos.Si alguien ve algo contrario al rendimiento, publíquelo.
fuente