Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

최초 작성일 : 2004-04-10
최종 수정일 : 2004-12-03
강좌 읽음수 : 201,651회

작성자 : Exceller (권현욱, exceller@amorepacific.com)

강좌 제목 : 레인지 오브젝트 - Range 속성, Cells 속성

VBA 뜨문뜨문 강좌... 아니 VBA 입문강좌를 재개합니다.
하도 오래간만에 하다보니, '엉? 그런 강좌가 있었나??' 하시는 분들이 적지 않으리라 짐작됩니다. 사과 드립니다. 받아... 주실꺼죠? (한석규 CF 버전으로...)

이제 집필도 마무리 되었고 하니, 앞으로는 자주 여러분과 만날 수 있지 않을까 하는 생각을 조심스레 해 봅니다.


VBA 입문강좌 : 중요한 오브젝트 몇 가지


가. 워크북 오브젝트(Workbook Object)

나. 워크시트 오브젝트(Worksheet Object)

다. 레인지 오브젝트(Range Object)


Range 오브젝트는 VBA로 프로그래밍을 할 때 가장 빈번하게 사용되는 가장 중요한 오브젝트 입니다. 엑셀에 입력되는 대부분의 데이터들이 바로 Range 오브젝트에 보관됩니다. 레인지 오브젝트의 개념만 잘 이해하면 나머지 오브젝트에 대한 것은 거저먹기나 마찬가지 입니다. Range 오브젝트는 워크시트 오브젝트의 하위 오브젝트로 시트 내에 한 개 또는 복수 개의 셀들로 이루어집니다.

Range 오브젝트에 접근하는 방법은 여러 가지가 있습니다. 다음은 대표적인 몇 가지 방법입니다.

  Range 속성을 사용하는 방법

  Cells 속성을 사용하는 방법

  Offset 속성을 사용하는 방법

  Union 메서드를 사용하는 방법

앞 강좌에서 워크시트 오브젝트의 크기에 대해 잠깐 설명드린 적이 있습니다. 다음 프로시저를 실행시켜 보면 하나의 워크시트에는 몇 개의 셀이 있는 지 알 수 있습니다.

Sub HowManyCells()

 

    Dim lngRow As Long
    Dim intColumn As Integer
    Dim lngCell As Long
    Dim strMsg As String
    lngRow = ActiveSheet.Rows.Count

    ' 시트 내의 행 수를 카운팅하여 lngRow 변수에 담습니다.


    intColumn = ActiveSheet.Columns.Count

    ' 시트 내의 열 수를 카운팅하여 intColumn 변수에 담습니다.


    lngCell = lngRow * intColumn

    ' 행 수와 열 수를 곱해서 셀 수를 구한 다음, 결과값을 lngCell 변수에 저장합니다.

    strMsg = strMsg & "시트 내 행의 수 : " & lngRow & vbCr
    strMsg = strMsg & "시트 내 열의 수 : " & intColumn & vbCr & vbCr
    strMsg = strMsg & "전체 셀의 수 : " & lngCell

    MsgBox strMsg
 

End Sub

VBA에서 가장 중요한 오브젝트 중 하나인 레인지 오브젝트에 자유자재로 접근하기 위한 첫번째 과제는, 우선 셀을 선택하는 것입니다. 그러기 위해서는 Range 속성과 Cells 속성의 특성을 잘 이해하고 있어야 합니다. 두 속성에는 각각 어떤 장단점이 있는 지, 어떤 경우에 사용하면 좋은지 잘 정리해 두시기 바랍니다.


Range 속성

다음 코드를 실행하면 'Sheet1' 시트의 A1 셀에 '100' 이라는 값이 입력됩니다.

Worksheets("Sheet1").Range("A1").Value = 100

이것은 Worksheets("Sheet1")이라는 워크시트 오브젝트의, Range("A1")이라는 레인지 오브젝트의, Value 속성값을 '100'이라고 지정해 준 것입니다. Range 오브젝트의 디폴트default 속성값은 Value입니다. 자동차를 살 때에도 기본으로 딸려나오는 것이 있고 옵션으로 선택하는 것이 있지요? 디폴트 속성은 속성명을 따로 붙이지 않아도 붙인 것으로 해석하는 것입니다. 자동차에서 별도로 주문하지 않아도 함께 제공되는 것과 마찬가지로 말입니다.

이번에는 여러 셀에 동일한 값을 넣어볼까요. 입력하고자 하는 위치에 다른 값이 들어있으면 메시지를 표시하고 실행합니다.

Sub WriteData_2()


    Worksheets("Sheet1").Range("A1").Select
    If Selection <> "" Then

    ' 선택된 셀이 공란이 아니면 If 구문 내부의 명령을 실행합니다.


        MsgBox "입력된 값이 있으나 지우겠습니다"
        Selection.ClearContents

        ' 선택된 영역의 데이터를 지웁니다.

  

메서드 설 명

Clear

내용과 서식을 모두 지웁니다.

ClearContents

내용만 지웁니다.

ClearFormats

서식만 지웁니다.


    End If

    Worksheets("Sheet1").Range("A1:A10").Value = "엑셀 VBA"
    MsgBox "A1:A10 영역에 값을 입력하였습니다"


End Sub

이번에는 불연속적인 여러 개의 셀에 값을 넣는 방법에 대해 살펴봅니다.

Sub WriteData_3()


    Worksheets("Sheet1").Range("A1").Select
    Range("A1").CurrentRegion.Select
    MsgBox Selection.Address & " 영역을 선택하였습니다. 값을 지우겠습니다"

    Selection.ClearContents
    With Range("A1,A3,A5,A7,A9,B2,B4,B6,B8,B10")
        .Select
        .Value = "엑셀 VBA"
    End With
    MsgBox """A1,A3,A5,A7,A9,B2,B4,B6,B8,B10"" 셀에 값을 입력하였습니다"

End Sub

CurrentRegion은 현재 영역, 즉 인접해 있는 상/하/좌/우의 영역을 반환해 주는 속성입니다. 먼 소리냐 하면, 다음 그림에서 현재 A1 셀이 선택된 상태에서 Range("A1").CurrentRegion.Select라고 하면 A1 셀과 인접해 있는 주변 셀이 모두 선택됩니다.

 

 


Cells 속성

Cells 속성을 사용해도 셀을 선택할 수 있습니다. 다음 코드를 실행하면 현재 시트의 B5 셀에 숫자 '100'을 입력합니다.

Cells(5,2) = 100

Cells 속성의 경우, Cells(행, 열)의 형식으로 표기합니다. 이것은 Range 속성의 표현 방법과는 반대 순서이므로 주의하시기 바랍니다.

Cells 속성으로 셀 범위를 참고하고자 할 경우에는 Range 속성과 조합을 해서 사용합니다.

Range(Cells(3, 2), Cells(10, 5)).Select

Cells 속성(Range 속성의 경우에도 마찬가지입니다) 앞에 아무 것도 붙이지 않으면 현재 워크시트를 대상으로 합니다. 워크시트 이름을 앞에 명기하면 당연히 지정한 워크시트에 접근한 다음 작업을 합니다. 다음은 'MySheet' 시트의 A2 셀에 지정한 값을 입력합니다.

Worksheets("MySheet").Cells(2, 1).Value = "VBA Programming"

여기서 한 가지 주의할 점이 있습니다. 만약 Cells(3, 2)라고 하면 어느 셀을 지정한다고 생각하십니까? 아마도 지금까지 공부를 제대로 해 온 분이라면,

"그것도 질문이라고... 행 방향으로 3, 열 방향으로 2만큼 이동한 곳의 셀이니까... 당연히 B3 셀이지!"

이렇게 대답하실 것입니다. 정답은, '그럴 수도 있고 아닐 수도 있다!' 입니다. 먼 소린지 알 듯 말 듯 하시지요? 어떤 범위 내에서 명령을 사용하느냐에 따라 달라진다는 의미입니다. 즉 Cells 속성 앞에 아무 것도 없이 그냥 Cells(3, 2)라고 한다면 3행과 2열이 만나는 B3 셀을 의미합니다. 하지만 앞에 단서가 붙어 있으면 사정은 달라집니다. 다음과 같은 문장이 있다고 할 경우, 어느 셀에 100이라는 값을 넣어주게 될까요?

Range("B2:E9").Cells(3, 2) = 100

Range("B2:E9").Cells(3, 2)라는 것은 B2:E9 영역 내에서 행 방향으로 3번째, 열 방향으로 2번째에 있는 셀을 의미합니다. 따라서 C4 셀에 숫자 100을 입력하게 됩니다.

Range 속성과 Cells 속성은 각각 어떤 경우 사용하면 좋은가?

지금까지 Range 속성과 Cells 속성에 대해 살펴보았습니다. 그런데 Cells 속성의 경우, 정의된 이름을 사용할 수 없고, 셀 범위를 설정할 때에도 단독으로는 사용할 수 없고 Range 속성과 조합을 해야 합니다.

잘못된 사용 예 (X)

바른 사용 예 (O)

Cells("지역별_매출").Select

Range("지역별_매출").Select

Cells(Cells(2, 1), Cells(5, 7)).Select

Range(Cells(2, 1), Cells(5, 7)).Select

그렇다면 불편하게만 보이는 Cells 프로퍼티는 뭐하러 만들어 놓았을까요?
Cells 프로퍼티의 가장 큰 장점은 인수에 숫자값을 사용할 수 있다는 것입니다. 다음과 같은 구구단 테이블을 만든다고 생각해 보세요.

만약 Range 속성만으로 이러한 것을 만들어야 한다면... 머리가 심하게 아파 옵니다(물론 불가능한 것은 아닙니다). 이런 경우, For ~ Next 반복문과 Cells 속성을 조합하면 아주 간단히 해결할 수 있습니다. 어떻게 하면 될 지 3분간 로직을 생각해 보신 다음 코드를 보시기 바랍니다.

Sub 구구단_테이블()

    Dim i As Integer
    Dim j As Integer

    For i = 2 To 9
        For j = 1 To 9
            Cells(j + 1, i - 1) = i & " X " & j & " = " & i * j
        Next j
    Next i

    Columns("A:H").AutoFit

End Sub
 

생각보다 간단하지 않습니까? (잠잠~~)

흥미진진한 Exceller의 VBA 기초 강좌는 다음에 계속됩니다. ^^;V
다음 시간에는 레인지 오브젝트를 생성하는 또 다른 몇 가지 방법에 대해 소개 드리겠습니다.
 

Previous

Next

Creative Commons License