Hướng dẫn cách viết code tự động ghi nhận thời gian nhập dữ liệu bằng VBA

Làm thế nào để có thể tự động ghi nhận thời gian dữ liệu được nhập vào trong file Excel? Chỉ với vài dòng code đơn giản trong VBA là bạn có thể làm được việc này rồi. Hãy cùng Học Excel Online tìm hiểu cách làm nhé:

Code tự động ghi nhận thời gian nhập dữ liệu

Đặc điểm hàm NOW trong Excel

Thông thường để xác định một thời điểm cụ thể trong Excel, chúng ta có hàm NOW. Ví dụ như sau:

Hàm NOW sẽ ghi nhận cả Ngày/tháng/năm và Giờ:phút:giây theo thời gian thực.

Tuy nhiên nếu sử dụng hàm NOW, kết quả của hàm sẽ luôn tự động thay đổi mỗi khi Excel thực hiện tính toán. Trong khi đó mục tiêu của chúng ta là chỉ ghi nhận kết quả thời điểm khi chúng ta kết thúc thao tác nhập dữ liệu, và kết quả đó không được thay đổi.

Để làm điều đó mà không dùng tới VBA, bạn phải làm thủ công các bước sau:

  • Bước 1: Viết hàm NOW, sau đó copy kết quả của hàm
  • Bước 2: Dán kết quả của hàm để tránh hàm tự động cập nhật kết quả

Viết Code VBA để tự động ghi nhận thời gian nhập dữ liệu

Nếu việc nhập dữ liệu liên tục thì cách làm trên khá bất tiện vì số thao tác nhiều và thủ công. Do đó để có thể tự động hóa việc này, chúng ta ứng dụng VBA trong Excel như sau:

Bước 1: Sử dụng hàm NOW trong VBA

Ví dụ bạn nhập dữ liệu vào ô A3, muốn điền kết quả thời gian thực vào ô B3, câu lệnh như sau:

ActiveSheet.Range(“B3”).Value = Now

Bước 2: Gắn câu lệnh hàm NOW vào sự kiện khi nhập dữ liệu

(tham khảo: Tìm hiểu về ý nghĩa và cách dùng các sự kiện trong VBA Excel)

Để có thể tự động điền thời gian thực bởi hàm NOW trong VBA, chúng ta phải gắn với sự kiện thay đổi dữ liệu trong ô A3.

Ví dụ bạn thay đổi dữ liệu tại ô A3 trong Sheet1 thì sẽ gọi sự kiện Worksheet_Change tại Sheet1 và đưa câu lệnh trong bước 1 vào

1, Nháy đúp vào Worksheet cần tạo sự kiện trong cửa sổ Project, ví dụ là Sheet1

2, Chọn đối tượng Worksheet

3, Chọn sự kiện Change

4, Một Sub được tự động tạo ra là Worksheet_Change

5, Viết code bên trong Sub đó:

Cú pháp:

If Not Application.Intersect(Range(“A3”), Target) Is Nothing Then

End If

Nghĩa là xét sự thay đổi có diễn ra trong ô A3 hay không

Cú pháp:

ActiveSheet.Range(“B3”).Value = Now

Nghĩa là gán giá trị Now vào ô B3

Khi đó quay trở lại Excel, nhập dữ liệu tại ô A3 sẽ có ngay giá trị thời gian thực tại ô B3

Bước 3: Tổng quát câu lệnh, mở rộng phạm vi tác động

Để câu lệnh được tối ưu, chúng ta không chỉ xét 1 ô A3 mà có thể sẽ áp dụng trong 1 vùng rộng hơn: A2:A100, hoặc hơn nữa là cả cột A.

Tại bất cứ ô nào được nhập nội dung trong cột A, tại cột B trên dòng tương ứng cũng sẽ lấy giá trị kết quả hàm NOW

Như vậy câu lệnh tổng quát là:

If Not Application.Intersect(Range(“A2:A100”), Target) Is Nothing Then

If Range(“A” & Target.Row).Value = “” Then

Range(“B” & Target.Row).ClearContents

Else

Range(“B” & Target.Row).Value = Now

End If

End If

Trong đó:

Intersect(Range(“A2:A100”), Target) là vùng diễn ra sự kiện. Bạn thay đổi tọa độ trong Range(“….”) là được.

Target chính là mục tiêu (ô được chọn).

Target.Row là số dòng của ô được chọn.

Logic là:

Xét sự kiện diễn ra trong vùng A2:A100

Nếu giá trị trong cột A tại dòng tác động là rỗng (không có nội dung) thì

Xóa nội dung trong cột B, tại dòng tương ứng với dòng đang tác động

Còn lại / Mặt khác (giả định trên bị sai)

Gán giá trị kết quả hàm NOW vào cột B, tại dòng đang tác động

Kết thúc hàm if xét giá trị rỗng

Kết thúc hàm if xét vùng diễn ra sự kiện

Kết quả thu được như sau:

Các bạn có thể tham khảo thêm trong file mẫu dưới đây:

Link tải file mẫu: http://bit.ly/2KcLlQS

Để biết cách ứng dụng VBA tốt hơn, bạn hãy tham khảo khóa học VBA101 của Học Excel Online ngay nhé.


Tác giả: duongquan211287

· · ·

Khóa học mới xuất bản