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).
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
Sauf le formulaire de première réponse Bathsheba, sauf les informations MSDN pour:
Vous pouvez analyser ces tables pour mieux comprendre les différences entre les propriétés analysées.
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.
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
.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.