Je ne demande de l'aide pour aucun script, mais ma question est une clarification. Dernièrement, j'ai fait beaucoup de scripts VB dans Excel, donc je fais vraiment référence à Excel dans cette question. Quelle est la différence entre .text, .value et .value2? Comme quand dois-je utiliser target.text, target.value et target.value2? Je n'ai jamais utilisé l'option value2 mais j'aimerais quand même savoir à quoi elle sert.
Parfois, si j'utilise .text, cela me donne une erreur et je dois utiliser .value lorsque je vérifie ou manipule uniquement le texte d'une cellule. Parfois, quand je pense que je devrais utiliser .value, j'obtiens une erreur et je dois utiliser .text. Habituellement, il accepte l'un ou l'autre ou sans problème, mais parfois cela fait une différence. Je sais qu'il doit y avoir une certaine logique à cela, mais je n'arrive pas à comprendre.
J'ai également découvert que si vous le laissez simplement comme cible sans spécifier .text ou .value, cela fonctionnera initialement, mais quelque chose que quelqu'un fait finira par provoquer une erreur dans le script, il est donc toujours préférable d'utiliser un .something dessus . Je suppose que ce que je demande, c'est si quelqu'un peut me donner une sorte de ligne directrice, une règle empirique, sur la façon d'utiliser correctement chacune d'elles et quand elle doit être utilisée.
Merci pour l'explication les gars. Je le comprends mieux. Ce sont tous les deux de bonnes explications. Voici un petit exemple de certains de mes codes qui fonctionnent. Je pensais que cela devrait être target.text, mais cela ferait une erreur alors quand j'utilisais target.value, cela fonctionnait.
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
Je suis encore un peu confus car quand je pense à valeur ou valeur2, surtout après vos réponses que vous avez fournies, je pense qu'elles ne devraient être utilisées que pour les chiffres. Cependant, dans mon exemple, je parle strictement de texte, qui est une grande partie de ce à quoi mon script fait référence (du texte dans les cellules, plus que des nombres).
Réponses:
.Text
vous donne une chaîne représentant ce qui est affiché à l'écran pour la cellule. Utiliser .Text est généralement une mauvaise idée car 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 tant que devise ou date, elle vous donne une devise VBA (qui peut tronquer les décimales) ou une date VBA.L'utilisation de .Value ou .Text est généralement une mauvaise idée car vous ne pouvez pas obtenir la valeur réelle de la cellule et elles sont plus lentes que .Value2
Pour une discussion plus approfondie, voir mon texte vs valeur vs valeur2
la source
Date
dans unDouble
(utilisation.Value2
) lorsque ce dont vous avez besoin est unDate
. Ne devrait-il pas.Value
être préféré.Value2
à uneDate
valeur? L'article lié ne le précise pas non plus. Performance car pas de conversion? Bien sûr, mais si votre code VBA fonctionne avec aDate
, vous perdrez cet avantage en effectuant la conversion vous-même, implicitement ou explicitement ... (contexte - n'hésitez pas à peser)Format$(Range.Value2, Range.NumberFormat)
.Sauf le premier formulaire de réponse Bathsheba, sauf les informations MSDN pour:
.Value
.Value2
.Text
vous pouvez analyser ces tableaux pour mieux comprendre les différences entre les propriétés analysées.
la source
.Value
comme propriété standard tout le temps - pour le texte et les nombres. À utiliser.Value2
lorsque vous pensez à la date et à certains chiffres. Et utilisez.Text
toujours si vous avez besoin de continuer à mettre en forme tout ce que vous avez dans la cellule / plage. Donc, votre exemple de question est correct!target.Value
te donnera unVariant
typetarget.Value2
vous donnera également unVariant
type mais aDate
est contraint à unDouble
target.Text
tente de forcer à unString
et échouera si le sousVariant
- jacent n'est pas contraignable à unString
typeLa chose la plus sûre à faire est quelque chose comme
Et vérifiez le type de la variante en utilisant
VBA.VarType(v)
avant de tenter une coercition explicite.la source
Concernant les conventions en C #. Supposons que vous lisiez une cellule contenant une date, par exemple le 22/10/2014.
Lors de l'utilisation:
.Text
, vous obtiendrez la représentation formatée de la date, comme indiqué dans le classeur à l'écran:22/10/2014 . Le type de cette propriété est toujours,
string
mais pas toujours, un résultat satisfaisant..Value
, le compilateur tente de convertir la date enDateTime
objet: {2014-10-22 00:00:00} Très probablement utile uniquement lors de la lecture des dates..Value2
, vous donne la valeur réelle sous-jacente de la cellule. Dans le cas des dates, c'est une série de dates: 41934 . Cette propriété peut avoir un type différent selon le contenu de la cellule. Pour les périodiques de date cependant, le type estdouble
.Vous pouvez donc récupérer et stocker la valeur d'une cellule dans l'un ou l' autre
dynamic
, mais notez que la valeur aura toujours une sorte de type inné sur lequel vous devrez agir.var
object
la source
.Text est la valeur affichée de la cellule formatée; .Value est la valeur de la cellule éventuellement augmentée d'indicateurs de date ou de devise; .Value2 est la valeur sous-jacente brute dépouillée de toute information superflue.
Si vous traitez la valeur de la cellule, la lecture de la valeur brute .Value2 est légèrement plus rapide que celle de .Value ou .Text. Si vous recherchez des erreurs, .Text renverra quelque chose comme du
#N/A
texte et pourra être comparé à une chaîne tandis que .Value et .Value2 s'étoufferont en comparant leur valeur renvoyée à une chaîne. Si vous avez une mise en forme de cellule personnalisée appliquée à vos données, .Text peut être le meilleur choix lors de la création d'un rapport.la source
Par curiosité, je voulais voir comment
Value
performé contreValue2
. Après environ 12 essais de processus similaires, je n'ai pas pu voir de différences significatives de vitesse, je recommanderais donc toujours d'utiliserValue
. J'ai utilisé le code ci-dessous pour exécuter des tests avec différentes plages.Si quelqu'un voit quelque chose de contraire concernant les performances, veuillez poster.
la source