В чем разница между.текст.,ценность и.значение2?
Я не прошу помощи с любым скриптом, но мой вопрос для разъяснения. В последнее время я делаю много сценариев VB в Excel, поэтому я действительно имею в виду Excel в этом вопросе. В чем разница между .текст. ,ценность и. значение2? Например, когда я должен использовать target.текст, цель.значение и цель.значение2? Я никогда не использовал параметр value2, но все равно хотел бы знать, для чего он используется.
иногда, если я использую .текст это дает мне ошибку, и мне нужно использовать .значение когда я только проверяю или манипулирую текстом внутри ячейки. Тогда иногда, когда я думаю, что я должен использовать .значение я получаю ошибку и мне нужно использовать .текст. Обычно он принимает либо или без проблем, но иногда это действительно имеет значение. Я знаю, что в этом должна быть какая-то логика, но я не могу понять этого.
Я также узнал, что если вы просто оставите его в качестве цели без указания.текст или. значение это будет изначально работать, но потом что-то, что кто-то делает будет в конечном итоге вызовите ошибку скрипта, поэтому всегда лучше использовать a .что-то на нем. Я думаю, что я спрашиваю, Может ли кто-то дать мне какое-то руководство, эмпирическое правило, как правильно использовать каждый из них и когда его нужно использовать.
Спасибо за разъяснения, ребята. Я вроде как понимаю это лучше. Они оба являются хорошими объяснениями. Ниже приведен крошечный пример некоторых из моего кода, который действительно работает. Я подумал, что это должна быть мишень.текст, но это будет ошибка, поэтому, когда я использовал target.значение это сработало.
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
Я все еще немного смущен, потому что, когда я думаю о значении или value2, особенно после ваших ответов, которые вы предоставили, я думаю, что они должны использоваться только для чисел. Однако в моем примере я говорю о строго текстовом, который является большим количеством того, на что ссылается мой скрипт (текст в ячейках, больше, чем цифры).
5 ответов:
.Text
дает вам строку, представляющую то, что отображается на экране сотового. С помощью.Текст, как правило, плохая идея, потому что вы могли бы получить ####
.Value2
дает вам базовое значение ячейки (может быть пустой строкой, ошибка, номер (дабл) или boolean)
.Value
дает вам то же самое.Value2 за исключением того, что ячейка была отформатирована как валюта или дата, она дает вам валюту VBA (которая может усекать десятичные знаки) или дату VBA.используя .Значение или. Текст-это обычно плохая идея, потому что вы не можете получить реальное значение из ячейки, и они медленнее, чем .Значение2
для более широкого обсуждения см. Мой текст против значения против Value2
кроме первой формы ответа Вирсавия, кроме информации MSDN для:
вы можете проанализировать эти таблицы для лучшего понимания различий между анализируемыми свойствами.
target.Value
даст вамVariant
тип
target.Value2
даст вамVariant
введите также, но aDate
приводится кDouble
target.Text
попытки принудить кString
и потерпит неудачу, если базовыйVariant
не является принудительным кString
типсамое безопасное, что можно сделать, это что-то вроде
Dim v As Variant v = target.Value 'but if you don't want to handle date types use Value2
и проверьте тип варианта с помощью
VBA.VarType(v)
прежде чем вы попытаетесь явное принуждение.
относительно соглашений в C#. Допустим, Вы читаете ячейку, содержащую дату, например 2014-10-22.
при использовании:
.Text
, вы получите форматированное представление данных, как показано в книге на экране:
2014-10-22. Тип этого свойства всегдаstring
но не всегда может вернуть удовлетворительного результата.
.Value
, компилятор пытается преобразовать дату вDateTime
объект: {2014-10-22 00:00:00} скорее всего, только полезно при чтении даты.
.Value2
, дает вам реальное, базовое значение ячейки. В случае с датами, это дата серийный номер:41934. Это свойство может иметь разный тип в зависимости от содержимого ячейки. Хотя на сегодняшний день сериалы, типаdouble
.таким образом, вы можете получить и сохранить значение ячейки в любом
dynamic
,var
илиobject
но обратите внимание, что значение будет всегда есть какой-то врожденный тип, что вам придется действовать.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
.Текст-это отображаемое значение форматированной ячейки; .Значение-это значение ячейки, которое может быть увеличено с помощью индикаторов даты или валюты; .Value2-это необработанное базовое значение, лишенное какой-либо посторонней информации.
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
Если вы обрабатываете значение ячейки, то чтение raw .Value2 немного быстрее, чем .Значение или. Текст. Если вы находите ошибки, то .Текст будет возвращать что-то вроде
#N/A
как текст и можно сравнить со строкой while .Ценность и. Значение2 будет задыхаться, сравнивая их возвращенное значение со строкой. Если к вашим данным применяется какое-либо пользовательское форматирование ячеек .Текст может быть лучшим выбором при построении отчета.