1. 문제
차량이 여러 대 있는데, 도착하는 순서대로 B열에 파란색을 칠하면
'미도착'을 '도착'으로 바꾼 다음
맨 처음인 경우는 해당 행을 2행으로 이동하고
그다음부터는 파란색 다음(아래) 행으로 이동하는 것을 반복한다고 가정해 보겠습니다.
2. 해결 방안
색이 변하면 할 때 생각나는 것이 Worksheet_SelectionChange 이벤트입니다.
그리고, 파란색이 여러 개일 경우 맨 아래로 배치되어야 하므로 For Each 문을 반복해서 파란색인지 체크하는 구문이 필요합니다.
가. 개발 도구
개발 도구를 클릭한 후 Visual Basic을 누르고,
완료여부체크.xlsx 파일의 Sheet1을 클릭합니다.
그리고, 오른쪽 '일반'이라고 쓰여 있는 곳을 누르면 Worksheet가 있는데 선택하면
'선언'이라고 쓰여 있는 부분이 SelectionChange로 바뀝니다.
SelectionChange는 단어 그대로 '선택이 바뀌면'이라는 의미입니다.
그리고, 그 아래 Private Sub 다음에 Worksheet_SelectionChange(ByVal Target As Range)가 만들어지고,
End Sub로 끝납니다.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub |
Worksheet_SelectionChange 서브 프로세스의 인자로는 Target이라는 범위 변수가 입력되어 있습니다.
여기서 Target은 '새롭게 선택된 범위'를 말합니다.
나. 작업 순서
선택된 셀의 색이 파란색이면
그 행을 잘라서(Cut)
B2셀부터 파란색인지 체크해서
파란색이 아니면 그 행에 끼워 넣으면 됩니다.
(1) 선택된 셀의 색이 파란색인지 체크
(가) 색에 해당하는 숫자 구하기
홈 탭에서 배경색을 칠하기 위해 '채우기 색' 부분을 누른 다음 맨 아래 줄에서 파란색을 선택합니다.
정확하게 색에 해당하는 숫자를 알려면
VBA의 직접 실행 창에서
?activecell.Interior.Color라고 입력하고 엔터 키를 누르면 됩니다.
꽤 큰 숫자인 15773696이 구해집니다.
혹시 파란색, vbBlue인가
?activecell.Interior.Color = vbblue로 확인해 보니
False라고 나옵니다.
하늘색 비슷한 색을 칠하기 위해서는
activecell.Interior.Color = vbcyan라고 입력하면 됩니다.
여기서는 홈 탭에서 배경색을 vbCyan과 비슷한 색, 색 번호 15773696으로 하겠습니다.
(나) 조건문
if target.interior.color = 15773696 then라고 입력하면 됩니다.
"선택셀의 배경색이 15773696이라면"의 의미입니다.
(2) Target 셀의 내용을 "도착"으로 변경
Target = "도착"
(3) 그 행을 잘라서(Cut)
Rows(Target.Row).Cut 이라고 하면 됩니다.
지금까지 완성된 것은
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Interior.Color = 15773696 Then
Target = "도착"
Rows(Target.Row).Cut
End If
End Sub
(4) B2셀에서 B1000셀까지 반복
셀을 반복해야 하므로
c를 range 변수로 선언하고(Dim c as Range),
찾을 범위는 B2셀에서 B1000셀까지로 지정하고
For Each문을 이용해 반복합니다.
For Each c In Range("B2:B1000")
Next
그러면 지금까지의 구문은 아래와 같습니다.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
If Target.Interior.Color = 15773696 Then
Target = "도착"
Rows(Target.Row).Cut
For Each c In Range("b2:b1000")
Next
End If
End Sub
(5) 파란색이 아닌 곳에 끼워 넣음
if c.Interior.Color <> 15773696 then
Rows(c.Row).Insert
end if
(6) 반복문을 종료
그리고 반복문을 종료해야 하므로
Rows(c.Row).Insert
다음에 Exit For를 넣습니다.
3. 전체 코드
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
If Target.Interior.Color = 15773696 Then
Target = "도착"
Rows(Target.Row).Cut
For Each c In Range("b2:b1000")
If c.Interior.Color <> 15773696 Then
Rows(c.Row).Insert
Exit For
End If
Next
End If
End Sub
4. 작동 동영상
B3셀에 배경색으로 파란색을 칠하고 B2셀을 갔다 와야 3행이 2행으로 이동합니다. 한 템포 느립니다.
다시 B4셀에 파란색을 칠하고, B5셀을 갔다가 B4셀로 오면 비로소 3행으로 이동합니다.
혹시나 해서 "도착"이란 글자를 쓰면 입력되는 순간 비교하지 않을까 해서 바꿔봤데도 한 템포 느린 것은 같습니다.
If Target.Value = "도착" Then
Target.Interior.Color = vbCyan
Rows(Target.Row).Cut
For Each c In Range("b2:b1000")
If c.Interior.Color <> vbCyan Then
Rows(c.Row).Insert
Exit For
End If
Next
End If
그렇다면 색으로 하는 것이 좋습니다.
그리고, 서식 복사를 이용해서 B2셀의 서식을 B4셀에 적용하면 바로 이동하니 참고 바랍니다.
5. 저장 파일 형식
매크로가 포함되어 있으므로 매크로 사용 통합 문서(*.xlsm)로 저장해야 합니다.
'EXCEL - VBA' 카테고리의 다른 글
범위를 지정하는 방법(2) - Selection (0) | 2025.02.21 |
---|---|
범위를 지정하는 방법(1) - Application.InputBox (0) | 2025.02.20 |
표에서는 '복사한 셀 삽입'이 안되네요... (0) | 2025.02.18 |
알PDF에서 페이지별로 시트를 나눌 수밖에 없는 이유 (2) | 2025.01.27 |
셀 값이 바뀔 때 처리(Worksheet_Change) (0) | 2024.08.29 |