미해결 M365윈도우
dynamic range 질문
vba 챌린지 하고 있는데요 dynamicrange라는게 그냥 범위만 잡아주는 건가요? 마우스로 드래그해서 범위 설정하는거 같이 범위가 직접적으로 보여지지는 않나요? 아무 셀 클릭하고 =dynamicrange 이렇게는 해봤는데 안되는거 같더라구요
vba 챌린지 하고 있는데요 dynamicrange라는게 그냥 범위만 잡아주는 건가요? 마우스로 드래그해서 범위 설정하는거 같이 범위가 직접적으로 보여지지는 않나요? 아무 셀 클릭하고 =dynamicrange 이렇게는 해봤는데 안되는거 같더라구요
댓글 2
형태로 함수를 선언하면 시트 함수로 동작할 수 있습니다.
안녕하세요~
동적 범위(Dynamic Range)에 대해 자세한 설명을 듣고자 하시는 거 같습니다.
1. 먼저 상대적으로 정적 범위 (Static Range)는 하드코딩된 주소라고 볼 수 있는데,
예를 들어 A2:A30까지를 B1에 합계를 넣는다고 할 때,
데이터의 끝은 30행으로 고정되어 있고 B1에 그 합계값을 넣고, 그 이상으로 늘어나면 코드를 직접 수정(하드코딩)해야 하므로 확장성이 없다고 볼 수 있습니다.
Option Explicit
Sub 합계()
Dim ws As Worksheet
Dim sumA As Double
Dim i As Long
Set ws = ActiveSheet
sumA = 0
'// A2부터 A30까지 고정 순회
For i = 2 To 30
sumA = sumA + ws.Cells(i, "A").Value
Next i
'// 결과값을 B1에 고정 출력
ws.Range("B1").Value = sumA
End Sub
2. 반면에 계속 이 합계의 범위가 달라지는 동적 범위(Dynamic Range)라고 한다면
VBA가 실행되는 시점에 데이터의 끝(EndRow)을 계산하여 범위를 유연하게 설정하는 구조입니다.
데이터의 증감에 코드가 자동 대응하므로 유지보수성이 높다고 할 수 있습니다.
Option Explicit
Sub 합계()
Dim ws As Worksheet
Dim sumA As Double
Dim i As Long
Dim eRow As Long '// 데이터의 마지막 행을 담을 변수
Set ws = ActiveSheet
sumA = 0
'// A열의 마지막 데이터 행 위치 탐색 (xlUp 사용)
eRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'// A2부터 계산된 eRow까지 유동적 순회
For i = 2 To eRow
sumA = sumA + ws.Cells(i, "A").Value
Next i
'// 마지막 데이터까지의 결과를 B1에 출력
ws.Cells(1, "B").Value = sumA
End Sub
이렇게 코딩할 수 있습니다.
보다 속도의 최적화를 원한다면,
Dim rngTarget As Range
Set rngTarget = ws.Range("A2:A" & eRow)
ws.Cells(1, "B").Value = Application.Sum(rngTarget)
이렇게 확장할 수도 있습니다.
3. 일단 동적 범위를 설계할 때는 변수(eRow)를 통해 좌표를 유연하게 만드는 것에서 출발해서, 동적 좌표를 Range("A2:A" & eRow) 형태로 묶어 배열이나 내장 함수로 던지는 방식으로 발전시킬 필요도 있습니다.