본문으로 바로가기

어떤 분께서 스마트폰 문의로 질문을 해와서 잠깐 생각을 해봤는데, 이런 경우가 많이 있을 것도 같습니다. 특정 셀의 값이 지속적으로 변경되는데(자동/수동) 이 값을 기록해두고 싶다는 문의였습니다. 원래는 이런 경우에는 DB를 구성해서 자동화하는 것이 바람직하지만, 엑셀로도 충분히 가능합니다. 다만 일반적인 워크시트 작업으로는 안되고, VBA를 활용해야 합니다. (셀값이 변경된다는 이벤트를 잡아야하기 때문에 프로그램이 실행되어야 하는 것이죠.) 방법을 한번 알아볼까요?



원래 문의는 같은 시트의 특정 열에 계속 추가하는 것이었지만 여기서는 별도의 시트에 계속 기록을 남기는 것으로 해보겠습니다. 코드를 보시면 충분히 활용하실 수 있을 것입니다.


아래 과정을 잘 따라서 해보세요.


1. 새로운 통합 문서를 만들고 "원본"과 "기록"이라는 시트를 만듭니다. (시트 이름 변경) 그 후 다른이름으로 저장을 선택한 후 파일 형식을 "Excel 매크로 사용 통합 문서"인 xlsm 형식으로 바꿔서 저장합니다. VBA를 사용하려면 이 파일 형식을 반드시 사용해야 합니다.



2. 시트탭에서 "원본"시트를 마우스 오른쪽으로 클릭한 후 "코드 보기"를 선택합니다. 단축키인 Alt+F11을 눌러도 되겠죠? ^^



3. VBA 편집기가 실행되면, "원본" 시트가 선택되었는지 확인하고 아래 코드를 복사합니다.



공부를 위해서 실제 타이핑을 해서 코드를 만들어보는게 좋지만, 급한 분들은 아래 코드를 복사해서 사용하면 됩니다.

Private Sub Worksheet_Change(ByVal Target As Range)

 If Not Intersect(Target, Range("A1")) Is Nothing Then

  With Sheets("기록")

   lr = .Cells(Rows.Count, "A").End(xlUp).Row

   If Range("A1").Value <> .Cells(lr, "A") Then

    .Cells(lr + 1, "A").Value = Range("A1").Value

    .Cells(lr + 1, "B").Value = Now

   End If

  End With

 End If

End Sub


또하나 주의할 점은 위 코드는 수동으로 셀의 값을 입력/변경한 경우의 이벤트를 잡을 수 있는 것인데, 만약 함수나 기타 자동으로 값이 변경된다면 아래 코드를 사용해야 합니다. 두 코드를 동시에 모두 삽입하시면 안됩니다.


Private Sub Worksheet_Calculate()

 With Sheets("기록")

  lr = .Cells(Rows.count, "A").End(xlUp).Row

  If Range("A1").Value <> .Cells(lr, "A") Then

   .Cells(lr + 1, "A").Value = Range("A1").Value

   .Cells(lr + 1, "B").Value = Now

  End If

 End With

End Sub


자 이제 VBA 편집기는 저장해서 나오고 "원본"시트의 A1에 값을 계속 수정하면서 입력해보세요. "기록" 시트의 A열에는 변경된 값이 차례로 기록되고, 덤으로 B열에는 그 값이 변경된 시각이 입력됩니다. 간편하지만 매우 놀라운 기능으로 활용할 수 있겠죠?




VBA에는 간단한 구문이면서도 매우 강력한 오피스 제품과의 통합을 지원합니다. 기록되는 시트와 위치를 변경해보고, 다른 추가적인 기능들도 응용해서 활용할 수 있기를 기대합니다!