Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Range|Cells|Columns|With~End With |Range|Cells|Value|Immediate Window|Property|
|Method|With~End With|Select|ActiveCell|Offset|
|HasFormula|InNumeric()|Application.IsText()|
|IsError()|TypeName()|Chr()|IsEmpty()|Ctrl+*|
|CurrentRegion|Columns|AutoFit|Display Value|Real Value|Text|

엑셀프로그래밍에서 가장 중요한 Range오브젝트

엑셀프로그래밍에 있어서 가장 많이 사용되는것은 역시 워크시트의
각각의 셀들이다
이 셀 혹은 셀들이 Range오브젝트인것이다
이 부분을 몇페이지에 걸쳐서 살펴보도록 하자
나중에 부족한 부분이 있으면 페이지를 더 추가해 나간다
해당시트의 A1셀에 접근하는 방법은

ABCDEFGH
1
2

WorkSheets("Sheet1").Range("A1").Value=33
Application.ActiveSheet.Range("A1").Value=33
Activesheet.Range("A1").Value=33
Range("A1").Value=33
Cells(1).Value=33

만약에 Range("A1")이 선택된 상태라면

ActiveCell.Value=33

등과 같이 다양하게 접근할수 있다
흐리게 표현한 .Value속성은 Range오브젝트의 Default속성으로서
붙여주어도 되고 안붙여주어도 된다..아무 속성도 붙여주지 않으면
Value속성으로 간주하니까..
또한 엑셀프로그래밍에서 Range오브젝트가 가장 중요한 이유는
여러분이 작성하는 값은 Range오브젝트의 Value속성이 보관하게 되는 것이다
그러니 여러분이 엑셀에 어떤 값를 자동으로 입력하고려 할때도
Range오브젝트에 접근하여야 하고
어떤 정보를 수정,제거하려고 해도 역시 Range오브젝트에 접근해야 한다
이런 간단한 명령을 실행해보려면 직접실행창(Immediate Window)를 최대한 활용하시면 좋을것이다

오브젝트를 처리하는데 편리한 With ~ End With구문

오브젝트는 다양한 속성(Property)와 메소드(Method)를 갖고 있다
어떤 오브젝트를 처리할때마다 오브젝트에 접근하는 표현식을 모두
작성하여 준다면 불편하기 짝이 없지 않은가
VB언어에 대한 이야기를 앞에서 전부 끝내지 않고
엑셀로 들어와서 이야기하는 이유는
With~End With는 오브젝트를 다룰때 필요하기 때문에 이곳에서 다룬다

다음 프로시져를 통합문서에서 실행시켜보시기 바란다

Sub WriteAlpha()
Dim iX As Integer
Activesheet.Range("A3").Select
For iX = 0 To 25
    ActiveCell.Offset(iX, 0)= Chr(65 + iX)
    If ActiveCell.Offset(iX, 0) = "Q" Then
        ActiveCell.Offset(iX, 0).Font.Bold = True
        ActiveCell.Offset(iX, 0).Font.ColorIndex = 3
        ActiveCell.Offset(iX, 0).Interior.ColorIndex = 15
    End If
Next
End Sub

알파벳 A~Z까지 A3셀에서 부터 차례대로 입력이 되고
Q문자의 바탕색과 문자의 색상등만 다르게 표현되었다
위의 구문중의 파란색부분은 같은 구문이 계속 반복된다
효율적이라함은 반복됨이 배제가 되어야 한다
위의 구문에서 반복되는것을 배제하는 방법으로
With ~ End With
구문이 필요하게 되는것이다
아래와 같이 다시 작성할수 있다

Sub WriteAlpha()
Dim iX As Integer
ActiveSheet.Range("A3").Select
For iX = 0 To 25
    With ActiveCell
         .Offset(iX, 0)=Chr(65 + iX)
         If .Offset(iX, 0)= "Q" Then
            .Offset(iX, 0).Font.Bold= True
            .Offset(iX, 0).Font.ColorIndex= 3
            .Offset(iX, 0).Interior.ColorIndex= 15
         End If
     End With
Next
End Sub

중복되는 오브젝트표현식을 계속해서 작성할 필요없이
위와 같이 With ~ End With를 사용하면 해당 오브젝트의 다음
오브젝트나 속성,메소드등을 중복입력없이 작성할수 있어서 편리하다

위에서 또 Font오브젝트가 중복된다
이럴때는 With ~ End With를 중첩하여 사용할수 있다
아래와 같이

Sub WriteAlpha()
Dim iX As Integer
ActiveSheet.Range("A3").Select
For iX = 0 To 25
    With ActiveCell
        .Offset(iX, 0)=Chr(65 + iX)
        If ActiveCell.Offset(iX, 0)= "Q" Then
            With .Offset(iX, 0).Font
                .Bold=True
                .ColorIndex=3
            End With
            .Offset(iX, 0).Interior.ColorIndex=15
        End If
    End With
Next
End Sub

3개의 구문이 모두 똑같은 결과를 실행하게 된다
With~End With를 사용하면 구문의 작성이 좀더 효율적이라는 점
잘 챙기시고 앞으로 계속 반복하여 나올것이다

Range오브젝트는 집합체오브젝트가 없다

앞페이지에서 설명하였던 거의 모든 오브젝트는
집합체오브젝트의 관리를 받고 있다고 하였으나..
집합체오브젝트가 필요없는 이유는 한장의 시트에 Range오브젝트는
열방향 256개 행방향 65536개(현재버전까지는..앞으로 나올 버전에서
무한대 확장된다고 하니까..기다려 보자)가 고정되어 있어서
더이상 추가할수도 없으니..필요없는것이다
단지 어떻게 어느 범위에 어떻게 접근하느냐가 문제이다
앞으로 몇페이지에 걸쳐서 Range오브젝트에 필요에 따라서
어떻게 접근하는가를 살펴보는 것이다

입력하고자 하는 셀에 어떤값이 있는지 알아보기

프로그래밍에 있어서는 어떤 작업을 하기전에
반드시 사전에 확인하는 습관을 갖여야 한다
예를 들면 어떤 셀에 어떤값을 넣기전에 혹시 어떤값을 넣으려고 하는 셀에
중요한 정보가 있을수도 있는것이다
세상을 살면서 그냥 확인없이 해도 되는 일이 많지만
프로그래밍을 할때는 항상 사전에 확인하는 습관을 갖여야 하고,
갖게 된다
그래서 프로그래밍을 하면 사람이 차분하고 침착해진다
지나쳐도 안되겠지만..
그래서 사전에 알아보기 위한 함수들을 통칭하여 정보함수라고 한다
그런 정보함수중의 하나가 IsEmpty()함수이다
예를 들어서 Sheet1이라는 이름의 워크시트의 A1셀에 35라는
숫자를 입력하려고 할때

Dim rngX As Range
Set rngX=Worksheets("Sheet1").Range("A1")
If IsEmpty(rngX) Then
   rngX.Value=35
Else
  If MsgBox("입력하려고 하는 셀에 값이 있습니다..그래도 입력할까요",vbYesNo)=vbYes Then
    rngX.Value=35
  End If
End IF

또한 If IsEmpty(rngX) Then 을 If rngX="" Then 으로 하여도
결과는 마찬가지다

숫자가 들어있는지 알고 싶다면
If IsNumeric(rngX) Then

으로 하면 되고
만약 문자열이 있는지 알고 싶다면

If Not IsNumeric(rngX) Then

혹은 엑셀의 워크시트함수를 빌려서
If Application.IsText(rngX) Then

으로 하여도 되고 방법은 다양할것이다

만약 rngX 셀에 수식이 들어 있는지 알고 싶다면
If rngX.HasFormula Then

Range오브젝트의 HasFormula속성을 사용하여 얻을수도 있다
또한 rngX셀에 수식의 결과가 에러가 났는지(#Num!,#Ref!등)
알고 싶다면
If IsError(rngX) Then

위의 구문에서 =True는 모두 생략되어도 된다는 점!!
초보님들은 헷갈리지 마시고,뭔소리냐 하면..
If IsError(rngX)=True Then

If IsError(rngX) Then
와 같은 소리라는것이다

또한 rngX에 들어있는 정보의 타입이 무엇인지 알고 싶다면
Msg TypeName(rngX)

라고 하면 어떤 타입인지 타입번호를 얻을 수있는것이다
여러가지 타입의 수식이나 정보를 셀에 입력한후
위의 내용을 만들어서 눈으로 보아야 실감이 날것이다
각각의 정보를 검색한후 별도의 리포트를 기록하도록 해보자

evaluate state of cells

셀의 실제 값과 보여지는 값(Real Value and Display Value)

셀의 서식된 값을 읽는것과 실제의 값을 읽는것은 차이가 있다
Ctrl+*키를 누른것과 같은 효과를 내는 속성
범위의 폭을 자동으로 조정하기
Range오브젝트의 속성중에 CurrentRegion이 있다
이것은 아래의 그림과 같은 효과를 준다



그리고 A1셀의 값은 1200인데 셀서식을 하여
눈에 보이는 값(Display Value)는 "1,200Kg"이라고 표현되었을때
VB로 이 서식된 값을 그대로 읽어내려면

Range("A1").Text

Text속성을 사용하여 "1,200Kg"이라는 값을 얻는것이다
만약 아래와 같이 표현하면

Range("A1").Value

의 경우는 셀의 진정한 값 1200을 얻게 된다

셀에 값들이 들어 갔을때 열폭이 안맞는 경우가 있다
이때 범위를 선택하고 서식메뉴에서 열/선택한 열에 맞게 폭을 조정하였었다
이것을 VB로 표현하면 아래와 같은것이다

Range("A1").CurrentRegion.Columns.AutoFit

A1셀에서 근접한 모든 범위의 모든 열을 대상으로 하여 AutoFit(자동조절)하여라!!
라는 Range오브젝트의 메소드를 불러서 일을 시키면 되는것이다
Range오브젝트는 계속하여 Range오브젝트에 차례대로 접근시키는
좀 특이한 녀석이니까..첨에는 헷갈리기도 할것이다
위의 경우 Range("A1")이라는 Range오브젝트에
CurrentRegion이라는 속성을 붙였고 이것이 바로 다시
확장된 Range오브젝트를 만들어 낸것이다
다시 그 변화된 Range오브젝트에 Columns라는 속성을 붙여서
또 다른 Range오브젝트에 접근하게 된것이다



ABCDEFGH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

위에서 CurrentRegion속성으로 범위가 확장되어(파란색)
새로운 Range오브젝트가 얻어지는것이고 이때 A1셀은 색깔이 틀리다
딱하나의 셀은 활성화된 셀이다(ActiveCell)
활성화된 셀에 값을 넣을수 있는것이다
활성화된 셀과 선택된 범위(Selected Range)와 잘 구별하도록 하여야 한다