EXCEL VBA

[ 엑셀 VBA ] 특정 셀에 데이터를 입력하면, 입력 날짜 및 시간 생성, 데이터 변경 날짜 자동입력

카루루1007 2024. 9. 12. 13:30
728x90
반응형

데이터를 입력했을 때 그 데이터를 입력한 시간을 표시하는 VBA 코드입니다.

 

  작 동 방 식

 

 

반응형

 준 비 사 항

 

아래와 같이 간단한 표를 만들었습니다.

B열에 데이터를 입력하면 A열에 날짜와 시간이 자동으로 입력되는 코드입니다.

 

먼저 VBA 편집기를 실행한 후

워크시트(Sheet1) 더블클릭Worksheet 선택Change

를 선택합니다.

 

 

 전체 코드

 

전체 코드는 아래와 같습니다.

Private Sub Worksheet_Change(ByVal Target As Range)

    TargetColumn = 2
    DateColumn = 1
    
    If Not Intersect(Target, Me.Columns(TargetColumn)) Is Nothing Then
        If Target.Value <> "" Then
            Cells(Target.Row, DateColumn).Value = Now
        Else
            Cells(Target.Row, DateColumn).Value = ""
        End If
    End If
    
End Sub

 

 코 드 분 석

 

TargetColumn은 데이터를 입력할 열이고

DateColumn은 날짜를 표시할 열입니다.

TargetColumn = 2
DateColumn = 1

 

Intersect 함수두 범위가 겹치는 부분을 반환합니다.

엑셀 VBA에서 두 개의 범위가 겹치는 공통 셀 찾기 : Intersect 함수

Target은 변경된 셀을 의미하고,

Me.Columns(TargetColumn)은 현재 워크시트의 B열을 의미합니다.

즉, 바뀐 데이터가 B열이 맞는지 확인을 하는 것이고

다른 열의 데이터가 바뀌었다면 해당 코드는 실행되지 않습니다.

If Not Intersect(Target, Me.Columns(TargetColumn)) Is Nothing Then

 

아래 코드는 변경된 셀의 값이 비어있지 않으면

A열에 현재 날짜와 시간을 입력합니다.

만약 비어있다면 빈문자열이 입력이 됩니다.

만약 B열의 데이터가 지워진다면 A열의 데이터도 지워집니다.

If Target.Value <> "" Then
    Cells(Target.Row, DateColumn).Value = Now
Else
    Cells(Target.Row, DateColumn).Value = ""
End If

 

728x90

 마 치 며

 

위 코드는 셀 하나하나씩 조작할 때 동작합니다.

범위를 선택해서 지우면 에러가 발생합니다.

 

한 번에 여러개의 셀을 삭제하지 못하도록 제한하려면

코드를 아래와 같이 변경하시면 됩니다.

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim TargetColumn As Integer
    Dim DateColumn As Integer

    TargetColumn = 2
    DateColumn = 1
    
    If Target.Cells.Count > 1 Then
        Application.EnableEvents = False
        MsgBox "한 번에 하나의 셀만 변경할 수 있습니다."

        Application.Undo
        Set lastCell = Target.Cells(Target.Cells.Count)
        lastCell.Select
        Application.EnableEvents = True
        Exit Sub
    End If

    If Not Intersect(Target, Me.Columns(TargetColumn)) Is Nothing Then
        If Target.Value <> "" Then
            Cells(Target.Row, DateColumn).Value = Now
        Else
            Cells(Target.Row, DateColumn).Value = ""
        End If
    End If
    
End Sub

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

 

728x90
반응형