Báo lỗi nếu nhập dữ liệu thiếu

Liên hệ QC

vonguyen3745

Thành viên hoạt động
Tham gia
18/7/09
Bài viết
145
Được thích
5
Tôi có một số vùng cần bắt buộc nhập số liệu vào đó, nếu nhập thiếu thì khi save sẽ báo lỗi và thông báo ô thiếu đó cho người nhập biết. Mong mọi người giúp đỡ.
Yêu cầu cụ thể có trong file đính kèm.
 

File đính kèm

Bạn thử code này và điều chỉnh theo ý mình nha (Bạn chép vào vùng Code của Workbook):

Mã:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Cll As Range
For Each Cll In Application.Union(Sheet1.[d6:f21], Sheet1.[h5:i16])
If Cll = "" Then
Cancel = True
MsgBox "Chua nhap du thong tin"
Cll.Select
Exit Sub
End If
Next
End Sub
 
Upvote 0
Nếu làm như bạn thì khi chưa nhập xong dữ liệu nó không cho save, như thế cũng không ổn vì một báo cáo người ta có thể làm trong vài ngày mà không cho save thì nguy hiểm, ý của mình là khi save nó chỉ cảnh báo là chưa nhập đủ dữ liệu ở ô nào đó thôi nhưng vẫn cho save bình thường. Mong bạn giúp đỡ thêm
 
Upvote 0
Nếu làm như bạn thì khi chưa nhập xong dữ liệu nó không cho save, như thế cũng không ổn vì một báo cáo người ta có thể làm trong vài ngày mà không cho save thì nguy hiểm, ý của mình là khi save nó chỉ cảnh báo là chưa nhập đủ dữ liệu ở ô nào đó thôi nhưng vẫn cho save bình thường. Mong bạn giúp đỡ thêm
Bạn có thể sửa Sub ở trên như sau:
PHP:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim Cll As Range, TB
    For Each Cll In Sheet1.[D6:F21,H5:I16]
        If Cll = "" Then
            TB = MsgBox("Chua nhap du thong tin. Ban thuc su muon Save?", vbYesNo, "Canh bao")
            Cancel = TB = vbNo
            Cll.Select
            Exit Sub
        End If
    Next
End Sub
Khi chương trình thông báo lỗi, nếu bạn chọn Yes thì chương trình vẫn tiếp tục lưu, còn nếu chọn No thì thao tác lưu bị hủy bỏ (Cancel = TB = vbNo).

To Sealand: Giữa 2 cách viết: Application.Union(Sheet1.[d6:f21], Sheet1.[h5:i16])Sheet1.[D6:F21,H5:I16] có khác nhau không vậy bác? Em thấy cách viết sau ngắn gọn hơn nhưng không biết dùng nó có ổn không. Trong file đính kèm của bạn vonguyen3745 thì không sao, còn trong trường hợp khác thì...
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu vậy bạn làm như sau:

Mã:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Cll As Range, tb, qd, k
For Each Cll In Application.Union(Sheet1.[d6:f21], Sheet1.[h5:i16])
If Cll = "" Then tb = tb & Cll.Address & ";" & IIf(k = 5, Chr(10), "")
k = k + 1
If k = 6 Then k = 1
Next
tb = "CAC O SAU DAY CHUA DU THONG TIN:" & Chr(10) & Chr(10) & tb
tb = tb & Chr(10) & Chr(10) & "LUU LAI CHON YES, SUA XONG MOI LUU CHON NO ?"
qd = MsgBox(tb, vbYesNo, "GPE")
If qd = 7 Then Cancel = True
End Sub
 
Upvote 0
Thật tuyệt! Cảm ơn Sealand nhiều!
 
Upvote 0
To Sealand: Giữa 2 cách viết: Application.Union(Sheet1.[d6:f21], Sheet1.[h5:i16])Sheet1.[D6:F21,H5:I16] có khác nhau không vậy bác? Em thấy cách viết sau ngắn gọn hơn nhưng không biết dùng nó có ổn không. Trong file đính kèm của bạn vonguyen3745 thì không sao, còn trong trường hợp khác thì...
Thực chất đây là 2 phương thức rất khác nhau:
1/Application.Union(Sheet1.[d6:f21], Sheet1.[h5:i16]):Đây là phương thức liên kết các vùng. Khi nghiên cứu về Range chắc chắn không thể bỏ qua.
2/ Sheet1.[D6:F21,H5:I16] : Đây là phương thức Evaluate. Để hiểu chi tiết bạn tham khảo ở đây

Mình thường dùng lẫn lộn giữa các phương thức này và cũng chưa thấy vấn đề gì cả.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom