엑셀 오늘 날짜 자동 입력 방법
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 매크로를 사용하는 것이 좋습니다.
- [개발 도구] – [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)
처음입력된 날짜가 감지데이터가 수정, 삭제 되더라도 바뀌지 않고 그대로 유지 되길 원하는데요 어디를 수정해야 하나요?
처음은 자동으로 입력되지만 이후 감지데이터가 수정이나 삭제 되더라도
날짜는 처음입력했을때 그대로였으면 합니다
만약 데이터 수정/삭제 시에도 날짜를 그대로 유지하시려면 아래 공식을 사용해보세요 ^^
답변이 도움이 되셨길 바랍니다.
죄송하지만 추가질문 하나 더 드리겠습니다.
날짜를 두곳에 표시하고싶습니다.
이럴때는 어떻게 해야하나요?
이번 강의에서 사용한 방법은 구글시트에서는 사용이 불가능합니다. :)
<>"" 는 '빈칸이 아닌 경우'를 뜻 합니다.
반복반복..열공하겠습니다.