.text, .value 및 .value2의 차이점은 무엇입니까?


180

스크립트에 대한 도움을 요청하지는 않지만 설명은 명확합니다. 최근에 Excel에서 많은 VB 스크립팅을 해왔 으므로이 질문에서 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

value 나 value2를 생각할 때, 특히 당신이 제공 한 대답 후에 숫자로만 사용해야한다고 생각하기 때문에 여전히 약간 혼란 스럽습니다. 그러나 내 예제에서 나는 엄격히 텍스트에 대해 이야기하고 있는데, 이것은 내 스크립트가 말하는 많은 것입니다 (셀의 텍스트, 숫자보다 더).


LCase에는 인수에 대한 문자열이 필요하므로 Target.Value가 문자열에 강제되지 않으면 LCase (Target.Value)가 실패합니다. 내 대답에 따라 VarType을 먼저 확인해야합니다. 또한 UCase를 대신 사용할 수 있으며 "HLO"와 직접 비교할 수 있습니다. 리터럴로 작업하는 데별로 도움이되지 않습니다.
Bathsheba

VarType에 대한 정보를 주셔서 감사합니다. 이것에 대한 LCase 또는 UCase에 관해서는, 내가 어느 것을 사용했는지는 중요하지 않습니다. 어떤 사람들은 그것을 Hlo로 입력하고 어떤 사람들은 그것을 HLO로 입력합니다. 내가 본 것에서 소문자가 더 자주 사용되었습니다.
Chris

답변:


238

.Text셀 화면에 표시되는 내용을 나타내는 문자열을 제공합니다. ####을 얻을 수 있기 때문에 .Text를 사용하는 것은 일반적으로 나쁜 생각입니다.

.Value2 셀의 기본 값을 제공합니다 (빈, 문자열, 오류, 숫자 (이중) 또는 부울 수 있음).

.Value 셀이 통화 또는 날짜 형식 인 경우 VBA 통화 (소수 자릿수를자를 수 있음) 또는 VBA 날짜를 제공한다는 점을 제외하고는 .Value2와 동일합니다.

.Value 또는 .Text를 사용하는 것은 일반적으로 셀에서 실제 값을 얻지 못하고 .Value2보다 느리기 때문에 나쁜 생각입니다.

더 광범위한 논의는 내 텍스트 대 가치 대 가치 2를 참조하십시오.


6
숫자를 문자열로 변환하는 방법을 제어하기 위해 Format을 사용할 것입니다. var = Format (Range ( "a1"). Value2, "#")
Charles Williams

2
나는 이것이 별도의 질문이 아니라고 희망하지만 기본값은 무엇입니까? OP는 텍스트 / 값 / 값 2를 빠뜨리는 것이 문제가된다고 모호하게 주장하지만 분명히 기본값 중 하나 입니까?
Martin F

3
이 oooooold 게시물을 깨워서 미안하지만 필요한 것이 a 일 때 (사용 ) Date으로 a 를 강요하는 이점을 보지 못했습니다 . 가치를 볼 때 선호 하지 않아야 합니까? 링크 된 기사도 그렇게 명확하지 않습니다. 전환이 없기 때문에 실적이 있습니까? 그러나 VBA 코드가 a와 함께 작동 하는 경우 암시 적 또는 명시 적으로 직접 변환을 수행하는 데 지장을 잃을 것입니다. (문맥-부담없이 부담하십시오)Double.Value2Date.Value.Value2DateDate
Mathieu Guindon

2
@ 매트 머그잔-문제는 Excel에 실제 날짜 데이터 유형이 없다는 것입니다. 엑셀 날짜 및 시간은 사용자가 날짜, 시간 또는 통화로 표시하기 위해 적용하거나 변경 한 형식에 따라 두 배가됩니다. 번호. 따라서 Value는 Excel을 VBA 날짜로 두 배로 강제 변환하지만 Value2는 강제로 수행하지 않습니다 ... 날짜로 두 배로 강제 변환하는 날짜는 코드가 변경 가능한 형식에 의존한다는 것을 이해하는 한 손상을 일으키지 않을 것입니다. 어느 쪽이든 단점-우리가 실제로 필요한 것은이 문제를 피하기 위해 더 많은 기본 Excel 데이터 형식입니다.
Charles Williams

2
유형 변환없이 (예 : 텍스트로 저장된 숫자를 숫자로 변환하지 않고) 셀 값을 다른 셀과 동일하게 설정하려면 다음을 사용하십시오 Format$(Range.Value2, Range.NumberFormat).
ChrisB 2016 년

55

다음에 대한 MSDN 정보를 제외한 첫 번째 답변 양식 Bathsheba는 제외합니다.

. 값. 값
2
는 .text

분석 된 속성 간의 차이점을 더 잘 이해하기 위해이 표를 분석 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


4
@Chris, .Value항상 텍스트와 숫자의 표준 속성으로 사용하십시오 . .Value2날짜와 숫자를 생각할 때 사용하십시오 . .Text셀 / 범위에있는 항목의 서식을 유지 해야하는 경우 항상 사용하십시오 . 따라서 귀하의 질문 예가 맞다면!
Kazimierz Jawor 2016 년

1
날짜가 10:12에서 10:05로 변경된 이유는 무엇입니까? 오식?
Katrin

1
나는 결과를 생성하고 스크린 샷을 만드는 시간 사이에 시간이 경과했다고 생각합니다
Kazimierz Jawor

25

target.Value당신에게 Variant유형 을 줄 것입니다

target.Value2당신 Variant에게도 유형을 줄 것이지만 a DateDouble

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)명시 적 강제를 시도하기 전에 사용하는 변형 유형을 확인하십시오 .


11

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

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가 더 나은 선택 일 수 있습니다.


0

호기심으로 인해에 대한 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

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.