Kiểm tra và sửa giá trị âm tại nhiều cột trên sheet trước khi close Workbook

Liên hệ QC

hoamattroicoi

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia
19/12/10
Bài viết
2,585
Được thích
5,764
Nghề nghiệp
Công nhân vệ sinh số liệu
Đã quá khuya rồi nhưng em có 1 vấn đề chưa có được lời giải đáp mong các anh chị và các sư phụ giúp đỡ!
Em có 1 bảng dữ liệu như trong file đính kèm :
Em muốn tạo 1 sự kiện trước khi đóng Workbook excel sẽ duyệt các giá trị trong 3 cột I,J,K nếu giá trị tại 3 cột này mà nhỏ hơn 0 ( tức là một trong các cột hoặc I, hoặc J, hoặc K có giá trị nhỏ hơn 0) thì hiện 1 hộp hội thoại yêu cầu sửa lại bằng cách nhập thêm dữ liệu vào cột tổng cước là cột E hoặc F (có thể thực hiện thao tác chọn ô của 1 trong 2 cột này để sửa luôn không ạ???) sao cho cột Cước còn lại không chứa giá trị âm (Vì nhân viên quên không nhập cột tổng cước nên Cước còn lại mới bị âm).

Quá trình hiện hộp hội thoại yêu cầu sửa được lặp lại cho đến khi người dùng sửa hết các giá trị sao cho tại 3 cột I,J,K không còn bị âm nữa thì đóng Workbook, trong trường hợp vẫn còn âm thì thông yêu cầu tiếp tục sửa.
Nếu 3 cột I,J,K của em đang thực hiện chế độ khóa công thức (Tool/Protection/Protect sheet...) thì có thực hiện được yêu cầu trên không ???
Nhờ các anh, chị và các sư phụ viết code VBA giúp em.
Em xin cảm ơn!
 

File đính kèm

Đã quá khuya rồi nhưng em có 1 vấn đề chưa có được lời giải đáp mong các anh chị và các sư phụ giúp đỡ!
Em có 1 bảng dữ liệu như trong file đính kèm :
Em muốn tạo 1 sự kiện trước khi đóng Workbook excel sẽ duyệt các giá trị trong 3 cột I,J,K nếu giá trị tại 3 cột này mà nhỏ hơn 0 ( tức là một trong các cột hoặc I, hoặc J, hoặc K có giá trị nhỏ hơn 0) thì hiện 1 hộp hội thoại yêu cầu sửa lại bằng cách nhập thêm dữ liệu vào cột tổng cước là cột E hoặc F (có thể thực hiện thao tác chọn ô của 1 trong 2 cột này để sửa luôn không ạ???) sao cho cột Cước còn lại không chứa giá trị âm (Vì nhân viên quên không nhập cột tổng cước nên Cước còn lại mới bị âm).

Quá trình hiện hộp hội thoại yêu cầu sửa được lặp lại cho đến khi người dùng sửa hết các giá trị sao cho tại 3 cột I,J,K không còn bị âm nữa thì đóng Workbook, trong trường hợp vẫn còn âm thì thông yêu cầu tiếp tục sửa.
Nếu 3 cột I,J,K của em đang thực hiện chế độ khóa công thức (Tool/Protection/Protect sheet...) thì có thực hiện được yêu cầu trên không ???
Nhờ các anh, chị và các sư phụ viết code VBA giúp em.
Em xin cảm ơn!
Không ngủ được, làm "thí thí" theo khả năng của mình thôi, chắc chưa đúng ý bạn.
PassW: 123
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cám ơn câu trả lời của bác Ba Tê, đúng là chưa đúng ý em ạ.
- Thứ nhất là em không muốn dùng InputBox để thêm dữ liệu, có thể thêm bằng cách gõ trực tiếp trên sheet được không ạ?
- Thứ 2 là : Em thấy bác xét dữ liệu tại cột E và F rỗng nhưng điều kiện em muốn xét làm căn cứ ở đây là giá trị của 1 trong 3 cột I,J,K bị âm thì yêu cầu sửa lại.Cứ âm thì yêu cầu sửa lại, sửa đến bao giờ thỏa mãn điều kiện >0 thì sẽ cho đóng workbook.
- Em muốn kết hợp với sự kiện WorkbookBefore Close để thực hiện việc này được không ạ?
Nhờ các sư phụ chỉ giúp em, Em xin chân thành cảm ơn!
 
Upvote 0
Cám ơn câu trả lời của bác Ba Tê, đúng là chưa đúng ý em ạ.
- Thứ nhất là em không muốn dùng InputBox để thêm dữ liệu, có thể thêm bằng cách gõ trực tiếp trên sheet được không ạ?
- Thứ 2 là : Em thấy bác xét dữ liệu tại cột E và F rỗng nhưng điều kiện em muốn xét làm căn cứ ở đây là giá trị của 1 trong 3 cột I,J,K bị âm thì yêu cầu sửa lại.Cứ âm thì yêu cầu sửa lại, sửa đến bao giờ thỏa mãn điều kiện >0 thì sẽ cho đóng workbook.
- Em muốn kết hợp với sự kiện WorkbookBefore Close để thực hiện việc này được không ạ?
Nhờ các sư phụ chỉ giúp em, Em xin chân thành cảm ơn!
1. Xét theo điều kiện khác thì chỉnh lại được, lập lại hoài cho đến khi hết lỗi cũng có thể được.
2.Kết hợp sự kiện WorkbookBefore Close thì gán code vào sự kiện đó.
3. Sử dụng trực tiếp trên Cell thì hiện tôi "bó tay", thông cảm nhé, vốn liếng có bi nhiêu thôi.
 
Upvote 0
- Bé Còi cám ơn sự nhiệt tình của bác Ba Tê,thực sự yêu cầu sửa trực tiếp của bé còi rất cần thiết vì khi người dùng rất hay gõ sai dẫn đến cước còn lại bị âm.
- Khi người dùng nhập xong toàn bộ dữ liệu và đóng Workbook lại thì excel sẽ tự kiểm tra xem các giá trị nằm 1 trong 3 cột trên đã thỏa mãn điều kiện >0 chưa? Nếu chưa excel sẽ không cho đóng Workbook và chỉ ra dòng nào bị âm, đến dòng nào người dùng sẽ phải dừng lại, kiểm tra dòng đó xem vì sao lại bị âm và tiến hành sửa đến khi nào các dòng đó thỏa mãn để giá trị trong 3 cột kia hết âm thì thôi (Mọi điều kiện đc thỏa mãn thì đóng Workbook)
Tạm thời bỏ qua thao tác Protect Sheet, thì có cách nào để làm việc đó không ạ????
Bé Còi xin cảm ơn!
 
Upvote 0
- Bé Còi cám ơn sự nhiệt tình của bác Ba Tê,thực sự yêu cầu sửa trực tiếp của bé còi rất cần thiết vì khi người dùng rất hay gõ sai dẫn đến cước còn lại bị âm.
- Khi người dùng nhập xong toàn bộ dữ liệu và đóng Workbook lại thì excel sẽ tự kiểm tra xem các giá trị nằm 1 trong 3 cột trên đã thỏa mãn điều kiện >0 chưa? Nếu chưa excel sẽ không cho đóng Workbook và chỉ ra dòng nào bị âm, đến dòng nào người dùng sẽ phải dừng lại, kiểm tra dòng đó xem vì sao lại bị âm và tiến hành sửa đến khi nào các dòng đó thỏa mãn để giá trị trong 3 cột kia hết âm thì thôi (Mọi điều kiện đc thỏa mãn thì đóng Workbook)
Tạm thời bỏ qua thao tác Protect Sheet, thì có cách nào để làm việc đó không ạ????
Bé Còi xin cảm ơn!
Cũng vẫn dùng InputBox, định vị cell bằng màu cho dễ quan sát, thử kiểm tra thấy được xài đỡ.
 

File đính kèm

Upvote 0
Dùng sự kiện beforeclose xem sau, nếu dữ liệu nhiều thì dùng vòng lặp + offset là OK
 

File đính kèm

Upvote 0
Cám ơn câu trả lời của bác Ba Tê, đúng là chưa đúng ý em ạ.
- Thứ nhất là em không muốn dùng InputBox để thêm dữ liệu, có thể thêm bằng cách gõ trực tiếp trên sheet được không ạ?
- Thứ 2 là : Em thấy bác xét dữ liệu tại cột E và F rỗng nhưng điều kiện em muốn xét làm căn cứ ở đây là giá trị của 1 trong 3 cột I,J,K bị âm thì yêu cầu sửa lại.Cứ âm thì yêu cầu sửa lại, sửa đến bao giờ thỏa mãn điều kiện >0 thì sẽ cho đóng workbook.
- Em muốn kết hợp với sự kiện WorkbookBefore Close để thực hiện việc này được không ạ?
Nhờ các sư phụ chỉ giúp em, Em xin chân thành cảm ơn!
Gõ trực tiếp trên cell :
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Arr, i&, j&
Arr = Sheet1.Range("I5:K" & Sheet1.Range("K65500").End(xlUp).Row).Value
Application.DisplayAlerts = False
For i = 1 To UBound(Arr)
  For j = 1 To 3
    If Arr(i, j) < 0 Then
      Sheet1.Range("E" & i + 4).Select
      Cancel = True
      Exit Sub
    End If
  Next
Next
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Tôi thấy vấn đề cũng đơn giản mà
- Sheet có protect hay không chẳng quan trọng, việc của ta là xem kết quả ở cột I, J, K có < 0 hay không mà thôi
- Khi đóng Wb, kiểm tra các giá trị cột I,J,K... nếu <0 ta cho Cancel = True và xuất hiện thông báo
- Người dùng chỉnh sửa gì kệ họ ---> Khi nào cột I,J,K >=0 mới cho đóng Wb
Vậy thôi
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim SrcRng As Range, Clls As Range, Arr(), n As Long
  With Sheet1
    Set SrcRng = .Range(.[A5], .[A65536].End(xlUp)).Offset(, 8).Resize(, 3)
    For Each Clls In SrcRng
      If Clls.Value < 0 Then
        n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = Clls.Address(0, 0)
      End If
    Next
    If n Then
      MsgBox "Phat hien gia tri am tai:" & vbLf & Join(Arr, ", ") & vbLf & _
             "Yeu cau kiem tra lai gia tri nhap"
      Cancel = True
      Intersect(.Range(Join(Arr, ", ")).EntireRow, .Range("E:F")).Select
    Else
      ThisWorkbook.Close (True)
    End If
  End With
End Sub
 
Upvote 0
Em cảm ơn bác Ba Tê, anh nmhung, anh viehoai và sư phụ ndu rất nhiều!
Thanks again!
 
Upvote 0
Web KT

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

Back
Top Bottom