728x90

[VBA 기초] Range, Cell 의 개념 알아보자



제가 멋모르고 공개해준 VBA를 가져다가 응용하려고 할 때 가장 막힌 부분이 셀에 대한 개념이 부족해서였습니다

물론 좋은 강좌도 많지만 개념 이해하는데 턱턱 막히는 원인을 조금이라도 해소해보고자 부족한 실력이지만 적어봅니다.

먼저 참고할만한 게시물 참조 걸게요 권현욱 Range강좌

엑셀은 셀을 다루는 프로그램입니다.



현재 커서가 위치한 셀을 ActiveCell 이라고 합니다. 이 셀이 위치한 곳을 표현하는 방법에 대해 먼저 알아보겠습니다.

Cells(행,열) 로 표현하는 데

위의 ActiveCell 의 위치를 보면 A열이고 행으로 보면 2번째 행이죠?

그럼 Cells(2,"A") 라고 표현할 수 있습니다. 또 다르게 Cells(2,1) 이라고 표현할 수도 있습니다.

Range("A2") 라고도 표현하기도 합니다.

왜 이런 시시콜콜한 걸 얘기하나면 이런 시시콜콜한 표현방법을 모르면 응용할 때 막히더라구요.

A2 셀에다가 값을 100을 집어넣어라 라는 걸 VBA로 구현하라 라고 한다면....

엑셀 띄워진 상태에서 Alt + F11 키 누르고 Visual Basic for Application 창에서 삽입 -> 모듈 눌러주세요

Sub Value_Add()
    Range("A2").Value = 100
End Sub
를 적어주고 나서 F5키를 눌러보세요 ^^



그러면 위 그림처럼 값이 기록되는 걸 볼 수 있어요.

이번에는 셀 하나만 선택하는게 아니라 여러 셀을 선택해 봅시다.

Range("A2","C5").Value = 100 이라고 수정해서 넣어보세요


그림을 보니까 A2 에서부터 C5 영역까지 모두 100 으로 채워졌군요.

이번에는 Range("A2","C5").Value = 100 대신에 Range(Cells(2,"A"), Cells(5,"C")).Value = 200 이라고 바꿔보세요.

Sub Value_Add()
    'Range("A2", "C5").Value = 100
    Range(Cells(2, "A"), Cells(5, "C")).Value = 200
End Sub




이번에는 아래 그림을 보면 값이 좀 더 많이 들어 있죠?



현재 커서가 위치한 셀이 A2 이군요. 이번에는 Range("A2").CurrentRegion.Select 라고 입력합니다.

Sub Value_Add()
    Range("A2").CurrentRegion.Select
End Sub



A2와 인접해 있는 주변셀들이 모두 선택되었군요.

여기서 D6 셀에다가 값을 400 이라고 적어보고 나서 다시 F5로 실행을 해보겠습니다.



이번에는 인접영역이 훨씬 더 넓게 선택되었군요.


아래 그림을 보면 현재 커서가 있는 셀이 A2 이죠?

육안으로 보면 마지막 행과 마지막 열이 어디인지 알 수 있습니다.

VBA 다루는 건 이렇게 육안으로 보이는 거 처리하려고 하는게 아니라 행(Row)이 5000 행이고 열(Column)이 10 정도 되는 것일 수도 있습니다. 이런 영역안에서 값을 찾아서 처리하려고 한다면 행 하단까지 전부 찾아서 기록하고, 열도 찾아서 기록하고 이런 짓을 하면 정말 힘들겠죠... 선택영역 범위를 자동으로 선택(Select)하는 방법은 없을까요?



지금까지 죽 다룬 Range 와 Cells 의 개념을 잘 조합하면 됩니다.

Range(Cells(~,~),Cells(~,~)) 라는 거 앞에서 언급한거 보셨지요?

Range 안에 앞에는 Start 지점, 뒤에는 End 지점 이라는 거 감이 잡히신다면...

Cells(~,~) 의 Cells(행,열) 을 어떻게 구해서 어떻게 표현해줄 것인가를 알면 된다 이겁니다.

Range(ActiveCell, Cells(~,~)) 라고 적을 수 있습니다. 아니면 직접 Range("A2", Cells(~,~)) 라고 해도 되구요.

그럼 여기서 Cells(행,열) 에 들어갈 마지막 행을 표기하는 방법, 마지막 열을 표기하는 방법을 알면 됩니다

Sub Value_Add()
    Range(ActiveCell, Cells(Rows.Count, "G").End(3)).Select
End Sub


G열은 육안으로 보이니까 직접 적어주는게 쉽고 편합니다.

Cells(Rows.Count, "G").End(3) 의 의미가 뭔지 알아야겠죠?

제가 열심히 설명하는 것보다는 http://rosa0189.blog.me/60145634878 게시글을 보는게 더 이해가 잘 되실 겁니다.

Cells(Rows.Count, "A") 의 의미는 A열의 마지막 행의 위치입니다.

엑셀이 제공하는 마지막 행은 엑셀 2003은 65,536 행(Row)이 있고, 2007 버전 이후로는 1,048,576 개의 행(Row) 입니다.

엑셀이 제공하는 최대 행까지 내려가라. 그런 다음에 End(3)의 의미는 End(xlUp) 으로 위로 이동하여 값이 있는 마지막 행의 위치를 의미합니다.


Range(Range("A2").End(xlDown), Range("A2")).Select 을 실행해보세요

Range(Range("A2"), Range("A2").End(xlDown)).Select 범위 지정을 이렇게 해도 결과는 동일합니다.

보통은 Range([A2], Cells(Rows.Count, "A").End(3)).Select 라는 걸 많이 사용합니다.

Range([A2], [A2].End(4)).Select 도 표현도 가능합니다.



결과는 A11 까지 선택되지 않고 중간에 공백이 있는 곳에 멈춥니다. 그러므로 범위를 어떻게 지정하느냐에 따라 결과가 달라질 수 있다는 점 알아두셔야 합니다.

여기서 중요한 거 한가지 짚고 넘어가겠습니다.

엑셀은 마침표(.)를 기준으로 앞에서 부터 뒤로 의미를 부여하여 실행된다는 겁니다.

Range("A2").CurrentRegion.Select

이 의미는 먼저 Range("A2")를 지정하고 그 다음에 CurrentRegion 을 하고 그 다음에 Select 하라는 겁니다.


Range("A2:G11").Cells(3,2).Value = 7777

이라고 한다면....


그림에서 먼저 Range("A2:G11")을 선택하고 나서 이 영역내에서 Cells(3,2) 라는 의미는 3행, 2열을 선택하는 겁니다.

아래로 3행, 우측으로 2열 그리고 나서 Value 를 7777 을 기록하라는 겁니다. 이해되시죠?


이번에는 여기에 글씨도 굵게 표시하고 폰트 크기도 14로 표기하라고 하고 싶어서 아래처럼 했습니다.

Sub Value_Add()
    Range("A2:G11").Cells(3, 2).Value = 7777
    Range("A2:G11").Cells(3, 2).Font.Bold = True
    Range("A2:G11").Cells(3, 2).Font.Size = 14
End Sub



결과는 잘 나왔습니다.

그런데 보니까 Range("A2:G11")을 반복하면서 쓰고 있네요.

좀 깔끔하게 정리하면 좋겠는데 말이죠..

Sub Value_Add()
    With Range("A2:G11")
        .Cells(3, 2).Value = 7777
        .Cells(3, 2).Font.Bold = True
        .Cells(3, 2).Font.Size = 14
    End With
End Sub


이렇게 With 에 Range("A2:G11") 을 선언하고 처리해줘도 결과는 동일하게 나옵니다.

좀 더 정리를 하면


Sub Value_Add()
    With Range("A2:G11")
.Cells(3, 2)
        .Value = 7777
        .Font.Bold = True
        .Font.Size = 14
    End With
End Sub


여기서 왜 콤마(.)가 들어간 건지는 이제 이해되시나요?


부족한 실력에 제가 Cell 개념 설명을 한다고 했는데 도움이 좀 되셨는지 모르겠군요. 제가 몸소 겪은 애로사항을 정리한다고 정리한 거라 조금은 도움이 되셨을 거라 믿습니다.

  

메서드 설 명

Clear

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

ClearContents

내용만 지웁니다.

ClearFormats

서식만 지웁니다.


이런 메서드와 연결되어 어떻게 처리되는지 감이 잡히신다면 실력향상은 금방 되실 겁니다.


아래를 실행하면 어떤 결과가 나올까요?  각자 알아서 실행해보시기 바랍니다.

Sub Value_Add()
    Range("A2").CurrentRegion.ClearContents
End Sub


If Left(Cells(i, "a"), 2) = Left(Cells(ActiveCell.Row, "a"), 2) Then '// 셀의 앞 두자가 일치하면

셀을 비교하여 원하는 결과를 얻고자 할 때 앞 두셀만 비교해야 할 경우가 생기죠.


셀의 마지막열의 값을 구하고자 하는 경우에는

lastCol = Cells(1, Columns.Count).End(1).Column

으로 하면 숫자로 표기됩니다.

마지막 열은 요긴하게 사용될 수 있습니다.


Range("C4:M" & Cells(Rows.Count, 3).End(xlUp).Row)


Set rngDB = Worksheets("B").Range("B2", Worksheets("B").Cells(Rows.Count, "B").End(3))
Set rngAll = Worksheets("A").Range("A2", Worksheets("A").Cells(Rows.Count, "A").End(3))


도움이 되었다면 댓글이나 공감 꾸욱 부탁드립니다.

블로그 이미지

Link2Me

,