excel excel-vba

excel - ¿Cuál es la diferencia entre.text,.value y.value2?



cells.value vba (4)

En cuanto a las convenciones en C #. Digamos que estás 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 siempre es una string pero es posible que no siempre arroje un resultado satisfactorio.

.Value , el compilador intenta convertir la fecha en un objeto DateTime : {2014-10-22 00:00:00} Lo más probable es que solo sea útil al leer las fechas.

.Value2 , te da el valor subyacente real de la celda. En el caso de las fechas, es una fecha de serie: 41934 . Esta propiedad puede tener un tipo diferente según el contenido de la celda. Sin embargo, para los seriales de fecha, el tipo es double .

De modo que puede recuperar y almacenar el valor de una celda en dynamic , var u object pero tenga en cuenta que el valor siempre tendrá algún tipo de tipo innato sobre el que tendrá que actuar.

dynamic x = ws.get_Range("A1").Value2; object y = ws.get_Range("A1").Value2; var z = ws.get_Range("A1").Value2; double d = ws.get_Range("A1").Value2; // Value of a serial is always a double

No pido ayuda con ningún script, pero mi pregunta es para aclararme. Últimamente he estado haciendo muchas secuencias de comandos VB en Excel, así que realmente me refiero a Excel en esta pregunta. ¿Cuál es la diferencia entre .text, .value y .value2? ¿Cuándo debería usar target.text, target.value y target.value2? Nunca utilicé la opción value2 pero aún me gustaría saber para qué se usa.

Algunas veces, si uso .text, me da un error y necesito usar .value cuando solo estoy revisando o manipulando el texto dentro de una celda. Entonces, a veces, cuando creo que debería usar .value me sale un error y necesito usar .text. Por lo general, acepta cualquiera o sin un problema, pero a veces hace una diferencia. Sé que tiene que haber algo de lógica en esto, pero parece que no puedo resolverlo.

También descubrí que si solo lo deja como objetivo sin especificar .text o .value, inicialmente funcionará, pero algo que alguien haga finalmente 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 correctamente cada uno y cuándo se debe usar.

Gracias por la explicación chicos. Yo como que lo entiendo mejor. Ambas son buenas explicaciones. A continuación se muestra un pequeño ejemplo de algunos de mis códigos que 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 value o value2, especialmente después de las respuestas que me 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 mi script se refiere (texto en las celdas, más que números).


Excepto la primera 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.


.Text le da una cadena que representa lo que se muestra en la pantalla para la celda. Usar .Texto generalmente es una mala idea porque podrías 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 el mismo valor que .Value2, excepto si la celda se formateó como moneda o fecha, lo que le da una moneda VBA (que puede truncar decimales) o fecha de 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, ver mi texto vs valor vs valor2


target.Value le dará un tipo de Variant

target.Value2 le dará un tipo de Variant , pero una Date se coacciona a un Double

target.Text intenta forzar a una String y fallará si la Variant subyacente no es coquerizable a un tipo de String

Lo más seguro es algo así como

Dim v As Variant v = target.Value ''but if you don''t want to handle date types use Value2

Y compruebe el tipo de la variante usando VBA.VarType(v) antes de intentar una coerción explícita.