Подтвердить что ты не робот

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

Я не прошу о помощи с любым 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 (текст в ячейках, а не по номерам).

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

enter image description here

Ответ 3

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

Ответ 4

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

Ответ 5

.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.

Ответ 6

Из любопытства я хотел посмотреть, как Value против Value2. Приблизительно после 12 испытаний подобных процессов я не мог видеть никаких существенных различий в скорости, поэтому я всегда рекомендовал бы использовать Value. Я использовал приведенный ниже код для запуска некоторых тестов с различными диапазонами.

Если кто-то видит что-то противоречащее в отношении производительности, пожалуйста, напишите.

Sub Trial_RUN()
    For t = 0 To 5
        TestValueMethod (True)
        TestValueMethod (False)
    Next t

End Sub




Sub TestValueMethod(useValue2 As Boolean)
Dim beginTime As Date, aCell As Range, rngAddress As String, ResultsColumn As Long
ResultsColumn = 5

'have some values in your RngAddress. in my case i put =Rand() in the cells, and then set to values
rngAddress = "A2:A399999" 'I changed this around on my sets.



With ThisWorkbook.Sheets(1)
.Range(rngAddress).Offset(0, 1).ClearContents


beginTime = Now

For Each aCell In .Range(rngAddress).Cells
    If useValue2 Then
        aCell.Offset(0, 1).Value2 = aCell.Value2 + aCell.Offset(-1, 1).Value2
    Else
        aCell.Offset(0, 1).Value = aCell.Value + aCell.Offset(-1, 1).Value
    End If

Next aCell

Dim Answer As String
 If useValue2 Then Answer = " using Value2"

.Cells(Rows.Count, ResultsColumn).End(xlUp).Offset(1, 0) = DateDiff("S", beginTime, Now) & _
            " seconds. For " & .Range(rngAddress).Cells.Count & " cells, at " & Now & Answer


End With


End Sub

enter image description here