В чем разница между.текст.,ценность и.значение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 129

5 ответов:

.Text дает вам строку, представляющую то, что отображается на экране сотового. С помощью.Текст, как правило, плохая идея, потому что вы могли бы получить ####

.Value2 дает вам базовое значение ячейки (может быть пустой строкой, ошибка, номер (дабл) или boolean)

.Value дает вам то же самое.Value2 за исключением того, что ячейка была отформатирована как валюта или дата, она дает вам валюту VBA (которая может усекать десятичные знаки) или дату VBA.

используя .Значение или. Текст-это обычно плохая идея, потому что вы не можете получить реальное значение из ячейки, и они медленнее, чем .Значение2

для более широкого обсуждения см. Мой текст против значения против Value2

кроме первой формы ответа Вирсавия, кроме информации MSDN для:

.Значение
.Значение2
.Текст

вы можете проанализировать эти таблицы для лучшего понимания различий между анализируемыми свойствами.

enter image description here

target.Value даст вам Variant тип

target.Value2 даст вам Variant введите также, но a Date приводится к 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 будет задыхаться, сравнивая их возвращенное значение со строкой. Если к вашим данным применяется какое-либо пользовательское форматирование ячеек .Текст может быть лучшим выбором при построении отчета.