엑셀 오늘 날짜 자동 입력 방법
IF 함수와 반복계산 설정을 활용하여 오늘 날짜와 시간을 자동으로 입력하는 방법에 대해 알아봅니다.
이 강의에서는 엑셀에 오늘 날짜와 현재 시간을 자동으로 입력하는 세 가지 방법을 단계별로 다룹니다. 단축키 입력부터 IF 함수와 반복 계산을 결합한 자동 입력 수식, Worksheet_Change 이벤트를 활용한 VBA 매크로까지 살펴보고, 순환 참조로 발생하는 처리 속도 문제와 완료 여부를 지운 뒤에도 기록을 유지하는 응용 공식을 함께 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
엑셀 날짜 입력 단축키
엑셀에서는 단축키를 활용해 오늘 날짜와 현재 시간을 빠르고 정확하게 입력할 수 있습니다. 단축키로 날짜·시간을 입력하면 해당 셀에 적용되어 있던 서식은 초기화되므로 이 점은 미리 알아두어야 합니다.
- 오늘 날짜 입력하기
단축키 : Ctrl + ;

- 현재 시간 입력하기
단축키 : Ctrl + Shift + ;

- 오늘 날짜 + 현재 시간 입력
단축키 : Ctrl + ; → Space → Ctrl + Shift + ;

현재 시간 자동입력 공식
오늘 날짜나 현재 시간을 매번 수동으로 입력해야 한다면, 함수를 활용해 작업 시간을 대폭 줄이고 자동화할 수 있습니다. 다만 함수로 오늘 날짜 자동 입력을 구현하려면 해당 파일에서 수식의 반복 계산을 허용해야 합니다.
반복 계산을 허용한다는 것은 곧 수식의 '순환 참조'를 허용한다는 의미입니다. 따라서 사용자가 의도치 않게 순환 참조가 포함된 수식을 입력하면 파일의 처리 속도가 느려질 수 있다는 점에 주의해야 합니다.
엑셀 순환 참조가 발생하는 원인과 해결 방법에 대한 자세한 설명은 아래 관련 포스트를 참고해 주세요.
- 예제파일에서 E5 셀을 선택한 뒤 아래 수식을 입력하고, 채우기 핸들로 아래쪽 셀까지 자동 채우기를 적용합니다.
=IF(D5<>"",IF(E5="",TODAY(),E5),"")

- 이 수식은 E5 셀(자기 자신)을 참조하는 구조이므로, D5 셀에 완료 여부 "O"를 입력하면 '순환 참조로 인해 올바르게 계산하지 못할 수 있습니다'라는 경고 메시지가 표시됩니다.

- [파일] – [옵션] – [수식] 메뉴로 이동한 뒤 '반복 계산 사용' 옵션을 활성화하고 [확인] 버튼을 클릭해 설정을 적용합니다.

- 이후 완료 여부 열에 "O"(또는 다른 값)을 입력하면 배송일 셀에 오늘 날짜가 자동으로 입력됩니다.

- 오늘 날짜 대신 현재 시간을 입력하려면 수식의 TODAY 함수를 NOW 함수로 변경하면 됩니다.
=IF(D5<>"",IF(E5="",NOW(),E5),"")
VBA로 현재 시간 자동 입력하기
함수를 사용해 오늘 날짜 자동 입력을 구현하면, 해당 파일이 열려 있는 동안 '반복 계산'이 허용되므로 순환 참조가 발생한 셀로 인해 파일의 처리 속도가 느려지는 문제가 생길 수 있습니다.
다만 이러한 문제는 해당 파일을 다시 열 때 엑셀이 순환 참조를 자동으로 감지해 안내 메시지를 표시해 주므로, 비교적 쉽게 확인하고 해결할 수 있습니다.
반복 계산에 따른 부작용 없이 보다 안정적으로 자동화를 구현하고 싶다면 아래 VBA 매크로를 사용하는 것이 좋습니다.
- [개발 도구] – [Visual Basic]을 클릭하거나 단축키 Alt + F11 을 눌러 매크로 편집기를 엽니다. 리본 메뉴에 [개발 도구] 탭이 보이지 않는다면, 아래 개발 도구 활성화 관련 포스트를 참고해 활성화하세요.
- VBA 편집기 좌측 프로젝트 창에서 오늘 날짜 자동 입력을 적용할 시트를 찾아 더블클릭합니다. 시트를 더블클릭하면 해당 시트의 코드 모듈이 활성화됩니다.

- 아래 명령문을 복사한 뒤 해당 시트 모듈 안에 붙여 넣습니다.
Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range: Dim TimeRng As Range: Dim DateRng As Range: Dim dtRng As Range Dim tC As Long: Dim dC As Long: Dim R As Long On Error Resume Next Application.EnableEvents = False Set Rng = Me.Range("D:D") '<-- 오늘 날짜/시간이 입력되도록 감지할 범위를 입력합니다. Set DateRng = Me.Range("E:E") '<-- 오늘 날짜가 입력될 범위입니다. (또는 날짜가 입력될 범위가 없을 경우 문장을 삭제) Set TimeRng = Me.Range("F:F") '<-- 오늘 시간이 입력될 범위입니다. (또는 시간이 입력될 범위가 없을 경우 문장을 삭제) Set dtRng = Me.Range("G:G") '<-- 오늘 시간/날짜가 모두 입력될 범위입니다. (또는 범위가 없을 경우 문장을 삭제) If Not Intersect(Target, Rng) Is Nothing Then '행 삭제 시 데이터가 초기화 되는 문제를 해결하려면, 아래 코드를 추가합니다. 'If IsNull(Target.Text) Then Exit Sub If Target.Text <> "" Then R = Target.Row If Not IsEmpty(DateRng) Then dC = DateRng.Column: Me.Cells(R, dC).Value = Date If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = Time If Not IsEmpty(dtRng) Then tC = dtRng.Column: Me.Cells(R, tC).Value = Now Else R = Target.Row If Not IsEmpty(DateRng) Then dC = DateRng.Column: Me.Cells(R, dC).Value = "" If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = "" If Not IsEmpty(dtRng) Then tC = dtRng.Column: Me.Cells(R, tC).Value = "" End If End If Application.EnableEvents = True End Sub
- 코드 안에 미리 정의된 4개의 범위(Range)를 사용 환경에 맞게 수정합니다. 사용하지 않는 범위는 해당 줄 맨 앞에 어퍼스트로피(')를 추가하면 주석으로 처리되어 실행에서 제외됩니다.

- 다시 시트로 돌아온 뒤 완료 여부 열에 값을 입력하면 배송일과 배송 시간이 자동으로 입력됩니다.

자주 묻는 질문
질문1. 완료 여부를 삭제해도 입력된 날짜는 그대로 유지하고 싶습니다.
앞서 소개한 공식은 완료 여부에 값이 입력되어 있을 때(예: 값이 새로 입력되거나 다른 값으로 바뀔 때)만 날짜를 유지하고, 완료 여부를 삭제하면 날짜도 함께 빈 셀로 초기화됩니다.
완료 여부를 입력했다가 다시 삭제하더라도 이미 기록된 날짜는 그대로 유지하고 싶다면 아래 공식을 사용해 해결할 수 있습니다. (질문 주신 가비24 님께 감사드립니다.)
'완료여부가 빈칸이 아니고, 날짜가 입력되어 있을 경우에는 기존 날짜를 유지합니다.
입력받을 곳이 여러군데라면 명령문의 Rng를 아래와 같이 설정해보세요 ^^
Set Rng = Me.Range("A:A,D:D")
Set Rng = Me.Range("c:c", "m:m")
Set TimeRng = Me.Range("aa:aa", "ab:ab")
이렇게 하면 잘 모르지만 잘 안될 것 같은데 해보니 역시나 안되네요.
Dim Rng As Range: Dim TimeRng As Range: Dim TimeRng1 As Range: Dim DateRng As Range: Dim dtRng As Range
Dim tC As Long: Dim dC As Long: Dim R As Long
On Error Resume Next
Application.EnableEvents = False
Set Rng = Me.Range("c:c", "m:m")
Set TimeRng = Me.Range("aa:aa")
Set TimeRng1 = Me.Range("ab:ab")
If Not Intersect(Target, Rng) Is Nothing Then
If Target.Text <> "" Then
R = Target.Row
If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = Time
Else
R = Target.Row
If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = ""
End If
End If
If Not Intersect(Target, Rng) Is Nothing Then
If Target.Text <> "" Then
R = Target.Row
If Not IsEmpty(TimeRng1) Then tC = TimeRng1.Column: Me.Cells(R, tC).Value = Time
Else
R = Target.Row
If Not IsEmpty(TimeRng1) Then tC = TimeRng1.Column: Me.Cells(R, tC).Value = ""
End If
End If
Application.EnableEvents = True
End Sub
이렇게 하니까 원하는 대로 나오긴 하는데 이게 맞는지 모르겠네요. ㅠ.ㅠ 기초가 부실하니 어렵네요. ㅎㅎㅎ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range: Dim Rng1 As Range: Dim TimeRng As Range: Dim TimeRng1 As Range
Dim tC As Long: Dim R As Long: Dim tC1 As Long: Dim R1 As Long
On Error Resume Next
Application.EnableEvents = False
Set Rng = Me.Range("c:c")
Set Rng1 = Me.Range("m:m")
Set TimeRng = Me.Range("aa:aa")
Set TimeRng1 = Me.Range("ab:ab")
If Not Intersect(Target, Rng) Is Nothing Then
If Target.Text <> "" Then
R = Target.Row
If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = Time
Else
R = Target.Row
If Not IsEmpty(TimeRng) Then tC = TimeRng.Column: Me.Cells(R, tC).Value = ""
End If
End If
If Not Intersect(Target, Rng1) Is Nothing Then
If Target.Text <> "" Then
R1 = Target.Row
If Not IsEmpty(TimeRng1) Then tC1 = TimeRng1.Column: Me.Cells(R1, tC1).Value = Time
Else
R1 = Target.Row
If Not IsEmpty(TimeRng1) Then tC1 = TimeRng1.Column: Me.Cells(R1, tC1).Value = ""
End If
End If
Application.EnableEvents = True
End Sub
문제를 잘 해결하셨다니 다행입니다.
09.01(화) 04:46
이렇게 된 것을 날자와 시간만 어떻게 따로 분리할 수 있을가요?
시간: =TIME(HOUR(셀),MINUTE(셀),SECOND(셀))
로 추출해보세요 :)
질문을 잘 이해하지 못했습니다.
복사 후 붙여넣기를 한 뒤, 복사한 데이터로 들어가서 각 셀마다 엔터를 쳐주어야 날짜가 나타난단 말씀이신가요?
WorkSheet_Change 이벤트는 붙여넣기하는 경우에도 동작하기 때문에.. 직접 입력하는 것과 동일하게 잘 동작해야 하는 것이 맞습니다. :)
혹시 몰라서 예제파일을 다시 다운받아서 순환참조 하는 셀들 지우고 테스트 해 봤는데 동일하게 두 개 이상의 데이터가 들어가면 날짜가 나타나지 않습니다. 해당 붙여넣기 한 셀로 들어가서 각 셀에서 엔터를 한 번씩 해 주면 그 때서야 날짜가 나타납니다. 참고로 엑셀 2010 Windows7 환경입니다.
오전1200
날짜만 입력할 경우 시간은 오전12:00 로 항상 고정됩니다.^^
시간을 변경하시려면 시간값도 같이 입력해주세요. (예: 2021/1/1 18:30:00)
처음입력된 날짜가 감지데이터가 수정, 삭제 되더라도 바뀌지 않고 그대로 유지 되길 원하는데요 어디를 수정해야 하나요?
처음은 자동으로 입력되지만 이후 감지데이터가 수정이나 삭제 되더라도
날짜는 처음입력했을때 그대로였으면 합니다
만약 데이터 수정/삭제 시에도 날짜를 그대로 유지하시려면 아래 공식을 사용해보세요 ^^
답변이 도움이 되셨길 바랍니다.
죄송하지만 추가질문 하나 더 드리겠습니다.
날짜를 두곳에 표시하고싶습니다.
이럴때는 어떻게 해야하나요?
이번 강의에서 사용한 방법은 구글시트에서는 사용이 불가능합니다. :)
<>"" 는 '빈칸이 아닌 경우'를 뜻 합니다.
반복반복..열공하겠습니다.