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é:
Xem nhanh
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:
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é.