Я не прошу помощи с любым сценарием, но мой вопрос для уточнения. В последнее время я много занимался написанием сценариев на VB в Excel, поэтому я действительно обращаюсь к Excel в этом вопросе. В чем разница между .text, .value и .value2? Например, когда я должен использовать target.text, target.value и target.value2? Я никогда не использовал параметр value2, но все же хотел бы знать, для чего он используется.
Иногда, если я использую .text, это дает мне ошибку, и мне нужно использовать .value, когда я проверяю или манипулирую только текстом внутри ячейки. Затем иногда, когда я думаю, что я должен использовать .value, я получаю ошибку, и мне нужно использовать .text. Обычно он принимает или без проблемы, но иногда это имеет значение. Я знаю, что в этом должна быть какая-то логика, но я не могу понять это.
Я также обнаружил, что если вы просто оставите его в качестве цели, не указав .text или .value, то он сначала будет работать, но затем что-то, что кто-то сделает, в итоге вызовет ошибку скрипта, поэтому всегда лучше использовать на нем , Я предполагаю, что я спрашиваю, может ли кто-нибудь дать мне какое-то руководство, эмпирическое правило о том, как правильно использовать каждый из них и когда его нужно использовать.
Спасибо за объяснение, ребята. Я вроде лучше понимаю. Они оба хорошие объяснения. Ниже приведен крошечный пример моего кода, который работает. Я думал, что это должен быть 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
Для более подробного обсуждения см. Мой текст против значения против значения2
источник
Date
вDouble
(использование.Value2
), когда вам нужно этоDate
. Не.Value
следует ли отдавать предпочтение,.Value2
когда вы смотрите наDate
значение? Связанная статья не очень ясно дает понять это. Производительность, потому что нет конверсии? Конечно, но если ваш VBA-код работает с aDate
, вы потеряете это преимущество, выполняя преобразование самостоятельно, неявно или явно ... (контекст - не стесняйтесь взвешивать)Format$(Range.Value2, Range.NumberFormat)
.За исключением формы первого ответа Вирсавии, кроме информации MSDN для:
.Value
.Value2
.Text
Вы можете проанализировать эти таблицы для лучшего понимания различий между анализируемыми свойствами.
источник
.Value
все время используйте в качестве стандартного свойства для текста и чисел. Используйте,.Value2
когда вы думаете о дате и некоторых цифрах. И используйте.Text
всегда, если вам нужно сохранить форматирование всего, что у вас есть в ячейке / диапазоне. Итак, ваш вопрос пример, если правильно!target.Value
даст вамVariant
типtarget.Value2
даст вамVariant
тип, ноDate
вынужден кDouble
target.Text
пытается привести к aString
и потерпит неудачу, если базовый типVariant
не может быть принудительно приведен кString
типуСамое безопасное - это что-то вроде
И проверьте тип варианта использования,
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
но отмечает , что значение всегда будет иметь какое - то врожденный типа , что вы должны действовать в соответствии с .источник
.Text - отображаемое значение отформатированной ячейки; .Value - значение ячейки, возможно, дополненное индикаторами даты или валюты; .Value2 - это исходная ценность, лишенная любой посторонней информации.
Если вы обрабатываете значение ячейки, тогда чтение необработанного .Value2 незначительно быстрее, чем .Value или .Text. Если вы обнаруживаете ошибки, то .Text возвращает что-то вроде
#N/A
текста и может сравниваться со строкой, тогда как .Value и .Value2 будут задыхаться, сравнивая возвращаемое значение со строкой. Если к вашим данным применено пользовательское форматирование ячеек, тогда .Text может быть лучшим выбором при создании отчета.источник
Из любопытства я хотел посмотреть, как
Value
выступают противValue2
. После примерно 12 испытаний подобных процессов я не смог увидеть никаких существенных различий в скорости, поэтому я всегда рекомендовал бы использоватьValue
. Я использовал приведенный ниже код для запуска некоторых тестов с различными диапазонами.Если кто-то видит что-то противоречащее в отношении производительности, пожалуйста, напишите.
источник