N' .Valeur = .Valeur de loi similaire à Évaluer() fonction en VBA?
Considérons l'extrait suivant. Il écrit la même formule à deux cellules A1
et A2
Sub Main()
With Range("A1")
.Formula = "=1+1"
End With
With Range("A2")
.Formula = "=1+1"
.Value = .Value
End With
End Sub
La deuxième with
bloc utilise .Value = .Value
qui calcule/exécute la formule donc la formule disparaît de la barre de formule. Reportez-vous à masquage des formules à partir de la barre de formule pour un soutien de référence.
Maintenant, ajoutez un autre bloc
With Range("A3")
.Formula = "=1+1"
End With
Range("A4") = Evaluate(Range("A3").Formula)
Vous ajouter une formule à la cellule A3
alors que de nouvelles cellules de la formule est Evaluated()
dans une autre cellule A4
. Les résultats comme indiqué
Je pense que le ci-dessus montre que .Value = .Value
et Evaluate()
faire la même chose.
Cependant, Le code ci-dessous tire de la valeur d'un classeur fermé à l'aide de deux approches mentionnées. J'ai créé un classeur book9.xlsm
pour cet exemple, avec un hello
mettre dans la cellule A1. book9.xlsm
est celui que je vais tirer les A1
's la valeur de. Considérez le code
Sub PullValue()
With Range("A1")
.Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
End With
With Range("A2")
.Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
.Value = .Value
End With
Range("A3").Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
Range("A4") = Evaluate(Range("A3").Formula)
End Sub
La première with
bloc met une formule dans la cellule du A1
valeur à partir d'une book9.xlsm
. Il est exécuté par conséquent tiré valeur est hello
mais la barre de formule, c'est la .Formula
qui est C:\...
.
La deuxième with
bloc utilise la .Value = .Value
comme démontré ci-dessus pour l'évaluation de la formule et de cacher la formule en la remplaçant par la suite.
Range("A3") est la même que la première with
bloc.
Et maintenant (A4
) je suis en suivant le même principe que le premier exemple(premier extrait de cette question) à Evaluate()
la formule toutefois, Il ne fonctionne pas cette fois.
Consultez toutes les cellules activées valeurs et de la barre de formule pour chacun
Alors maintenant, je ne peux pas dire que .Value = .Value
est égal à Evaluate()
.
Les remarques de Evalutate() dire qu'il peut être utilisé avec des formules. Mais dans l'exemple que j'ai montré ça ne fonctionne pas.
Sont les formules utilisées en tant que paramètres dans Evaluate()
restreint? J'ai toujours pensé que l'évaluation est très puissant, mais il s'avère que .Value = .Value
est en fait encore plus puissant. Même si elles sont très semblables, ils sont un peu différentes ( mais je pense qu'il pourrait être de ma faute, la formule que j'ai choisi pour cet exemple peut être restreinte ou limitée ). Je pense que j'ai montré ce qui fait d'eux deux semblables et différents à la fois. C'est toujours comme 50%/50% et je ne peux pas dire exactement si ce sont les mêmes ou pas. Ce serait génial si quelqu'un était en mesure d'expliquer ce qui manque ici.
- J'ai roulé en arrière votre modifier. Merci de ne pas changer radicalement le sens de postes, surtout si vous êtes juste de "deviner" ce que la question est. Voir cette méta de discussion pour plus de détails.
- Evaluate() échoue lorsque la cellule référencée est dans un classeur fermé j'ai peur. Si vous ouvrez le référencés livre ensuite, il sera bien à nouveau. C'est la façon d'Évaluer la fonction des œuvres, il ne peut pas lire de livre fermé.
Vous devez vous connecter pour publier un commentaire.
.valeur et d'Évaluer ne sont pas les mêmes.
Excel gère à la fois une valeur et une formule de chaîne pour chaque cellule, et vous pouvez obtenir à la fois de ces informations de manière indépendante à l'aide de Gamme.La valeur et la Portée.Formule.
Lorsque vous utilisez l'Application.Évaluer pour évaluer une chaîne de la chaîne est évaluée comme une formule dans la feuille de calcul active (donc en fait de son mieux pour utiliser la Feuille de calcul.Évaluer plutôt que de l'Application.D'évaluer et de sa vitesse).
À L'Aide De Rng1.Valeur=Rng2.La valeur des copies de la valeur de Rng2 en Rng1 et remplace la formule de Rng1.
À L'Aide De Rng1.Valeur=Evaluate(rng2.La formule) demande Excel pour récupérer la formule de la chaîne de rng2, de l'évaluer et de retourner le résultat de Rng1.
La méthode evaluate ne fonctionne pas exactement de la même manière que d'une formule dans une cellule: il a beaucoup de "bizarreries" que vous devez être conscient (y compris le fait qu'il ne fonctionne pas avec les formules faisant référence à des externes fermés classeurs): voir mon blog pour plus de détails
Également il est en général préférable d'utiliser .Valeur2 plutôt que .Valeur: voir Valeur vs Valeur2 pour plus de détails
.Value = .Value
etEvaluate()
sont différents.Je pense que vous avez une certaine confusion avec les objets et leurs propriétés par défaut.
Toujours garder à l'esprit ces deux concepts:
VBA vous permet d'utiliser les propriétés et méthodes sans en préciser l'objet. VBA utilisation de son objet par défaut. Par exemple, lorsque vous utilisez
Evaluate()
vous utilisez réellementSheet1.Evaluate()
.VBA vous permet d'utiliser des objets sans en spécifier la propriété. VBA utilisera par défaut de la propriété. Par exemple, lorsque vous utilisez
Range("A1") = 1
vous utilisez réellementRange("A1").Formula = 1
. (Vous utilisez réellementSheet1.Range("A1").Formula = 1
!)Pour en revenir à votre exemple, lorsque vous ne
.Value = .Value
- vous réellement faireRange("A2").Value = Range("A2").Value
. La Valeur de la propriété d'une cellule peut être un nombre, une chaîne de caractères, un message d'erreur, etc. Et quand c'est un nombre, il pourrait être le mal nombre, qui n'est pas le bon résultat de la formule dans la cellule (par exemple parce que vous avez calcul automatique désactivée). Donc.Value = .Value
est équivalent à.Formula = "<xxx>"
, où<xxx>
est la dernière valeur calculée sur la cellule.Lorsque vous ne
Range("A4") = Evaluate(Range("A3").Formula)
vous demander Excel pour évaluer la formule et affecter le résultat à laFormula
propriété de la gamme A4 (parce que la formule de la propriété est la propriété par défaut d'un objet range.)hello
et de ne pas jeter une erreur. L'erreur est levée, car Évaluer impossible d'extraire une valeur à partir d'un classeur fermé alors?ScreenUpdating = False
) que la formule, parce que votre macro pour ouvrir le classeur entier, tandis qu'une formule est en mesure d'accéder uniquement les données nécessaires à l'intérieur d'un fichier fermé.(You actually use Sheet1.Range("A1").Formula = 1!)
de votre réponse ? Comment avez-vous comprendre que la Formule est la valeur par défaut de Gamme?Range("A2") = "=A1"
œuvres, et parce que d'autres comportements similaires, mais je peux me tromper..Value = .Value
(à l'intérieur d'une cellule deWith
bloc) définit simplement la valeur de la cellule à sa valeur actuelle, d'écrasement et de suppression de sa formule, si elle en a un. Le.Value
propriété représente simplement la valeur actuelle d'une cellule. Si la cellule contient une formule qui n'a pas encore été calculé, par exemple, si le calcul a été désactivé, il ne peut pas retourner le résultat de la formule, au lieu de revenir à la valeur précédente de la cellule.Excel.Application.Evaluate
prend une chaîne de valeur, l'évaluation de la chaîne du contenu comme s'il s'agissait d'une formule ou le nom d'une cellule, et le retour de la valeur de la cellule ou de la formule. Si vous passez une chaîne qui ne peut pas être mappé à une cellule Excel nom ou n'est pas une formule valide, vous recevrez un message d'erreur. Le but deEvaluate
est de permettre de créer dynamiquement des formules pour être évalué sans avoir à écrire la formule d'une cellule. En cas d'adoption d'une formule, il doit également retourner un résultat, même si le calcul du classeur est éteint, mais si elle est adoptée un nom, je m'attends à ce qu'il renvoie la valeur actuelle d'une cellule, et si de calcul du classeur est éteint, cette valeur peut ne pas refléter la valeur de la cellule référencée.Il semblerait que depuis la
.Value
d'une cellule etEvaluate()
peut retourner des résultats différents, la formule de feuille de calcul évaluation et le moteur de laApplication.Evaluate()
moteur sont différents, ou au moins avoir quelques différents éléments.L'évaluation est une fonction
Et quelque chose qui suivi d'un point (.) après une fonction,qui est appelé en tant que propriété. Donc ".De la valeur"".Formule",".Texte" sont des propriétés de la Plage à laquelle vous êtes ici.
Ne pas mélanger ces 2 choses.
Une fonction prend en entrée, effectuer des actions à l'aide de ses variables d'entrée et de retourner des résultats. Et il fonctionne sur le type de données pour lequel il est configuré.
.valeur générique est une propriété qui ne dépend pas de type de données. Il peut être de chaîne, numérique, float ou quoi que ce soit.
donc, il ya possibilité où vous obtenez l'erreur de 1 et d'autres travaux tout à fait bien.