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

스크립트에 대한 도움을 요청하지는 않지만 설명은 명확합니다. 최근에 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를 생각할 때, 특히 당신이 제공 한 대답 후에 숫자로만 사용해야한다고 생각하기 때문에 여전히 약간 혼란 스럽습니다. 그러나 내 예제에서 나는 엄격히 텍스트에 대해 이야기하고 있는데, 이것은 내 스크립트가 말하는 많은 것입니다 (셀의 텍스트, 숫자보다 더).



답변

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

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

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

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

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


답변

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

. 값. 값
2
는 .text

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

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


답변

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


답변

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


답변

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


답변

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

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


답변