Khi ứng dụng VBA trong Excel, chúng ta có thể nhập dữ liệu trên 1 Sheet rồi lưu sang Sheet khác. Đã có rất nhiều bài viết trên Blog.hocexcel.online hướng dẫn bạn cách làm này. Nhưng làm thế nào để chúng ta có thể “nhặt” dữ liệu ra để sửa, sau khi sửa xong sẽ lưu lại đúng vị trí của dòng dữ liệu đó trong bảng tính? Trong bài viết này các bạn sẽ được tìm hiểu chi tiết cách làm.
Xem nhanh
Sửa dữ liệu thông thường, chúng ta chỉ việc vào trong bảng tính và sửa trực tiếp. Nhưng việc đó có một số hạn chế:
Do đó chúng ta có thể sử dụng quy trình sửa dữ liệu trong lập trình VBA để khắc phục các hạn chế đó. Cụ thể:
Bước 1: Xây dựng cấu trúc bảng dữ liệu và Form sửa dữ liệu
Ví dụ chúng ta có bảng tính như sau:
Trong hình trên, chúng ta thấy có 2 phần:
Kèm với đó là 3 nút lệnh (Sử dụng chức năng Insert > Shape để tạo ra các nút lệnh này)
Lưu ý: Form sửa dữ liệu bạn có thể đặt tại Sheet khác hoặc sử dụng UserForm. Trong ví dụ này làm chung trong 1 Sheet để dễ theo dõi.
Bước 2: Viết code lấy dữ liệu vào Form sửa thông tin
Gồm các lệnh:
1. Khi bấm chuột chọn vào dòng cần sửa, chúng ta có câu lệnh xác định số dòng theo ô được chọn là:
ActiveCell.Row
Gán 1 biến đại diện cho giá trị này là DongSua, ta có:
Sub LayDuLieu()
‘1. Lệnh gán biến xác định dòng cần sửa
Dim DongSua As Long
DongSua = ActiveCell.Row
‘2. Lệnh lấy dữ liệu theo dòng cần sửa
End Sub
2. Lệnh lấy dữ liệu theo dòng cần sửa gồm:
Tất cả các nội dung trên đều được thực thi trong Sheet1 (là Sheet chứa bảng dữ liệu và Form sửa) nên có thể viết như sau:
Sub LayDuLieu()
‘1. Lệnh gán biến xác định dòng cần sửa
Dim DongSua As Long
DongSua = ActiveCell.Row
‘2. Lệnh lấy dữ liệu theo dòng cần sửa
With Sheet1
.Range(“J2”).Value = DongSua
.Range(“H5”).Value = .Range(“A” & DongSua).Value
.Range(“J5”).Value = .Range(“B” & DongSua).Value
.Range(“H8”).Value = .Range(“C” & DongSua).Value
.Range(“J8”).Value = .Range(“D” & DongSua).Value
.Range(“L8”).Value = .Range(“E” & DongSua).Value
End With
End Sub
Bây giờ chúng ta chỉ việc gán Macro LayDuLieu vừa viết ở trên vào Mũi tên thứ 1 (từ trái qua phải)
Khi đó muốn sửa dữ liệu nào, chúng ta chỉ cần chọn dòng cần sửa, sau đó bấm vào Mũi tên, dữ liệu sẽ được tự động đưa sang Form sửa:
Bước 3: Viết code xóa nội dung trong Form sửa
Trong trường hợp chúng ta muốn xóa nội dung trong Form sửa dữ liệu về lại trạng thái không có nội dung gì, chúng ta có thể sử dụng thuộc tính .ClearContent cho đối tượng Range như sau:
Sub XoaDuLieu()
With Sheet1
.Range(“J2, H5:L5, H8:L8”).ClearContents
End With
End Sub
Gán macro XoaDuLieu vào biểu tượng Shape hình X bằng Assign Macro tương tự như trong bước 2 nhé.
Bước 4: Viết code lưu nội dung trong Form sửa trở lại dòng chứa dữ liệu cần sửa
Để lưu nội dung từ Form sửa trở lại bảng dữ liệu, chúng ta thực hiện viết giống như lệnh lấy dữ liệu từ Bảng sang Form sửa, nhưng thứ tự ngược lại như sau:
Sub LuuDuLieu()
‘Khai báo biến xác định dòng sửa = dòng lưu dữ liệu
Dim DongSua As Long
DongSua = Sheet1.Range(“J2”).Value
‘Thực hiện lưu dữ liệu từ Form sửa vào bảng dữ liệu theo dòng sửa
With Sheet1
.Range(“A” & DongSua).Value = .Range(“H5”).Value
.Range(“B” & DongSua).Value = .Range(“J5”).Value
.Range(“C” & DongSua).Value = .Range(“H8”).Value
.Range(“D” & DongSua).Value = .Range(“J8”).Value
.Range(“E” & DongSua).Value = .Range(“L8”).Value
End With
‘Gọi lệnh Xóa dữ liệu trong Form sửa sau khi đã hoàn thành việc lưu dữ liệu
Call XoaDuLieu
‘Mở thông báo bằng msgbox về việc đã lưu thành công
Msgbox “Luu du lieu thanh cong”
End Sub
Gán Macro LuuDuLieu vào Mũi tên thứ 2 (từ phải qua trái) bằng Assign Macro tương tự như trong bước 2 nhé.
Như vậy là chúng ta đã hoàn thành được quy trình sửa dữ liệu trong bảng tính Excel bằng VBA rồi.
Trong trường hợp chúng ta muốn thực hiện với Worksheet đang khóa (Protect Sheet), chúng ta chỉ cần thêm câu lệnh:
Sub LayDuLieu()
Sheet1.Unprotect
…
Sheet1.Protect
End Sub
Chúc các bạn áp dụng thành công kiến thức này vào công việc!