Dim rng as Range
Excel VBA 메크로를 만들 때 가장 중요한 개체 중 하나가 Range 개체입니다. 당연할 수 밖에 없는게, 엑셀의 계층 구조상 값이 입력되는 기본 단위가 셀(cell)이고, 이 셀들이 모인 개체가 Range이기 때문입니다.
Range 개체와 Range 속성은 다른 개념이며 둘은 완전히 일치하는 것이 아닙니다. 'Range 개체'를 만들거나 접근하는 방식이 반드시 'Range' 속성만 있는 것은 아니기 때문입니다. Cells, Rows, Columns 같은 속성도 Range를 만듭니다.
그냥 지금 쉽게 Range 속성을 사용하면 Range 개체가 만들어진다는 정도만 알아 두셔도 됩니다.
Range 개체니 속성이니 매서드니 하는 말들이 이해가 안되시는 수준의 분들은 그냥 range=셀 범위라고 생각하고 글을 보시기 바랍니다.
(1) Range 속성을 이용한 Range 개체 접근법
Range 변수를 선언하고
Dim rng as Range
원하는 셀, 혹은 셀 범위를 변수에 할당합니다.
Dim rng_1 as Range
Dim rng_2 as Range
Dim rng_3 as Range
Dim rng_4 as Range
Dim rng_5 as Range
Dim rng_6 as Range
Dim i as integer
Dim j as integer
Dim col as string
set rng_1 = ActiveWorksheet.Range("A1")
set rng_2 = ActiveWorksheet.Range("A1:B3")
set rng_3 = Activeworksheet.Range("A1", "B2")
set rng_4 = ActiveWorksheet.Range("A" & i)
set rng_5 = ActiveWorksheet.Range("A" & i & ":C" & j)
set rng_6 = ActiveWokrsheet.Range(col & i & ":" & col & j)
ActiveWorksheet.는 넣지 않아도 현재 워크시트를 대상으로 선택하지만 개인적으로는 넣는 것을 선호합니다. 여러 시트에서 작업할 때 변수의 의미를 분명하게 해 줍니다.
변수에 Range 개체를 할당할 때에는 앞에 set 명령을 사용합니다.
Range 속성에 들어가는 셀 범위는 문자(string) 타입으로 입력된다고 보시면 됩니다. 위의 6가지 경우를 살펴보겠습니다.
rng_1 : hard coding으로 셀 하나를 선택하는 방식입니다.
rng_2 : hard coding으로 연속된 범위의 셀들을 선책하는 방식입니다.
rng_3 : hard coding으로 연속되지 않은 범위의, 혹은 단독의 셀 값들을 선택하는 방식입니다.
rng_4 : 행 번호에 soft coding이 반영되었습니다. i라는 변수값에 따라 행 번호를 할당받습니다. for문을 순환하기 좋은 구조입니다.
rng_5 : 1*n의 범위를 넘어서 n*m의 범위의 셀들을 동적으로 선택할 때 좋은 방식입니다. range개체 안의 입력값이 string이라 생각하시고 & 연산을 사용하신다고 이해하면 되겠습니다.
rng_6 : 행 번호뿐 아니라 열 번호도 soft coding된 Range 개체입니다. 열 번호를 찾는 방법은 아래 링크를 참조하시기 바랍니다.
https://programming-of-pipefitter.tistory.com/3
자주 쓰는 VBA 패턴 (3) - 찾고 있는 값의 열 번호를 알파벳으로 반환
VBA로 코드를 짜다 보면, C에 개체 대신 반드시 Range 개체를 사용하고 싶을 때가 있다. Range 개체는 열 번호를 엑셀의 알파벳 값으로 받기 때문에 ( )안의 값 을 하드 코딩하지 않고 변수로 처리하려
programming-of-pipefitter.tistory.com
참고로 Cells()속성을 이용하여 얻은 셀 위치를 Range 속성 안의 파라미터에 넣는 방식으로도 Range 개체에 접근할 수 있습니다. Cells 속성으로는 복수의 셀에 대해 접근이 안되기 때문에(이럴거면 왜 Cell's'라고 했는지..) Range 속성과의 결합이 필수적입니다.
Dim rng_7 as Range
set rng_7 = ActiveWorksheet.Range(Cells(4,2))
rng_7은 워크시트의 4행 2열, 즉 Range(B4)를 할당받았습니다.
(2) Range 개체의 값에 접근 (Range("??:??"))
Range 개체의 값에 접근하기 위해서는 .Value라는 매서드를 사용합니다.
1) 한 개의 셀을 가지는 Range의 값에 접근
아주 쉽습니다. 끝에 .value 만 붙여 주면 됩니다.
Sub SingleCellValue()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim cellValue As Variant
cellValue = ws.Range("A1").Value
Debug.Print cellValue
End Sub
2). 다수의 셀을 가진 Range 개체의 값에 접근
for 문을 사용합니다.
Sub RangeValues()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim rng As Range
Set rng = ws.Range("A1:B2")
Dim cell As Range
For Each cell In rng
Debug.Print cell.Value
Next cell
End Sub
배열을 이용하여 접근할 수도 있습니다.
Sub RangeValuesArray()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim rng As Range
Set rng = ws.Range("A1:B2")
Dim values As Variant
values = rng.Value
Dim i As Long
Dim j As Long
For i = 1 To UBound(values, 1)
For j = 1 To UBound(values, 2)
Debug.Print values(i, j)
Next j
Next i
End Sub
rng 변수에 Range 개체를 할당하고, values 변수에 이 Range개체의 값들을 할당합니다. value는 2차원 배열의 값으로 나올 것입니다.
3) 행 전체, 열 전체에 접근
아래와 같은 코드를 사용합니다.
Range("A:A") '하나의 열 전체에 접근
Range("A:A", "B:C", "E:E") '다수의 열 전체에 접근
Range("1:1") '행 전체 접근
Range("1:1", "3:3", "7:9") '다수의 행 전체에 접근
당연히 1과 같은 방식의 soft coding도 가능합니다.
(3) 복사/붙여넣기/잘라내기(.Copy, .PasteSpecial, .Cut)
Range 개체의 값들을 복사하여 붙여넣습니다.
Range("A1:A10").Copy Destination:=Range("B1")
Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteAll
첫 번째 줄의 코드는 A1:A10 범위의 셀을 복사해서 B1에 붙여 넣습니다. 클립보드에 복사한 값을 저장해 놓지 않고 바로 붙여넣기를 실행합니다.
2-3번째 줄의 코드도 결과는 마찬가지입니다만 PasteSpecial 매서드는 여러 옵션을 가지고 있습니다.
PasteSpecial 매서드에 대해서는 별도로 포스트하겠습니다.
잘라내기의 경우 .Cut 매서드를 사용합니다.
(4) range 영역 선택하기(.Select)
.Select 매서드를 이용하여 설정한 범위의 Range개체를 선택할 수 있습니다.
이렇게 선택한 Range 개체는 Selection이라는 값으로 다른 매서드를 받는 등 활용할 수 있습니다.
.CurrentReigion.Select를 이용하면 지정한 레인지 개체의 상하좌우 범위를 공백 전까지 찾아줍니다. 엑셀에서 Ctrl+A했을 때와 같은 결과물을 가져다 준다고 이해하시면 됩니다.
(5) 내용 지우기(.Clear)
Clear 매서드를 사용합니다.
Range.Clear : 모든 값들을 지웁니다.
Range.ClearContents : 셀들의 내용을 지웁니다.
Range.ClearFormats : 셀들의 서식을 지웁니다.
'vba' 카테고리의 다른 글
| 자주 쓰는 VBA 패턴 (5) : 해더에서 원하는 값 찾아 열 번호로 반환 (0) | 2023.08.07 |
|---|---|
| 자주 쓰는 VBA 패턴 (4) : VBA로 index match 함수 구현하기 (0) | 2023.08.02 |
| 자주 쓰는 VBA 패턴 (3) - 찾고 있는 값의 열 번호를 알파벳으로 반환 (0) | 2023.08.01 |
| 자주 쓰는 VBA 패턴 (2) - 마지막 행, 마지막 열 찾기 (0) | 2023.07.31 |
| 자주 쓰는 VBA 패턴 (1) - 찾는 값이 배열 안에 있는지 확인 (0) | 2023.07.30 |