본문 바로가기
엑셀(Excel)/VBA

[엑셀VBA] 셀 입력 시 자동으로 현재시간 반환해보기(출석체크 용도 등)

by Serendipity_ 2022. 12. 14.
반응형

이전에 구글스프레드 시트의 앱 스크립트로 현재시간을 반환해보았던 방법을 알아보았습니다. 

이번엔 엑셀에서 동일한 방법으로 셀에 데이터를 입력하면 현재시간을 반환해주는 것을 구현해보도록 하겠습니다. 

출석체크 등의 용도로 쓰일 수 있을 것 같습니다. 

 

2022.11.06 - [엑셀(Excel)] - [구글스프레드시트] 출석체크 자동으로 날짜 및 시간 삽입해보기

 

[구글스프레드시트] 출석체크 자동으로 날짜 및 시간 삽입해보기

요즘 회사에서 구글을 통해 업무를 많이 하실텐데요 오늘은 구글 스프레드 시트의 Apps script를 간단히 적용해보겠습니다. 엑셀 VBA와 유사한 기능이지만 언어가 JavaScript를 기반으로 한다고 하네

serendipity77.tistory.com

 

1. 엑셀VBA 환경설정(Change Event, Module생성과 다름)

  1. ALT + F11 → VBE창으로 이동
  2. Module 생성이 아닌, Sheet1 더블클릭(중요)
  3. 상단 Worksheet 클릭(하단 그림1 참조)
  4. 우측에 Change로 변경(하단 그림1 참조)
  5. 명령어 중 Worksheet_Change 이외는 삭제 

Change_이벤트를_위한_환경설정
그림1. Change 이벤트를 위한 환경설정

2. 화면예시

출석현황 아래에 어떤 데이터를 입력할 경우, 타임스탬프에 자동으로 날짜 및 시간 표시되도록 설정

그림2._출석현황_자동표시
그림2. 출석현황 자동표시

3. 코드구현

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Columns("a")) Is Nothing Then
    Target.Offset(, 1) = Now
End If

End Sub

4. 코드설명

가. 변수설명

- 현재 변수는 Target으로 설정되어 있으므로 따로 잡아줄 필요가 없습니다. 

ByVal Target As Range

 

나. Intersect 구문 설명

- Intersect의 경우, 교차하는 경우에 대한 설명입니다. 

- Target셀이 변수이고, Columns열(현재 A열)과 교차할 때 이벤트가 발생되도록 명령하였습니다. (그림3 참고)

If Not Intersect(Target, Columns("a")) Is Nothing Then

- Not ~~ nothing의 경우, 이중부정으로 교차할 때를 강조하는 문구입니다.

- 이중부정 구문을 안써줘도 될 것 같지만 그런 경우 작동을 하지 않습니다. Intersect를 쓸 땐 이중부정을 쓴다 정도로 암기해주시면 될 것 같습니다. 

그림3.Intersect구문_설명
그림3. Intersect구문 설명

. Offset구문 설명

Offset(0, 1)의 경우, 열 방향으로 오른쪽으로 한칸 이동이라는 뜻입니다. (0은 생략가능)

또 다른 예로, Offset(1,0)의 경우에는 행 방향으로 아래로 한칸 이동이라는 뜻입니다.

 

관련해서는 이전 발행글인 VBA나 엑셀 함수에서 다루었으니 참고해주시길 바랍니다. 

라. Now 함수 설명

 

Now의 경우, 현재 날짜 및 시간을 말합니다.

Format함수를 통해 시간형태를 수정할 수 있습니다.

Format(Now, "hh:mm")

Now 뒤에 셀 서식에 나오는 형태로 변경하여 주면 원하는 형태로 나타납니다.

현재의 경우, 시간 및 분만 나오도록 변경한 예시입니다. ("hh:mm")

 

5. 코드 보완하기

데이터를 지우면 데이터를 지운 이벤트도 이벤트로 인식해서 숫자가 나타나게 됩니다. 

 

그림4,데이터_삭제_시_불필요한_시간_표시
그림4, 데이터 삭제 시 불필요한 시간 표시

셀에 하나이상의 명령어를 수행하는 경우, 이벤트 동작이 수행되지 않도록 명령어 넣어주었습니다.

If Target.Cells.Count > 1 Then Exit Sub

6. 최종코드

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Columns("a")) Is Nothing Then

    Target.Offset(, 1) = Format(Now, "hh:mm")

End If

End Sub

 

반응형

댓글