EXCEL - VBA

지정된 색이 포함된 행을 위로 올리기

별동산 2025. 2. 19. 08:45
반응형

1. 문제

차량이 여러 대 있는데, 도착하는 순서대로 B열에 파란색을 칠하면

'미도착'을 '도착'으로 바꾼 다음 

맨 처음인 경우는 해당 행을 2행으로 이동하고

그다음부터는 파란색 다음(아래) 행으로 이동하는 것을 반복한다고 가정해 보겠습니다.

 

완료여부체크.xlsx
0.01MB

 

 

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)로 저장해야 합니다.

 

완료여부체크.xlsm
0.01MB

반응형