Báo lỗi khi nhập vượt mức quy định

Liên hệ QC

vanlinh_2904

Thành viên hoạt động
Tham gia
20/10/12
Bài viết
105
Được thích
3
Chào các Anh/Chị
Em nhờ anh chị viết giúp em VBA để mỗi khi nhập liệu nếu mỗi nhân viên trong cùng 1 ngày có số tiền chi vượt quá mức quy định thì báo lỗi.
Em cảm ơn các anh/chị.
 

File đính kèm

  • Baoloinhapvuot.xlsx
    8.9 KB · Đọc: 25
Chào các Anh/Chị
Em nhờ anh chị viết giúp em VBA để mỗi khi nhập liệu nếu mỗi nhân viên trong cùng 1 ngày có số tiền chi vượt quá mức quy định thì báo lỗi.
Em cảm ơn các anh/chị.

Muốn báo lỗi, có thể dùng Data Validation với công thức:

=SUMIFS($D$5:$D5,$C$5:$C5,$C5,$B$5:$B5,$B5)<=$H$3

.
 
Upvote 0
Cảm ơn 2 bạn Vũ Kim Hiếu và Phuocam, Data Validation thì mình đã có rồi, bạn nào có code VBA thì cho mình xin để thay cho Data Validation nhé.
Data Valiadation rất hiệu quả.
Bạn chỉ code VBA kkhi bạn có nhiều lý do cần uyển chuyển hơn.
Trường hợp này bạn phải là người viết code, và chỉ hỏi một vài chỗ bí.
Hỏi người ta làm từ a đến z thì chả lợi gì hơn dùng công cụ có sẵn của Excel cả.
 
Upvote 0
Data Valiadation rất hiệu quả.
Bạn chỉ code VBA kkhi bạn có nhiều lý do cần uyển chuyển hơn.
Trường hợp này bạn phải là người viết code, và chỉ hỏi một vài chỗ bí.
Hỏi người ta làm từ a đến z thì chả lợi gì hơn dùng công cụ có sẵn của Excel cả.
Do Data Valiadation thì khi thực hiện copy thì nó lại không báo lỗi, chỉ có đánh trực tiếp mới báo lỗi nên mình tìm VBA, bạn có cách nào giúp mình với ạ.
 
Upvote 0
Do Data Valiadation thì khi thực hiện copy thì nó lại không báo lỗi, chỉ có đánh trực tiếp mới báo lỗi nên mình tìm VBA, bạn có cách nào giúp mình với ạ.
Ngài Bill đã làm gì để bạn phật ý không dùng công cụ của ông ta mà bạn lại muốn sử dụng code VBA?
Xem file thử xem, hy vọng đúng ý.
 

File đính kèm

  • Baoloinhapvuot(cuarVanLinh).xlsm
    19.2 KB · Đọc: 25
Upvote 0
Do Data Valiadation thì khi thực hiện copy thì nó lại không báo lỗi, chỉ có đánh trực tiếp mới báo lỗi nên mình tìm VBA, bạn có cách nào giúp mình với ạ.
1. Copy cũng không kích hoạt sự kiện (VBA). Những chắp vá đều chỉ có hiệu quả tương đối.
2. Như tôi đã nêu ra ở trên. Bạn có ý kiến dùng code để kiểm soát thì cũng phải biết tự viết code, và chỉ hỏi 1 vài điểm bí. Ở đây, bạn nhờ viết từ a đến z. Tức là bạn sẽ không kiểm soát được hoạt động của code. Mội sai lầm, thiếu sót đều phải đều phải dựa vào tác giả code để chỉnh.
 
Upvote 0
Ngài Bill đã làm gì để bạn phật ý không dùng công cụ của ông ta mà bạn lại muốn sử dụng code VBA?
Xem file thử xem, hy vọng đúng ý.
Nhờ bạn sửa lại code giúp mình khi copy và dán vào cột B thì vẫn thực hiện được thông báo. Cảm ơn bạn nhiều
 
Upvote 0
Nhờ bạn sửa lại code giúp mình khi copy và dán vào cột B thì vẫn thực hiện được thông báo. Cảm ơn bạn nhiều
Hỏi cụ thể chút về cách nhập liệu của bạn, tức là bạn có cột ngày và số lượng sẵn từ trước? Chỉ nhập tên nhân viên thôi phải không? Hay là cứ mỗi dòng nhập tên NV xong nhập ngày và số lượng?
Còn nữa, nhập xong chỉ cần hiện thông báo thôi hay là hiện thông báo xong và xóa giá trị vừa nhập vào?
 
Upvote 0
Hỏi cụ thể chút về cách nhập liệu của bạn, tức là bạn có cột ngày và số lượng sẵn từ trước? Chỉ nhập tên nhân viên thôi phải không? Hay là cứ mỗi dòng nhập tên NV xong nhập ngày và số lượng?
Còn nữa, nhập xong chỉ cần hiện thông báo thôi hay là hiện thông báo xong và xóa giá trị vừa nhập vào?
Nhập cả tên nhân viên ngày và số lượng nữa bạn, hiện thông báo và xoá giá trị nhập sai bạn nhé, cảm ơn bạn.
 
Upvote 0
Nhập cả tên nhân viên ngày và số lượng nữa bạn, hiện thông báo và xoá giá trị nhập sai bạn nhé, cảm ơn bạn.
Ngồi viết thử một khúc thì nhận ra có nhiều vấn đề:
1/ Trường hợp nhập liệu từng dòng thì dễ rồi
2/ Trường hợp copy paste:
- Nếu vùng paste có nhân viên thỏa mã điều kiện, có nhân viên không thì thông báo thế nào? ( Đã nghĩ là sẽ thông báo những nhân viên nào không phù hợp và xóa những NV đó (*), giữ lại những nhân viên thỏa mãn)
- Phần (*) của ý trên: Giả sử Nhân viên A (trong vùng paste) có nhiều dòng (giả sử 5 dòng), nếu tổng trên xuống 4 dòng thì thỏa mãn, nhưng sang đến dòng thứ 5 thì nó vượt. Vậy chỗ này xóa hết tất cả hay xóa dòng dư (**)
- Phần (**) của ý trên: Nếu xóa dòng dư thì lấy dưới lên hay thế nào? Nhân viên A: Dòng 1 = 900.000 , Dòng 2 đến dòng 5 chỉ 200.000 mỗi dòng. Vậy tính dưới lên thì phải xóa từ 2 tới 5. Nhưng nếu xác định thỏa mãn càng nhiều càng tốt thì lại phải xóa dòng 1

Còn nếu chỉ nêu ra vùng đó có chứa nhân viên nào đó không thỏa mãn điều kiện và xóa hết tất cả dữ liệu của vùng paste thì đơn giản hơn
 
Upvote 0
Nhờ bạn sửa lại code giúp mình khi copy và dán vào cột B thì vẫn thực hiện được thông báo. Cảm ơn bạn nhiều
Thử xem.
Chỉnh lại code.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5:B100000")) Is Nothing Then
On Error GoTo Thoat
    Call HanCheChi
    If IsArray(Targer) = False Then
      Set Rng = Target
      k = Rng.Rows.Count
      Set eRng = Rng.Resize(k, 3)
      For j = 1 To k
          For i = 1 To UBound(Res)
            If eRng(j, 1) = Res(i, 1) And eRng(j, 2) = Res(i, 2) And Res(i, 3) > Sheet1.[H3] Then
                MsgBox "Ngày " & eRng(j, 2) & " Nhân viên " & eRng(j, 1) & " đa chi quá han mưc", vbCritical, " THÔNG BÁO"
                eRng(j, 3) = ""
            End If
          Next i
       Next j
    End If
End If
Thoat:
End Sub
P/s: Chỉ bắt sữ kiện khi thay đổi các ô ở cột B. Nếu đã chi quá sẽ xóa ô tương ứng ở cột D
 
Upvote 0
Thử xem.
Chỉnh lại code.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5:B100000")) Is Nothing Then
On Error GoTo Thoat
    Call HanCheChi
    If IsArray(Targer) = False Then
      Set Rng = Target
      k = Rng.Rows.Count
      Set eRng = Rng.Resize(k, 3)
      For j = 1 To k
          For i = 1 To UBound(Res)
            If eRng(j, 1) = Res(i, 1) And eRng(j, 2) = Res(i, 2) And Res(i, 3) > Sheet1.[H3] Then
                MsgBox "Ngày " & eRng(j, 2) & " Nhân viên " & eRng(j, 1) & " đa chi quá han mưc", vbCritical, " THÔNG BÁO"
                eRng(j, 3) = ""
            End If
          Next i
       Next j
    End If
End If
Thoat:
End Sub
P/s: Chỉ bắt sữ kiện khi thay đổi các ô ở cột B. Nếu đã chi quá sẽ xóa ô tương ứng ở cột D
Sự kiện chỉ bắt mỗi cột B làm sao mà được bác. Người ta trả lời thế này mà:
Nhập cả tên nhân viên ngày và số lượng nữa bạn, hiện thông báo và xoá giá trị nhập sai bạn nhé,
Nhập tên xong, chưa có tiền thì mọi sự vẫn tốt đẹp. Nhưng đến khi nhập tiền vào, nếu vượt thì code có bắt sự kiện này nữa đâu
 
Upvote 0
Sự kiện chỉ bắt mỗi cột B làm sao mà được bác. Người ta trả lời thế này mà:

Nhập tên xong, chưa có tiền thì mọi sự vẫn tốt đẹp. Nhưng đến khi nhập tiền vào, nếu vượt thì code có bắt sự kiện này nữa đâu
Tôi nghĩ rằng 1 thành viên tham gia diễn đàn từ năm 2012 như chủ thớt chắc có đủ kiến thức để tùy chỉnh theo ý mình. Nếu mà làm nữa thì họ học được gì?
Dựa vào bắt sự kiện ở cột B để thêm vào bắt sự kiện ở cột d thì có lẽ cũng không phải là khó đối với chủ thớt.
 
Upvote 0
Ngồi viết thử một khúc thì nhận ra có nhiều vấn đề:
1/ Trường hợp nhập liệu từng dòng thì dễ rồi
2/ Trường hợp copy paste:
- Nếu vùng paste có nhân viên thỏa mã điều kiện, có nhân viên không thì thông báo thế nào? ( Đã nghĩ là sẽ thông báo những nhân viên nào không phù hợp và xóa những NV đó (*), giữ lại những nhân viên thỏa mãn)
- Phần (*) của ý trên: Giả sử Nhân viên A (trong vùng paste) có nhiều dòng (giả sử 5 dòng), nếu tổng trên xuống 4 dòng thì thỏa mãn, nhưng sang đến dòng thứ 5 thì nó vượt. Vậy chỗ này xóa hết tất cả hay xóa dòng dư (**)
- Phần (**) của ý trên: Nếu xóa dòng dư thì lấy dưới lên hay thế nào? Nhân viên A: Dòng 1 = 900.000 , Dòng 2 đến dòng 5 chỉ 200.000 mỗi dòng. Vậy tính dưới lên thì phải xóa từ 2 tới 5. Nhưng nếu xác định thỏa mãn càng nhiều càng tốt thì lại phải xóa dòng 1

Còn nếu chỉ nêu ra vùng đó có chứa nhân viên nào đó không thỏa mãn điều kiện và xóa hết tất cả dữ liệu của vùng paste thì đơn giản hơn
1.Trong vùng paste mà có nhân viên không thỏa mãn điều kiện thì xóa những nhân viên không thỏa mãn điều kiện đó ở vùng paste, những nhân viên trong vùng paste thỏa mãn điều kiện thì giữ lại.
2. Trong vùng paste giả sử nhân viên A có nhiều dòng thì lấy = nhân viên A ngoài vùng paste + nhân viên A theo thứ tự tổng từ trên xuống của vùng paste đến khi thỏa mãn điều kiện, đến dòng nhân viên A trong vùng paste vượt sẽ bị xóa (Bạn lưu ý giúp mình dữ liệu không theo thứ tự nên những dòng ở dưới vùng paste có khi cũng có dữ liệu)
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ rằng 1 thành viên tham gia diễn đàn từ năm 2012 như chủ thớt chắc có đủ kiến thức để tùy chỉnh theo ý mình. Nếu mà làm nữa thì họ học được gì?
Có thể là học thêm được tính kiên nhẫn và sẽ nhờ làm tiếp đến khi đạt mong muốn.
 
Upvote 0
Ngồi viết thử một khúc thì nhận ra có nhiều vấn đề:
1/ Trường hợp nhập liệu từng dòng thì dễ rồi
2/ Trường hợp copy paste:
- Nếu vùng paste có nhân viên thỏa mã điều kiện, có nhân viên không thì thông báo thế nào? ( Đã nghĩ là sẽ thông báo những nhân viên nào không phù hợp và xóa những NV đó (*), giữ lại những nhân viên thỏa mãn)
- Phần (*) của ý trên: Giả sử Nhân viên A (trong vùng paste) có nhiều dòng (giả sử 5 dòng), nếu tổng trên xuống 4 dòng thì thỏa mãn, nhưng sang đến dòng thứ 5 thì nó vượt. Vậy chỗ này xóa hết tất cả hay xóa dòng dư (**)
- Phần (**) của ý trên: Nếu xóa dòng dư thì lấy dưới lên hay thế nào? Nhân viên A: Dòng 1 = 900.000 , Dòng 2 đến dòng 5 chỉ 200.000 mỗi dòng. Vậy tính dưới lên thì phải xóa từ 2 tới 5. Nhưng nếu xác định thỏa mãn càng nhiều càng tốt thì lại phải xóa dòng 1

Còn nếu chỉ nêu ra vùng đó có chứa nhân viên nào đó không thỏa mãn điều kiện và xóa hết tất cả dữ liệu của vùng paste thì đơn giản hơn
Vẫn còn đơn giản chán vì bạn vẫn chưa xét hết các trường hợp.

Nếu đọc bài cuối của thớt thì thấy là dữ liệu được nhập / dán không theo thứ tự. Tức tôi hiểu (có thể hiểu sai) là vd. nhân viên A có 5 dòng từ 7 đến 11 đều thỏa điều kiện, tức TỐT. Bây giờ người ta dán 3 dòng cũng của nhân viên A vào dòng 4-6, cũng TỐT cả. Vậy 4-6 giữ lại. Nhưng do có 4-6 nên 7-11 không còn TỐT nữa. Vậy phải xóa 7-11? Hoặc chỉ xóa 9-11 vì 7-8 may mắn vẫn còn TÔT?
 
Upvote 0
Vẫn còn đơn giản chán vì bạn vẫn chưa xét hết các trường hợp.

Nếu đọc bài cuối của thớt thì thấy là dữ liệu được nhập / dán không theo thứ tự. Tức tôi hiểu (có thể hiểu sai) là vd. nhân viên A có 5 dòng từ 7 đến 11 đều thỏa điều kiện, tức TỐT. Bây giờ người ta dán 3 dòng cũng của nhân viên A vào dòng 4-6, cũng TỐT cả. Vậy 4-6 giữ lại. Nhưng do có 4-6 nên 7-11 không còn TỐT nữa. Vậy phải xóa 7-11? Hoặc chỉ xóa 9-11 vì 7-8 may mắn vẫn còn TÔT?
1. Dòng 7-11 ( ngoài vùng dán) sẽ không bị xóa, chỉ xét xóa từ 4-6 ( trong vùng dán) thứ tự xét lần lượt dòng 4 đến dòng 6 :
- Nếu ( dòng 4 + ngoài vùng dán) > mức quy định => thì xóa dòng 4, 5, 6;
- Nếu (dòng 4 + ngoài vùng dán ) < mức quy định =>thì xét đến dòng 5, nếu ( dòng 5+ dòng 4 + ngoài vùng dán ) > mức quy định thì xóa dòng 5-6.
2. Số liệu ngoài vùng dán phải cố định không được xóa ( vì xóa thì mức còn lại sau mỗi lần nhập sẽ bị thay đổi liên tục khi đó số liệu sẽ bị xóa liên tục)
 
Upvote 0
Web KT

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

Back
Top Bottom