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

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

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

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

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

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

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

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

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

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

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

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

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

.Стоимость
.Value2
.Текст

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

введите описание изображения здесь

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

target.Value2 также даст вам тип Variant но 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 
Interesting Posts

Застрял в использовании транспонирования

Копировать данные столбца, состоящие из пустых ячеек

Сценарий VBA при делении на ноль

Удалить строку в Excel из программы Delphi

Coulmns скрыты при загрузке xlsx-файла с использованием axlsx gem

Открыть данные диаграммы Power Point в Excel

Excel vba workbooks.open событие, дающее ошибку времени выполнения 1004 – Диск полностью

Разбирайте HTML-файл и заполните строки в excel, используя только макрос VBA

рассчитать разницу между двумя датами и временем на excel

Задайте значение в новой книге в зависимости от данных в исходной книге

Excel VBA – укажите диапазон в качестве заголовка страницы

VBA Excel Отправка отдельных писем

Данные извлечения массива VBA

Сумма IFs общего количества без пересчета Несколько экземпляров, только ближайшая дата до AS DATE

Найти все повторяющиеся значения в одном столбце и объединить все его значения

Давайте будем гением компьютера.