Я не прошу о помощи с любым 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 (текст в ячейках, а не по номерам).
.Text
дает строку, представляющую то, что отображается на экране для ячейки. Использование .Text обычно плохое, потому что вы можете получить ####
.Value2
дает базовое значение ячейки (может быть пустым, строкой, ошибкой, числом (double) или логическим)
.Value
дает вам то же самое, что и .Value2, за исключением случаев, когда ячейка была отформатирована как валюта или дата, она дает вам валюту VBA (которая может обрезать десятичные разряды) или дату VBA.
Использование .Value или .Text обычно плохое, потому что вы не можете получить реальное значение из ячейки, и они медленнее, чем .Value2
Для более подробного обсуждения см. Text vs Value vs Value2
1420470000000000
. Я хочу получить это как строку. Использование .Value
и Value2
оба возвращают мне следующее: 1.42047E+15
. То, что я на самом деле хочу, это полное значение в виде строки, то есть 1420470000000000
. В настоящее время я использую .Formula
, но хотел бы узнать более подходящее решение?
За исключением первой формы ответа от Bathsheba, за исключением информации MSDN для:
вы могли бы проанализировать эти таблицы для лучшего понимания различий между анализируемыми свойствами.
.Value
как стандартное свойство - для текста и чисел. Используйте .Value2
когда вы думаете о дате и некоторых цифрах. И всегда используйте .Text
если вам нужно сохранить форматирование всего, что у вас есть в ячейке / диапазоне. Итак, ваш вопрос пример, если правильно!
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)
перед попыткой явного принуждения.
Относительно соглашений на С#. Скажем, вы читаете ячейку, содержащую дату, например. 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
.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.