DMQ
Thành viên dốt
- Tham gia
- 21/3/12
- Bài viết
- 713
- Được thích
- 54
- Giới tính
- Nam
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, lr As Long, counter As Integer
Dim MaSo As String, DonHang As String
If Not Intersect(Target, Range("D4:D1000")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
MaSo = Target.Value
DonHang = Cells(Target.Row, 2) & "-" & Cells(Target.Row, 3)
If Not IsEmpty(MaSo) Then
With Sheets("BangCanDoi")
lr = .Range("A" & Rows.Count).End(xlUp).Row
For i = 4 To lr
If .Range("D"&i) = MaSo Then counter = 1: Exit For
Next i
End With
If counter = 0 Then MsgBox "Ma so nay khong co trong don hang " & DonHang, vbCritical
End If
End If
End Sub
Bạn thử, thêm module mới rồi dán đoạn code sau vào:Chào các anh chị.
Em có file đính kèm, trong file em có ghi chú.
Mong các anh chị giúp em viêt code khi không thấy mã số có trong đơn hàng + số yêu cầu (vì có trùng đơn hàng, trùng kiểu, chỉ khác nhau số yêu cầu.)
Option Explicit
Public DS As Object
Public sKEY As String
Public Const sDELIM As String = "-_^"
Public blNapDS As Boolean
Public Sub NapDS()
Dim shCanDoi As Worksheet
Dim varDS As Variant
Dim r As Long
blNapDS = False
Const sBangCanDoi As String = "BangCanDoi"
Set shCanDoi = ThisWorkbook.Worksheets(sBangCanDoi)
varDS = shCanDoi.Range("A3").CurrentRegion.Value
If Not IsArray(varDS) Then Exit Sub
Set DS = CreateObject("Scripting.Dictionary")
For r = 2 To UBound(varDS, 1)
sKEY = varDS(r, 1) & sDELIM & varDS(r, 3) & sDELIM & varDS(r, 4)
If Not DS.Exists(sKEY) Then DS.Add sKEY, r
Next r
blNapDS = True
End Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sDonHang As String, sMa As String
Dim r As Long, c As Long
r = Target.Row: c = Target.Column
If (c <> 4) Or (r < 4) Then Exit Sub
Application.EnableEvents = False
If Not blNapDS Then Call NapDS
sMa = Target.Value
sDonHang = Me.Cells(r, 2) & "-" & Me.Cells(r, 3)
If Len(sDonHang) = 0 Then
MsgBox "Nhap don hang va so yeu cau", vbCritical, "Loi"
GoTo End_
End If
sKEY = Me.Cells(r, 2) & sDELIM & Me.Cells(r, 3) & sDELIM & sMa
If Not DS.Exists(sKEY) Then GoTo lb_Loi
GoTo End_
lb_Loi:
MsgBox "Ma so [" & sMa & "] khong co trong don hang: " & sDonHang, vbCritical, "Loi"
End_:
Application.EnableEvents = True
End Sub
Để khống chế việc nhập dữ liệu sai, bạn cũng có thể tìm hiểu cách tạo Form nhập liệuChào các anh chị.
Em có file đính kèm, trong file em có ghi chú.
Mong các anh chị giúp em viêt code khi không thấy mã số có trong đơn hàng + số yêu cầu (vì có trùng đơn hàng, trùng kiểu, chỉ khác nhau số yêu cầu.)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D4:D10000")) Is Nothing Then
Dim lr As Long, Arr(), j As Long
Dim Dic As Object, Key As String, sKey As String
Dim i As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("BangCanDoi")
lr = .Range("A" & Rows.Count).End(xlUp).Row
Arr = .Range("A4:F" & lr).Value
For i = 1 To UBound(Arr)
If Arr(i, 1) <> "" And Arr(i, 3) <> "" And Arr(i, 4) <> "" Then
Key = Arr(i, 1) & "|" & Arr(i, 3) & "|" & Arr(i, 4)
Dic.Add (Key), ""
End If
Next i
End With
With Sheets("Xuat")
For i = 4 To 10000
For j = 2 To 4
If .Cells(i, j) <> "" Then
sKey = .Cells(i, 2) & "|" & .Cells(i, 3) & "|" & .Cells(i, 4)
If Not Dic.exists(sKey) Then
MsgBox "Ma khong ton tai trong don hang: " & .Cells(i, 2) & "-" & .Cells(i, 3)
Exit Sub
End If
End If
Next j
Next i
End With
Set Dic = Nothing
End If
End Sub
Bạn thử lại nhé.Xin lỗi!! lúc mình gõ trả lời thì chưa thấy các bạn @Ngày mai trời lại sáng và bạn @THÓC SAMA trả lời, Mình đang nơi với bạn @anhtuan2939
Cám ơn bạn đã giúp viết code.
Nhưng chưa đúng bạn ơi.
Mình có thử gõ ngày 12/8/2022 đơn hàng J2812 số yêu cầu 03 mã số 061560 mà chẳng thấy báo lỗi.
Vì đơn hàng J2812 số yêu cầu 03 không có mã số 061560.
Mong bạn xem lại giúp mình.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, lr As Long, counter As Integer
Dim MaSo As String, DonHang As String, SoYeuCau As String
If Not Intersect(Target, Range("D4:D1000")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
MaSo = Target.Value
DonHang = Cells(Target.Row, 2)
SoYeuCau = Cells(Target.Row, 3)
If Not IsEmpty(MaSo) Then
With Sheets("BangCanDoi")
lr = .Range("A" & Rows.Count).End(xlUp).Row
For i = 4 To lr
If .Range("A" & i) = DonHang And .Range("C" & i) = SoYeuCau And .Range("D" & i) = MaSo Then counter = 1: Exit For
Next i
End With
If counter = 0 Then MsgBox "Ma so nay khong co trong don hang " & DonHang & "-" & SoYeuCau, vbCritical
End If
End If
End Sub
Bài 3,bạn sửa lại giúp mình chỗ này nhé:Cám ơn hai bạn @Ngày mai trời lại sáng và bạn @THÓC SAMA nhiều.
Code của hai bạn chạy tốt, sai cột đon hàng cũng báo, cột số yêu cầu cũng báo, cột đơn hàng mà gõ chữ thường cũng báo (như j thường)
Bạn @THÓC SAMA nói nhập liệu băng Form cũng hay, mà mình thì mù tịt.
Nếu được bạn có thể giúp mình.
Mỗi lần enter hay tab là phải chạy nhiều for vậy bạn?Để khống chế việc nhập dữ liệu sai, bạn cũng có thể tìm hiểu cách tạo Form nhập liệu
-->Khi chọn Đơn hàng + Số yêu cầu thì trường mã số chỉ hiển thị mã số tương ứng.
PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("D4:D10000")) Is Nothing Then Dim lr As Long, Arr(), j As Long Dim Dic As Object, Key As String, sKey As String Dim i As Long Set Dic = CreateObject("Scripting.Dictionary") With Sheets("BangCanDoi") lr = .Range("A" & Rows.Count).End(xlUp).Row Arr = .Range("A4:F" & lr).Value For i = 1 To UBound(Arr) If Arr(i, 1) <> "" And Arr(i, 3) <> "" And Arr(i, 4) <> "" Then Key = Arr(i, 1) & "|" & Arr(i, 3) & "|" & Arr(i, 4) Dic.Add (Key), "" End If Next i End With With Sheets("Xuat") For i = 4 To 1000 For j = 2 To 4 If .Cells(i, j) <> "" Then sKey = .Cells(i, 2) & "|" & .Cells(i, 3) & "|" & .Cells(i, 4) If Not Dic.exists(sKey) Then MsgBox "Ma khong ton tai trong don hang: " & .Cells(i, 2) & "-" & .Cells(i, 3) Exit Sub End If End If Next j Next i End With Set Dic = Nothing End If End Sub
Thay toàn bộ code trong Worksheet 'Xuat' như sau:CÁc bạn có thể giúp mình khi báo lỗi xong thì cell cột đơn hàng được chọn không ạ.
Option Explicit
Dim cell As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set cell = Target
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sDonHang As String, sMa As String
Dim r As Long, c As Long
On Error GoTo End_
r = Target.Row: c = Target.Column
If (c <> 4) Or (r < 4) Then Exit Sub
Application.EnableEvents = False
If Not blNapDS Then Call NapDS
sMa = Target.Value
sDonHang = Me.Cells(r, 2) & "-" & Me.Cells(r, 3)
If Len(sDonHang) < 2 Then
MsgBox "Nhap don hang va so yeu cau", vbCritical, "Loi"
If Not cell Is Nothing Then cell.ClearContents
If Len(Me.Cells(r, 2)) = 0 Then
Me.Cells(r, 2).Select
ElseIf Len(Me.Cells(r, 3)) = 0 Then
Me.Cells(r, 3).Select
End If
GoTo End_
End If
sKEY = Me.Cells(r, 2) & sDELIM & Me.Cells(r, 3) & sDELIM & sMa
If Not DS.Exists(sKEY) Then GoTo lb_Loi
GoTo End_
lb_Loi:
MsgBox "Ma so [" & sMa & "] khong co trong don hang: " & sDonHang, vbCritical, "Loi"
If Not cell Is Nothing Then cell.Select
End_:
Application.EnableEvents = True
End Sub
Bạn sửa dòng:Cell ở cột đơn hàng được Select mà bạn @Ngày mai trời lại sáng
If Not cell Is Nothing Then cell.Select
If Not cell Is Nothing Then
r = cell.Row
Me.Cells(r, 2).Select
End If