이번 글에서는 엑셀에서 내용이 변경되면 셀 색깔을 자동으로 변경하는 방법에 대해서 알아보도록 하겠습니다. 매크로를 이용한 프로그래밍이 필요하지만 전혀 어렵지 않으며 단순 코드를 복사 붙여넣기만 해도 사용할 수 있습니다.
엑셀을 이용한 업무를 하다보면 여러 사람이 같이 작업을 해야 할 때가 있습니다. 이 때 다른 사용자가 변경한 내용에 대해서 알 수 있는 방법이 없기 때문에 별도의 파일로 변경이력을 관리하는 경우가 많습니다. 이럴 때 사용자가 내용을 변경하면 변경된 셀의 스타일이 자동으로 변경될 수 있다면 훨씬 효과적으로 업무를 할 수 있을 것입니다. 엑셀에서 제공하는 매크로 기능을 활용하여 해당 기능을 구현해 보도록 하겠습니다.
내용이 변경되면 셀 색깔을 자동으로 변경
해당 기능은 엑셀 VBA를 이용합니다. 따라서 저장할 때 ‘매크로 사용 통합 문서’ 형태로 저장하여야 합니다.
[Alt] + [F11] 버튼을 누르면 위 그림과 같이 VBA 에디터가 실행되며 현재 열려있는 엑셀 파일 목록이 왼쪽 프로젝트 창에 표시됩니다. 앞서 저장한 파일명 아래에 시트 목록이 나오는데 기능을 적용할 시트를 오른쪽 마우스 클릭을 한 뒤 ‘코드 보기’ 메뉴를 선택합니다.
화면의 중앙에 코드를 작성할 수 있는 창이 뜨게 됩니다. 에디터 상단에 두 개의 드롭박스가 있습니다. 왼쪽에는 ‘일반’, 오른쪽에는 ‘선언’ 이라고 되어 있습니다. 일반부터 순차적으로 선택하여 각각 다음의 목록을 선택해 줍니다.
- 일반 : Worksheet
- 선언 : ChangeChange
실제로 선언 부분을 보면 SelectionChange 외 다양한 메뉴가 있습니다. 이름을 보면 알 수 있듯이 사용자가 마우스나 키보드를 조작할 경우 이를 인지하고 이벤트가 발생한 상황에서 실행할 코드를 작성할 수 있도록 해 주는 것들입니다.
셀의 내용이 변경되면 스타일을 바꾸는 작업을 하기 위해서 우리가 필요한 이벤트는 ‘Before Change’ 정도 되는 내용일텐데 아쉽게도 해당 선언은 제공되지 않습니다. 그래서 우리는 약간의 트릭을 사용하여 우리가 원하는 기능을 구현해 보도록 하겠습니다.
최종코드
Private Sub Worksheet_SelectionChange(ByVal Target As Range) prevRange = Range("A1").Value prevValue = Range("B1").Value currValue = Range(prevRange).Value If Not currValue = prevValue Then Range(prevRange).Interior.ColorIndex = 4 End If Range("A1").Value = ActiveCell.Address Range("B1").Value = ActiveCell.Value End Sub
프로그래밍 전략
프로그래밍 전략은 다음과 같습니다.
- 선택되는 셀이 바뀔때마다 해당 셀의 주소와 내용을 특정 위치 (A1, B1)에 기록, 저장한다. 이것은 초기값이다.
- 새로운 셀이 선택되고 셀의 주소와 내용이 기록되기 전, 그 사이에 기록된 내용과 해당 주소에 내용이 달라진 것이 없는지 판단한다.
- 만약 바뀐 내용이 있다면 해당 셀의 색깔을 바꿔준다.
- 작업을 수행한 뒤 셀 주소와 내용을 현재 선택된 셀의 내용을 업데이트 한다.
일종의 데이터베이스를 구축하여 이전 셀의 내용과 위치를 기억하고 있고 셀의 선택되는 위치가 바뀔때마다 해당 데이터베이스를 업데이트하기 전에 이전에 기록된 내용과 바뀐것은 없는지 비교하는 방법으로 접근하였습니다.
실제 사용
이제 해당 기능이 적용된 시트(Sheet1)으로 이동해서 셀을 무작위로 선택해 보면 A1과 B1의 내용이 바뀌는 것을 볼 수 있습니다. A1에는 선택한 셀의 위치(주소)가 기록되며, B1에는 셀의 내용이 기록됩니다.
그리고 셀의 내용을 변경하게 되면 변경된 셀의 색이 녹색으로 바뀌게 됩니다.
만약 A1, B1의 내용이 바뀌는 것을 보여주고 싶지 않다면 첫번째 행을 숨김처리 하거나 글씨색을 흰색으로 바꿔주면 더욱 깔끔하게 구현할 수 있습니다.