Quelle est la différence entre les deux.texte,.valeur, et.valeur2?

Je ne demande pas d'aide avec un script, mais ma question est une clarification. Dernièrement, j'ai fait beaucoup de scripts VB dans Excel, donc je me réfère vraiment à Excel dans cette question. Quelle est la différence entre les deux .texte, .valeur, et .valeur2? Comme quand devrais-je utiliser target.le texte, à la cible.valeur, et de la cible.valeur2? Je n'ai jamais utilisé l'option value2 mais je voudrais toujours savoir à quoi elle sert.

Parfois si j'utilise .texte il me donne une erreur et je dois utiliser .valeur quand je suis seulement vérifier ou manipuler le texte dans une cellule. Puis parfois quand je pense que je devrais utiliser .valeur je reçois une erreur et je dois utiliser .texte. Habituellement, il accepte soit ou sans problème, mais parfois cela fait une différence. Je sais, il y a une certaine logique à cela, mais je n'arrive pas à le comprendre.

J'ai aussi découvert que si vous le laissez comme cible sans spécifier .texte ou .valeur cela fonctionnera initialement, mais alors quelque chose que quelqu'un fera finira par provoquer le script à l'erreur, il est donc toujours préférable d'utiliser un .quelque chose sur elle. Je suppose que ce que je demande est si quelqu'un peut me donner une sorte de ligne directrice, règle de base, quant à la façon d'utiliser correctement chacun et quand il doit être utilisé.

Merci pour l'explication, les gars. J'ai en quelque sorte de mieux les comprendre. Ce sont deux bonnes explications. Voici un petit exemple de certains de mes codes qui fonctionnent. Je pensais que ça devrait être la cible.texte, mais ce serait une erreur quand j'ai utilisé target.valeur travaillé.

If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
    Target.Value = "Higher Level Outage"
End If

Je suis encore un peu confus parce que quand je pense à value ou value2, surtout après vos réponses que vous avez fournies, je pense qu'elles ne devraient être utilisées que pour les nombres. Cependant, dans mon exemple, je parle strictement de texte, ce qui correspond beaucoup à ce à quoi mon script fait référence (texte dans les cellules, plus que les nombres).

129
demandé sur ashleedawg 2013-06-28 11:51:16

5 réponses

.Text Vous donne une chaîne représentant ce qui est affiché à l'écran pour la cellule. Utiliser .Le texte est généralement une mauvaise idée parce que vous pourriez obtenir # # # #

.Value2 vous donne la valeur sous-jacente de la cellule (peut être vide, chaîne, erreur, nombre (double) OU booléen)

.Value Vous donne la même chose que .Value2 sauf si la cellule a été formatée en devise ou en date, elle vous donne une devise VBA (qui peut tronquer les décimales) ou une date VBA.

En utilisant .Valeur ou .Le texte est généralement un mauvais idée parce que vous ne pouvez pas obtenir la valeur réelle de la cellule, et ils sont plus lents que .Valeur 2

Pour une analyse plus poussée, voir mon Texte vs Valeur vs Valeur2

180
répondu Charles Williams 2015-09-08 11:01:00

Sauf le formulaire de première réponse Bathsheba, sauf les informations MSDN pour:

.Valeur
.Valeur 2
.Texte

Vous pouvez analyser ces tables pour mieux comprendre les différences entre les propriétés analysées.

entrez la description de l'image ici

48
répondu Kazimierz Jawor 2015-03-25 20:58:02

target.Value vous donnera un Variant de type

target.Value2 vous donnera un Variant type de bien, mais un Date est contrainte à un Double

target.Text tente de forcer à un String et échouera si le Variant sous-jacent n'est pas contraignant à un String type

La chose la plus sûre à faire est quelque chose comme

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

Et vérifiez le type de la variante en utilisant VBA.VarType(v) avant de tenter une coercition explicite.

22
répondu Bathsheba 2013-06-28 07:57:45

Concernant les conventions en C#. Disons que vous lisez une cellule qui contient une date, par exemple 2014-10-22.

Lors de l'utilisation:

.Text, vous obtiendrez la représentation formatée de la date, comme on le voit dans le classeur à l'écran:
2014-10-22. Le type de cette propriété est toujours string mais peut ne pas toujours renvoyer un résultat satisfaisant.

.Value, le compilateur tente de convertir la date en DateTime objet: {2014-10-22 00:00:00} Plus probablement utiles lors de la lecture des dates.

.Value2, vous donne la valeur réelle et sous-jacente de la cellule. Dans le cas des dates, c'est une date Série: 41934. Cette propriété peut avoir un type différent en fonction du contenu de la cellule. Pour les séries de dates, le type est double.

Vous pouvez donc récupérer et stocker la valeur d'une cellule dans dynamic, var ou object mais notez que la valeur aura toujours une sorte de type inné sur lequel vous devrez agir.

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
9
répondu silkfire 2015-09-29 10:53:03

.Le texte est la valeur affichée de la cellule formatée; .Valeur est la valeur de la cellule éventuellement augmentée avec des indicateurs de date ou de devise; .Value2 est la valeur sous-jacente brute dépouillée de toute information étrangère.

range("A1") = Date
range("A1").numberformat = "yyyy-mm-dd"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
2018-06-14
6/14/2018 
43265 

range("A1") = "abc"
range("A1").numberformat = "_(_(_(@"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
   abc
abc
abc

range("A1") = 12
range("A1").numberformat = "0 \m\m"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
12 mm
12
12

Si vous traitez la valeur de la cellule, lisez le raw .Valeur2 est légèrement plus rapide que .Valeur ou .Texte. Si vous localisez des erreurs alors .Text retournera quelque chose comme #N/A en tant que texte et peut être comparé à une chaîne while .Valeur et .Valeur2 va s'étouffer comparer leur valeur renvoyée à une chaîne. Si vous avez un formatage de cellule personnalisé appliqué à vos données, alors .Le texte peut être le meilleur choix lors de la création d'un rapport.

1
répondu Jeeped 2018-06-15 01:25:23