다 아시다시피 문자와 달리 숫자나 날짜는 그 내용이 셀의 너비를 넘게 되면
‘#’으로
표시됩니다. 그러나
Value속성은 셀에 표시되는 내용과 관계없이 실제 저장된 값을 돌려주게 됩니다.
그러면
‘#’으로
도배를 하든, 숫자마다 컴마(,)가
들어가든 그저 셀에 표시된대로 가져오려면 어떻게 할까요?
정답은 Text속성입니다.
Text는 지정된 서식으로 표시된 내용 그대로를 가져 옵니다.
Text속성은 셀에 표시된 내용대로 되돌려 줍니다.
가령 D13셀에
‘12345’가
입력되어 있고 열의 너비가 좁아
‘########’으로
표시된다면 Range("D13").Value 가
‘12345’를
돌려주지만 Range("D13").Text 는 화면에
표시된 대로
‘########’을
돌려 줍니다.
Text의 이러한 성질을 이용하여 셀의 너비를 조정해주는
데 응용해보면 어떨까요? 보통
Autofit메소드는 열 내에서 가장 긴 내용을
기준으로 열의 너비를 조정해줍니다. 그러다 보니 종종
불편한 점이 생깁니다.
현재 셀을 기준으로 너무
남지도 않게, 너무 모자라지도 않게 열의 너비를 조정하는
것입니다. 다음은 현재 셀의 내용을 기준으로
‘#’이
안보일 정도로만 열의 너비를 조정하는 프로시져입니다.
Sub FlexibleWidth()
Dim x As String
// 화면의 갱신을 막아둔다
Application.ScreenUpdating = False
With ActiveCell
// 현재 셀 내용의 종류를
VarType()함수로 판단한다.
// 이때
Value가 사용되는 결정적 장면을 볼 수 있다
Select Case VarType(.Value)
// 데이터의 종류가 숫자와 날짜라면
뭔가 처리를 한다.
Case vbInteger To vbDate
// Text속성을 문자열 변수
x에 저장한다.
x = .Text
// 문자열 변수에
#이 있는지 알아본다.
If InStr(x, "#") > 0 Then
// #의 갯수만큼 컬럼의 너비를 줄여
나간다.
While InStr(x, "#") > 0
.ColumnWidth = .ColumnWidth
+ 0.1
x = .Text
Wend
// #이 없는 경우 컬럼의 너비를
줄여 나간다.
Else
Do
.ColumnWidth = .ColumnWidth -
0.1
x = .Text
// #이 보일때 까지 줄여 나간다.
Loop Until InStr(x, "#") > 0
// #이 보이지 않도록 다시 늘린다.
// 셀의 내용이 보일만큼 이제 적절한
너비로 조정된다.
.ColumnWidth = .ColumnWidth + 0.1
End If
End Select
End With
// 막아둔 화면갱신을 풀어준다.
Application.ScreenUpdating = True
End Sub |
위에서
VarType()함수는 매개변수의 데이터 종류를 알아내고 숫자형이나 날짜형인 경우 현재 셀의
내용 중
‘#’이
존재하는지를 판단합니다.
‘#’이
있다면
‘#’이
안보일 때 까지 열의 너비를 0.1씩 늘려 나갑니다.
그러나
‘#’이
안 보인다면 당연히 만족스러울 것입니다. 그러나 우리의
목표는
‘#’이
안보일 정도로만 열의 너비를 조정하는 것입니다. 즉 열의
너비가 충분하여 너무 넉넉하게 남아도 안되고 너무 좁아서
‘#’이
보여서도 안됩니다.
‘#’이
없는 경우
‘#’이
생길 때 까지 열의 너비를 0.1씩 좁혀갑니다.
이 프로시져를 워크시트의 SelectionChange이벤트에
넣어두면 셀 포인터를 이동할 때 마다 적절하게 열의 너비를 조정해줄 것입니다.
Private Sub
Worksheet_SelectionChange(ByVal Target As Range)
Call FlexibleWidth
End Sub |
|