Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, [B:D]) Is Nothing Or Target = "" Then Exit Sub
If Cells(Target.Row, 1) = "" Then
MsgBox "Nhap thieu roi ban!", vbCritical
Target = ""
Cells(Target.Row, 1).Select
End If
End Sub
Em nghĩ Validation có thể làm tốt điều này (mà lại nhanh hơn code)... vậy tại sao anh không dùng nhỉ?Xin nhờ các anh em trên GPE hướng dẫn giúp về việc thông báo lỗi khi nhập liệu thiếu.
Mong muốn được ghi rõ trong file đính kèm.
Cám ơn các anh em.
Code này chỉ đúng khi người ta nhập trực tiếp ---> Nếu họ copy từ nơi khác rồi paste vào thì code không hoạt động!Mình dùng code :
Xem file :PHP:Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Intersect(Target, [B:D]) Is Nothing Or Target = "" Then Exit Sub If Cells(Target.Row, 1) = "" Then MsgBox "Nhap thieu roi ban!", vbCritical Target = "" Cells(Target.Row, 1).Select End If End Sub
Xin nhờ các anh em trên GPE hướng dẫn giúp về việc thông báo lỗi khi nhập liệu thiếu.
Mong muốn được ghi rõ trong file đính kèm.
Cám ơn các anh em.
=OFFSET(B8,,COLUMN($A8)-COLUMN())<>""
Em sẽ cải tiến tiếp sau khi...ăn cơmCode này chỉ đúng khi người ta nhập trực tiếp ---> Nếu họ copy từ nơi khác rồi paste vào thì code không hoạt động!
Bạn cải tiến lại code nhé (dùng vòng lập)
---Em nghĩ Validation có thể làm tốt điều này (mà lại nhanh hơn code)... vậy tại sao anh không dùng nhỉ?
Anh thử code này xem:---
Cám ơn chú.
Vẫn đang đau đầu vì code của bạn ptlong04x1 khi nhập liệu thì đúng, nhưng khi paste thì bó tay. Chú cho anh hỏi có code nào mà trị được vừa nhập liệu bằng tay vừa paste không ( khổ nỗi là paste không ).
---
Đầy đủ thông tin thì file nó như thế này nhờ chú và các anh em xem giúp, đặc biệt nó có liên quan đến Khối Quy Cách, Mã Quy Cách Kiện và Tổng Cộng Khối ( gặp copy -> paste thì thua thật ).
Nếu không rõ xin anh em thông báo.
Đính kèm file
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Clls As Range
Application.EnableEvents = False
If Not Intersect(Range("B8:E1000"), Target) Is Nothing Then
For Each Clls In Target
If Not IsEmpty(Clls) And IsEmpty(Cells(Target.Row, "A")) Then
MsgBox "Ban chua nhap day du tai cot A", vbCritical
Target.ClearContents
Clls.Select: GoTo KT
End If
Next
End If
KT:
Application.EnableEvents = True
End Sub
Anh thử code này xem:
---
Cụ thể trong file đính kèm.Chú Ý:
2- Thông thường chỉ paste từ A8 đến E..
- Công thức tính Khối Quy Cách, Mã Quy Cách Kiện và Tổng Cộng Khối đều nằm trong code ( Nhập liệu bằng tay thì tự tính, gặp paste thì cũng liệt luôn )
Còn đây nữa chú ơi:
Cụ thể trong file đính kèm.
( Chú và bạn ptlong04x12 nghĩ ăn cơm đi )
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, Emp As Boolean
If Intersect(Target, [B:E]) Is Nothing Or _
WorksheetFunction.CountA(Target) = 0 Then Exit Sub
For Each Cll In Target
If Cells(Cll.Row, 1) = "" Then
Cll = ""
Cells(Cll.Row, 1).Select
Emp = True
End If
Next Cll
If Emp = True Then MsgBox "Nhap thieu", vbCritical
For Each Cll In Range("F8", "F" & [A65536].End(xlUp).Row)
If Cll.Offset(, -5) <> "" Then
Cll.FormulaR1C1 = "=RC[-4]*RC[-3]*RC[-2]*RC[-1]/10^9"
Cll.Offset(, 1).FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]&RC[-6]"
End If
Next Cll
Range("G4").Formula = "=SUM($F$8:" & [F65536].End(xlUp).Address & ")"
End Sub
Anh thử code này xem:
Em chưa kịp testPHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim Clls As Range Application.EnableEvents = False If Not Intersect(Range("B8:E1000"), Target) Is Nothing Then For Each Clls In Target If Not IsEmpty(Clls) And IsEmpty(Cells(Target.Row, "A")) Then MsgBox "Ban chua nhap day du tai cot A", vbCritical Target.ClearContents Clls.Select: GoTo KT End If Next End If KT: Application.EnableEvents = True End Sub
---Anh thử file xem :
PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim Cll As Range, Emp As Boolean If Intersect(Target, [B:E]) Is Nothing Or _ WorksheetFunction.CountA(Target) = 0 Then Exit Sub For Each Cll In Target If Cells(Cll.Row, 1) = "" Then Cll = "" Cells(Cll.Row, 1).Select Emp = True End If Next Cll If Emp = True Then MsgBox "Nhap thieu", vbCritical For Each Cll In Range("F8", "F" & [A65536].End(xlUp).Row) If Cll.Offset(, -5) <> "" Then Cll.FormulaR1C1 = "=RC[-4]*RC[-3]*RC[-2]*RC[-1]/10^9" Cll.Offset(, 1).FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]&RC[-6]" End If Next Cll Range("G4").Formula = "=SUM($F$8:" & [F65536].End(xlUp).Address & ")" End Sub
- Nếu số dòng trong kiện > số dòng paste : phải xóa số kiện thừa ( nếu phức tạp quá thì xóa tay cũng được )
- Khi paste từ dòng đầu tiên, nếu không có số kiện => ra thông báo => Đúng, nhưng công thức xóa mất tiêu đề cột.
Để đơn giản vấn đề anh chỉ cần:
- Đã ra thông báo thì không cập nhật công thức ( cho dòng đầu tiên )
---Cái này mình không hiểu, khi chọn vùng dữ liệu để Copy thì bạn không chọn dòng tiêu đề, sau đó paste vào ở dưới dòng tiêu đề có sẵn thì làm sao mất dòng tiêu đề được.
Chú Ý:
2- Thông thường chỉ paste từ A8 đến E..
---
Cụ thể là như vầy nè bạn ơi:
Mong bạn hiểu cho, vì vậy mới xảy ra trường hợp như thế.
Mong tin.
Sơ suất ---> Câu này:Em test thử thấy có vấn đề như sau :
Nếu cột A có dữ liệu không liên tục trên các hàng mà mình paste dữ liệu vào thì code không hoạt động.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Clls As Range
Application.EnableEvents = False
If Not Intersect(Range("B8:E1000"), Target) Is Nothing Then
For Each Clls In Target
If Not IsEmpty(Clls) And IsEmpty(Cells(Clls.Row, "A")) Then
MsgBox "Ban chua nhap day du tai cot A", vbCritical
Target.ClearContents
Clls.Select: GoTo KT
Else
Cells(Clls.Row, "F") = "=RC[-4]*RC[-3]*RC[-2]*RC[-1]/1000000000"
Cells(Clls.Row, "G") = "=RC[-6]*RC[-5]*RC[-4]*RC[-3]"
End If
Next
End If
KT:
Application.EnableEvents = True
End Sub
Sơ suất ---> Câu này:
If Not IsEmpty(Clls) And IsEmpty(Cells(Target.Row, "A"))
Lý ra phải là:
If Not IsEmpty(Clls) And IsEmpty(Cells(Clls.Row, "A"))
Sửa lại:
...........
Công thức SUM tại cell G7 thì không cần code, đơn giản ta sửa lại công thức thành =SUM($F:$F) là được rồi
Bạn Long nghiên cứu code không dùng vòng lập thử xem ---> Mình nghĩ là hoàn toàn có thể đấy (cái khó nhất đối với trường hợp này là đưa MsgBox vào chổ nào)1. Còn chỗ này ạ : nếu số kiện đã điền trước trên 5 dòng, mà paste dữ liệu vô 10 dòng thì đáng ra phải dữ lại 5 dòng đầu, tuy nhiên --> code xoá hết cả 10 dòng.
2. Anh Tâm còn yêu cầu, khi số kiện có 10 dòng mà dữ liệu paste vào có 5 dòng thì xoá đi 5 dòng số kiện thừa, và xoá luôn cả công thức thừa bên mấy cột F,G.
---Bạn Long nghiên cứu code không dùng vòng lập thử xem ---> Mình nghĩ là hoàn toàn có thể đấy (cái khó nhất đối với trường hợp này là đưa MsgBox vào chổ nào)
Bạn thử xem! (Tôi cũng là làm gần xong nhưng chưa hài lòng lắm nên không đưa lên)
Bản thân tôi thì cũng vui lắm rồi vì các anh em nhiệt tình và chỉ xin nhận câu :2. Anh Tâm còn yêu cầu, khi số kiện có 10 dòng mà dữ liệu paste vào có 5 dòng thì xoá đi 5 dòng số kiện thừa, và xoá luôn cả công thức thừa bên mấy cột F,G.
---Bạn dùng tạm File này cái đã, có gì sẽ sửa tiếp.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim DataRng As Range
Application.EnableEvents = False
If Not Intersect(Range("B8:E1000"), Target) Is Nothing Then
Set DataRng = Intersect(Target.EntireRow, Range("B8:E1000"))
With Intersect(Target.EntireRow, Range("F:F"))
.Offset(, 0).Value = "=RC[-4]*RC[-3]*RC[-2]*RC[-1]/1000000000"
.Offset(, 1).Value = "=RC[-6]*RC[-5]*RC[-4]*RC[-3]"
End With
On Error Resume Next
With Range("A7:G1000")
Intersect(.Resize(, 1).SpecialCells(4).EntireRow, .Cells).ClearContents
End With
If DataRng.Columns.Count = 4 Then
On Error GoTo Tiep
If DataRng.SpecialCells(4).Count = DataRng.Count Then
Intersect(DataRng.EntireRow, Range("A:G")).ClearContents
End If
Tiep:
End If
End If
Application.EnableEvents = True
End Sub