1편에서 간격이 변경되더라도 매크로로 구한 DateAdd함수의 값이 바뀌지 않는다는 문제점을 지적했는데 이 것을 해결하는 방법을 알아보겠습니다.
1. Sheet1에 매크로 작성
일반적으로 매크로는 엑셀 파일 내에서 공통적으로 사용할 수 있도록 모듈을 추가한 다음 그곳에서 작성하는데 이렇게 하면 워크시트의 내용이 바뀌더라도 영향이 없습니다.
따라서, 탐색기 창에서 Sheet1을 더블 클릭한 후
오른쪽 에디터에서 일반을 누른 후 Worksheet객체를 선택하고,
오른쪽에서 Change 이벤트를 선택하면
자동으로 Private Sub Worksheet_Change 프러시저가 생갑니다
Worksheet_Change 프로시저이므로 워크시트 셀의 내용이 변할 때 이뤄지는 동작을 그 안에 기술하는 것입니다.
그 아래에 있는 아래 부분은 필요 없으므로 지워도 됩니다
Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub |
2. 코드 작성
Private Sub Worksheet_Change(ByVal Target As Range)
Dim interval_range As Range
Set interval_range = Range("F2:F5")
If Not Application.Intersect(interval_range, Target) _
Is Nothing Then
Call dateadd1
End If
End Sub
3. 코드 설명
Dim interval_range As Range Set interval_range = Range("F2:F5") |
값이 변할 부분을 지정해야 하는데, 변수명을 interval_range로 해서 범위 형식으로 지정하고,
interval_range를 F2셀에서 F5셀까지로 지정합니다.
If Not Application.Intersect(interval_range, Target) _ Is Nothing Then Call dateadd1 End If |
If Not Application.Intersect(interval_range, Target) Is Nothing Then
: Intersect란 교집합이라는 의미인데, interval_range와 Target의 겹치는 부분이 없는 것(Nothing)이 아니라면(Not)이니까, 겹친다면이 됩니다.
Target은 커서가 위치하고 있는 셀이므로, "현재 셀이 F2셀에서 F5셀 사이에 있다면"이 됩니다.
F2에서 F5셀사이의 값이 바뀌어야 If문이 작동하지 다른 셀의 값은 변해도 작동하지 않습니다.
조건문이 길어지기 때문에 _를 문장 맨 뒤에 넣어서 두 줄로 만들었습니다.
Call dateadd1 : 1편에서 모듈에 있던 dateadd1 매크로를 호출, 실행하라는 의미입니다.
따라서, F2에서 F5셀사이 셀의 값이 변경되면 dateadd1 매크로가 실행돼서 i2셀에서 i5셀의 내용이 달라집니다.
4. 코드 실행
이제 F2셀부터 F5셀의 값, interval을 yyyy에서 m, q, d, h로 바꾸면
3달 후, 3분기 후, 3일 전, 3시간 전으로 i열의 값이 자동으로 바뀝니다.
G2셀의 값을 바꾸면 H2셀의 값만 바뀔 뿐 i2셀의 값은 변하지 않습니다.
그러면 interval_range의 값을 F2:G5로 변경하면 됩니다.
'EXCEL - VBA' 카테고리의 다른 글
두 문장의 같은 단어 비교(2) - 매크로 실행, 디버그 (0) | 2023.05.09 |
---|---|
두 문장의 같은 단어 비교(1) - 매크로 작성 (3) | 2023.05.08 |
DateAdd함수 - 지정된 기간만큼 떨어진 날짜를 반환(1) (0) | 2023.04.18 |
날짜간의 차이 계산(4) - VBA DateDiff 함수 (0) | 2023.04.10 |
일정한 간격으로 된 값 합계 구하기 - 매크로 (2) | 2023.03.21 |