В чем разница между .text, .value и .value2?

137

Я не прошу о помощи с любым script, но мой вопрос объясняется. В последнее время я делал много сценариев VB в Excel, поэтому я действительно имею в виду Excel в этом вопросе. В чем разница между .text,.value и .value2? Например, когда следует использовать target.text, target.value и target.value2? Я никогда не использовал параметр value2, но все равно хотел бы знать, для чего он используется.

Иногда, если я использую .text, он дает мне ошибку, и мне нужно использовать .value, когда я только проверяю или манипулирую текстом внутри ячейки. Тогда иногда, когда я думаю, что должен использовать .value, я получаю сообщение об ошибке, и мне нужно использовать .text. Обычно он принимает или без проблемы, но иногда это имеет значение. Я знаю, что для этого должна быть какая-то логика, но я, похоже, не понимаю ее.

Я также узнал, что если вы просто оставите его в качестве цели, не указав .text или .value, он будет изначально работать, но тогда что-то, что кто-то сделает, в конечном итоге приведет к ошибке script, поэтому всегда лучше использовать что-то на нем. Я предполагаю, что я спрашиваю, может ли кто-нибудь дать мне какое-то руководство, эмпирическое правило о том, как правильно использовать каждый и когда нужно его использовать.

Спасибо за объяснение, ребята. Я как бы понимаю это лучше. Они оба являются хорошими объяснениями. Ниже приведен небольшой пример моего кода, который работает. Я думал, что это должен быть target.text, но это будет ошибка, поэтому, когда я использовал target.value, он работал.

If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
    Target.Value = "Higher Level Outage"
End If

Я все еще немного смущен, потому что, когда я думаю о ценности или ценности2, особенно после ваших ответов, которые вы предоставили, я думаю, что они должны использоваться только для чисел. Тем не менее, в моем примере я говорю о строгом тексте, который много относится к моему script (текст в ячейках, а не по номерам).

  • 0
    LCase (Target.Value) потерпит неудачу, если Target.Value не может быть принудительно приведен к строке, поскольку LCase требует строку для аргумента. Вы должны проверить VarType сначала согласно моему ответу. Также обратите внимание, что вместо этого вы можете использовать UCase и сравнивать непосредственно с «HLO»: не так уж много смысла в работе с литералом.
  • 0
    Спасибо за информацию о VarType. Что касается LCase или UCase для этого, на самом деле не имеет значения, какой из них я использовал. Некоторые люди вводят это как hlo, а другие вводят это как HLO. Из того, что я увидел, оказалось, что строчные буквы использовались чаще.
Теги:
excel-vba
excel

5 ответов

182
Лучший ответ

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

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

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

Использование .Value или .Text обычно плохое, потому что вы не можете получить реальное значение из ячейки, и они медленнее, чем .Value2

Для более подробного обсуждения см. Text vs Value vs Value2

  • 0
    У меня есть следующее значение в ячейке: 1420470000000000 . Я хочу получить это как строку. Использование .Value и Value2 оба возвращают мне следующее: 1.42047E+15 . То, что я на самом деле хочу, это полное значение в виде строки, то есть 1420470000000000 . В настоящее время я использую .Formula , но хотел бы узнать более подходящее решение?
  • 5
    Я бы, вероятно, использовал Формат для управления преобразованием числа в строку: var = Format (Range ("a1"). Value2, "#")
Показать ещё 7 комментариев
47

За исключением первой формы ответа от Bathsheba, за исключением информации MSDN для:

. Стоимость
.Value2
.Text

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

Изображение 3719

  • 2
    @Chris, всегда используйте .Value как стандартное свойство - для текста и чисел. Используйте .Value2 когда вы думаете о дате и некоторых цифрах. И всегда используйте .Text если вам нужно сохранить форматирование всего, что у вас есть в ячейке / диапазоне. Итак, ваш вопрос пример, если правильно!
  • 1
    почему дата изменилась с 10:12 до 10:05? опечатка?
Показать ещё 1 комментарий
23

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) перед попыткой явного принуждения.

9

Относительно соглашений на С#. Скажем, вы читаете ячейку, содержащую дату, например. 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
2

.Text - отображаемое значение форматированной ячейки; .Value - значение ячейки, возможно, дополненное индикаторами даты или валюты; .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

Если вы обрабатываете значение ячейки, тогда чтение необработанного значения.Value2 немного быстрее, чем.Value или.Text. Если вы обнаруживаете ошибки, то.Text вернет что-то вроде #N/A виде текста и может быть сравнено с строкой, в то время как.Value и.Value2 будут дросселировать сравнение возвращаемого значения с строкой. Если у вас есть какое-то пользовательское форматирование ячеек, применяемое к вашим данным, тогда при построении отчета лучше всего использовать текст.Text.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню