스크립트에 대한 도움을 요청하지는 않지만 설명은 명확합니다. 최근에 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는 제외합니다.
분석 된 속성 간의 차이점을 더 잘 이해하기 위해이 표를 분석 할 수 있습니다.
답변
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)
명시 적 강제를 시도하기 전에 사용하는 변형 유형을 확인하십시오 .
답변
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