|
==============[aortla님 글에 대한 답변입니다]==============
요 앞에 질문과 답변에서처럼
엑셀 워크시트의 셀에 표시된 내용은 실제 셀에 기억되어 있는 값과
다를 수 있습니다.
그런데 LEN 함수를 이용하여 특정 셀에 있는 문자열의 길이
즉, 문자의 개수를 구하게 되면
셀에 표시된 내용과 관계 없이 실제 기억된 값을 기준으로 계산해 버리기 때문에
이상한 결과가 나올 수 있습니다.
예를들어, A1 셀 서식을 회계 서식으로 지정하고 10000을 입력하면
화면상에는 10,000으로 표시됩니다.(겉보기 글자 수 6글자)
그런데, =LEN(A1)으로 문자열의 개수를 물어보면
6이 아닌 5를 반환해 줍니다.
왜냐하면, 실제 셀에 기억되어 있는 값은
눈에 보이는 "10,000"이 아닌 수치 10000이기 때문이지요.
셀 - 즉, Range 개체의 속성 중에서
화면에 표시되는 문자열을 알아볼 수 있는 속성은 Text입니다.
Value나 Value2 속성은 화면 표시가 아닌 실제 기억된 값을 알려줍니다.
따라서 셀의 Text 속성을 이용하여 문자열의 길이를 계산하면
실제 워크시트 화면에 보이는 내용을 기준으로 글자 수를 알아낼 수 있습니다.
다만 이 경우에도, 셀 서식에서 _을 이용하여 양쪽에 공백을 추가한 경우에는 눈에 보이는 글자 수와 다른 결과를 계산해버릴 수 있으므로
Trim 함수와 함께 결합해 주어야 합니다.
이렇게 만든 사용자정의 함수 TextLen 함수의 코드입니다.
' ============================================================================
' 겉보기 표시된 내용을 기준으로 문자열 길이 계산
' (저) 조삿갓 2018.2.11.
' 임의 배포 가능한 Open Source임. 단, 저작권 도용 및 상업적 이용 금지
' 사용법: =TextLen(문자열집합)
' 문자열집합은 셀 범위, 수치, 문자열 등이며, 배열수식으로 사용할 수도 있음
' 반환값: 각 문자열집합이 포함하는 문자열에 대하여 각각의 길이(글자 수)를
' 합산한 정수 값
' 참고: 문자열집합에 셀 범위가 포함된 경우, 셀 표시형식에 의해 표현되는
' 겉보기 문자열의 길이를 계산함(이 함수 설계의 궁극적 목적임)
' 주의사항: TextLen을 계산한 후에 대상 셀의 서식을 변경한 경우에는
' 즉시 반영이 되지 않으므로 '재계산'을 해 주어야 함
' =============================================================================
Public Function TextLen(ParamArray Strings() As Variant) As Integer
Dim param As Variant
Dim element As Variant
Dim rng As Range
TextLen = 0
For Each param In Strings
Select Case TypeName(param)
Case "Variant()"
For Each element In param
TextLen = TextLen + TextLen(element)
Next
Case "Range"
For Each rng In param
TextLen = TextLen + Len(Trim(rng.Text))
Next
Case "String"
TextLen = TextLen + Len(Trim(param))
Case Else
TextLen = TextLen + Trim(Str(param))
End Select
Next
End Function
|
|