Kiểm tra dữ liệu nhập vào có đúng không ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

manhav2k5

Thành viên mới
Tham gia
19/6/16
Bài viết
30
Được thích
6
Kính gửi các anh, chị và các bạn.
Em có file Excel quản lý sản xuất nhập hàng ngày, khi em nhập nhập thêm dòng mới thì em phải check thông tin xem có đúng ko. Do nhiều người thao tác ( người nhập) khác nhau, nhiều khi check thông tin không chính xác do nhìn mắt. Nên em nhờ các anh chị viết giúp em code vba để có thể check được tự động khi nhập dữ liệu. Yêu cầu chi tiết em đã ghi trong file đính kèm ah. Em xin cảm ơn ah.
 

File đính kèm

Lần chỉnh sửa cuối:
Kính gửi các anh, chị và các bạn.
Em có file Excel quản lý sản xuất nhập hàng ngày, khi em nhập nhập thêm dòng mới thì em phải check thông tin xem có đúng ko. Do nhiều người thao tác ( người nhập) khác nhau, nhiều khi check thông tin không chính xác do nhìn mắt. Nên em nhờ các anh chị viết giúp em code vba để có thể check được tự động khi nhập dữ liệu. Yêu cầu chi tiết em đã ghi trong file đính kèm ah. Em xin cảm ơn ah.
Bạn thêm đoạn code này vào Sheets DATA nhé. hy vọng đúng ý
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 2 Or Target.Column <> 8 Then Exit Sub
If Target.Row > 2 And Target.Column = 8 Then
If Target.Value = [M1].Value Then
    Dim Lr&, K&, Rng As Range, sRng As Range
Lr = Sheets("LOAI2").Cells(Rows.Count, 3).End(xlUp).Row
Set Rng = Sheets("LOAI2").Range("B5:D" & Lr)
Set sRng = Rng.Find(Target.Offset(0, -2))
If Not sRng Is Nothing Then
    K = sRng.Row
    Target.Offset(0, 2) = Sheets("LOAI2").Cells(K + 1, 3)
    Target.Offset(0, 3) = Sheets("LOAI2").Cells(K + 1, 4)
End If
End If
End If
End Sub
Từ đây khi bạn chọn loại 2 thì ô tương ứng ở cột J và K sẽ tự dộng được điền dữ liệu (ô màu vàng tương ứng với mã SP của Sh LOAI2)
 
Upvote 0
Bạn thêm đoạn code này vào Sheets DATA nhé. hy vọng đúng ý
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 2 Or Target.Column <> 8 Then Exit Sub
If Target.Row > 2 And Target.Column = 8 Then
If Target.Value = [M1].Value Then
    Dim Lr&, K&, Rng As Range, sRng As Range
Lr = Sheets("LOAI2").Cells(Rows.Count, 3).End(xlUp).Row
Set Rng = Sheets("LOAI2").Range("B5:D" & Lr)
Set sRng = Rng.Find(Target.Offset(0, -2))
If Not sRng Is Nothing Then
    K = sRng.Row
    Target.Offset(0, 2) = Sheets("LOAI2").Cells(K + 1, 3)
    Target.Offset(0, 3) = Sheets("LOAI2").Cells(K + 1, 4)
End If
End If
End If
End Sub
Từ đây khi bạn chọn loại 2 thì ô tương ứng ở cột J và K sẽ tự dộng được điền dữ liệu (ô màu vàng tương ứng với mã SP của Sh LOAI2)
Mình vừa copy đoạn code của bạn dán vào nhưng không hiển thị kết quả gì bạn ah.
Thêm một ý nữa là vì mình muốn giá trị nhập tay vào là để biết cái dung sai đó bên yêu cầu có đúng ko nên bạn đừng để tự động lấy từ sheet "loại2" giúp mình với. Nếu dung sai khác bạn hiển thị thông báo cho người dùng biết giúp mình với.
 
Upvote 0
Mình vừa copy đoạn code của bạn dán vào nhưng không hiển thị kết quả gì bạn ah.
Thêm một ý nữa là vì mình muốn giá trị nhập tay vào là để biết cái dung sai đó bên yêu cầu có đúng ko nên bạn đừng để tự động lấy từ sheet "loại2" giúp mình với. Nếu dung sai khác bạn hiển thị thông báo cho người dùng biết giúp mình với.
Copy vào trang code của cái sheet muốn kiểm tra đó.
 
Upvote 0
Mình copy vào rồi n khi nhập không thấy hiển thị hay có gì thay đổi, bạn xem hình ảnh mình copy vào đúng không?
 

File đính kèm

  • DSC_0189.JPG
    DSC_0189.JPG
    108.1 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
Các anh chị ơi có ai biết hỗ trợ giúp em với ah.
 
Upvote 0
Mình copy vào rồi n khi nhập không thấy hiển thị hay có gì thay đổi, bạn xem hình ảnh mình copy vào đúng không?
copy 1 ô có chữ "Loại 2" và dán vào ô M1 SH Data và thử lại xem (ô M1 là ô để so sánh với ô nhập vào (ô target)
 
Upvote 0
Tại sao bạn không để code tự động nhập cho nhỉ? vừa tránh sai sót vừa đỡ tốn công, tiết kiệm được thời gian....
khi bạn click chọn ô H(n)=Loại 2 thì code tự động nhập vào 2 cột dung sai rồi
 
Upvote 0
Vì bên mình sản xuất nhưng dựa vào bên gửi yêu cầu sản xuất, trong yêu cầu họ có ghi cái dung sai đó, nên mục đích của mình là khi người nhập thông tin ví dụ dùng sai hướng x là 2 khác chuẩn cố định bên sheet loai2 thì sẽ báo lỗi cho người nhập biết, tiếp đó là check đến hướng ý cũng vậy bạn ah. Mục đích chính là biết bên yêu cầu có yêu cầu đúng dung sai không ah. Bạn giúp mình với.
 
Lần chỉnh sửa cuối:
Upvote 0
Vì bên mình sản xuất nhưng dựa vào bên gửi yêu cầu sản xuất, trong yêu cầu họ có ghi cái dung sai đó, nên mục đích của mình là khi người nhập thông tin ví dụ dùng sai hướng x là 2 khác chuẩn cố định bên sheet loai2 thì sẽ báo lỗi cho người nhập biết, tiếp đó là check đến hướng ý cũng vậy bạn ah. Mục đích chính là biết bên yêu cầu có yêu cầu đúng dung sai không ah. Bạn giúp mình với.
Bạn thay code này vào code ở Sh DATA
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 2 Or Target.Column <> 11 Then Exit Sub
If Target.Row > 2 And Target.Column = 11 Then
If Target.Offset(0, -5) <> Empty And Target.Offset(0, -3) = [M1].Value Then
    Dim Lr&, K&, I&, Rng As Range, sRng As Range
    Lr = Sheets("LOAI2").Cells(Rows.Count, 3).End(xlUp).Row
    Set Rng = Sheets("LOAI2").Range("B5:D" & Lr)
    Set sRng = Rng.Find(Target.Offset(0, -5))
If Not sRng Is Nothing Then
    K = sRng.Row
    For I = K To K + 2
        If Sheets("LOAI2").Cells(K, 3).Value <> Target.Offset(0, -1).Value Then
            MsgBox "Nhâp sai Dung sai X-Nhâp lai"
            Target.Offset(0, -1) = ""
            Exit Sub
        End If
        If Sheets("LOAI2").Cells(K, 5).Value <> Target.Value Then
            MsgBox "Nhâp sai Dung sai Y-Nhâp lai"
            Target = ""
            Exit Sub
        End If
    Next I
End If
End If
End If
End Sub

LƯU Ý: Ô M1 ="Loại 2"
 

File đính kèm

Upvote 0
Bạn thay code này vào code ở Sh DATA
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 2 Or Target.Column <> 11 Then Exit Sub
If Target.Row > 2 And Target.Column = 11 Then
If Target.Offset(0, -5) <> Empty And Target.Offset(0, -3) = [M1].Value Then
    Dim Lr&, K&, I&, Rng As Range, sRng As Range
    Lr = Sheets("LOAI2").Cells(Rows.Count, 3).End(xlUp).Row
    Set Rng = Sheets("LOAI2").Range("B5:D" & Lr)
    Set sRng = Rng.Find(Target.Offset(0, -5))
If Not sRng Is Nothing Then
    K = sRng.Row
    For I = K To K + 2
        If Sheets("LOAI2").Cells(K, 3).Value <> Target.Offset(0, -1).Value Then
            MsgBox "Nhâp sai Dung sai X-Nhâp lai"
            Target.Offset(0, -1) = ""
            Exit Sub
        End If
        If Sheets("LOAI2").Cells(K, 5).Value <> Target.Value Then
            MsgBox "Nhâp sai Dung sai Y-Nhâp lai"
            Target = ""
            Exit Sub
        End If
    Next I
End If
End If
End If
End Sub

LƯU Ý: Ô M1 ="Loại 2"
Cảm ơn bạn đã hỗ trợ, giúp đỡ mình.
Theo cách trên :
1) Khi mình nhập dung sai hướng x nếu không nằm trong 3 giá trị cho phép theo sheet "LOAI2" thì hiện thông báo lỗi sai hướng x thì đã OK.
2) Khi dung sai hướng x thỏa mãn 1 trong 3 giá trị cho phép và giá trị hướng Y tương ứng với hướng X đã nhập không đúng thì hiện thông báo lỗi hướng Y cũng đã OK.
3) Nhưng khi dung sai hướng Y bị sai, mình nhập lại dung sai với một giá trị khác không nằm trong 3 giá trị hướng y cho phép theo sheet "Loai2" , cũng không thỏa mãn với dung sai hướng X tương ứng nhưng không thấy hiển thị thông báo
lỗi sai hướng Y. Nhờ bạn sửa giúp mình.
 
Upvote 0
Cảm ơn bạn đã hỗ trợ, giúp đỡ mình.
Theo cách trên :
1) Khi mình nhập dung sai hướng x nếu không nằm trong 3 giá trị cho phép theo sheet "LOAI2" thì hiện thông báo lỗi sai hướng x thì đã OK.
2) Khi dung sai hướng x thỏa mãn 1 trong 3 giá trị cho phép và giá trị hướng Y tương ứng với hướng X đã nhập không đúng thì hiện thông báo lỗi hướng Y cũng đã OK.
3) Nhưng khi dung sai hướng Y bị sai, mình nhập lại dung sai với một giá trị khác không nằm trong 3 giá trị hướng y cho phép theo sheet "Loai2" , cũng không thỏa mãn với dung sai hướng X tương ứng nhưng không thấy hiển thị thông báo
lỗi sai hướng Y. Nhờ bạn sửa giúp mình.
Sự kiện thay đổi là ở Ô J(n) sau khi enter hoặc chuyển chuột sang ô khác sé quyết định đến việc kiểm tra dữ liệu nhập vào.
Bạn nhập dung sai X sau đó nhập dung sai Y và Enter hoặc chuyển chuột sang ô khác
Code sẽ kiểm tra Dung sai X trước
+Nếu Sai sẽ Xóa ô dung sai X (ô I...) và thoát khỏi vòng lặp- kết thúc kiểm tra bắt buộc bạn phải nhập lại,
+Nếu đúng sẽ tiếp tục kiểm tra dung sai Y. nếu sai sẽ Xóa ô dung sai Y (ô J..) và thoát khỏi vòng lặp- kết thúc vòng lặp, bạn phải nhập lại ô sai đã bị Xóa.
Có nghĩa là dung sai X (ô I(n)) sẽ được kiểm tra trước( có đúng mới kiểm tra đến dung sai Y (ô J(n)). Ô nào sai sẽ bị Xóa để nhập lại. Ô Dung sai Y khi nhập lại cũng sẽ được kiểm tra theo một quy trinh như vậy

Nên tôi nghĩ là không có trường hợp Ô dung sai Y nhập sai rôi ===> bị xóa đi để nhập lại, nhập lại vẫn nhập sai mà không hiện thông báo là điều hơi bị bất ngờ

Nếu có thể bạn quay lại màn hình khi nhập dung sai Y sai===> bị Xóa, Nhập lại (nhập sai) = không hiện cảnh báo nên. Tôi có thể không giúp được bạn nhưng sẽ có rất nhiều anh chị em khác có thể giúp được bạn.
 
Upvote 0
Kính gửi các anh, chị và các bạn.
Em có file Excel quản lý sản xuất nhập hàng ngày, khi em nhập nhập thêm dòng mới thì em phải check thông tin xem có đúng ko. Do nhiều người thao tác ( người nhập) khác nhau, nhiều khi check thông tin không chính xác do nhìn mắt. Nên em nhờ các anh chị viết giúp em code vba để có thể check được tự động khi nhập dữ liệu. Yêu cầu chi tiết em đã ghi trong file đính kèm ah. Em xin cảm ơn ah.
Chep code vào sheet Data
Mã:
Option Explicit
Dim dicDS As Object
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, DungSai, DungSai_Y, iR&, jC&

  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Target.Value = Empty Then Exit Sub
  iR = Target.Row:  jC = Target.Column
  If Not (Range("H" & iR).Value Like "Lo?i 2") Then Exit Sub
  If dicDS Is Nothing Then Call Create_Dic
  maSP = Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Range("J" & iR).Value = Empty Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub

Private Sub Worksheet_Activate()
  Call Create_Dic
End Sub

Sub Create_Dic()
  Dim sArr(), maSP$, sRow&, i&
  With Sheets("LOAI2")
    sArr = .Range("B5", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  Set dicDS = CreateObject("scripting.dictionary")
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      maSP = sArr(i, 1)
      dicDS.Item(maSP) = Chr(10) & sArr(i, 2) & Chr(10) & sArr(i + 1, 2) & Chr(10) & sArr(i + 2, 2)
    End If
    dicDS.Item(maSP & "|" & sArr(i, 2)) = sArr(i, 3)
  Next i
End Sub
 

File đính kèm

Upvote 0
Chep code vào sheet Data
Mã:
Option Explicit
Dim dicDS As Object
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, DungSai, DungSai_Y, iR&, jC&

  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Target.Value = Empty Then Exit Sub
  iR = Target.Row:  jC = Target.Column
  If Not (Range("H" & iR).Value Like "Lo?i 2") Then Exit Sub
  If dicDS Is Nothing Then Call Create_Dic
  maSP = Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Range("J" & iR).Value = Empty Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub

Private Sub Worksheet_Activate()
  Call Create_Dic
End Sub

Sub Create_Dic()
  Dim sArr(), maSP$, sRow&, i&
  With Sheets("LOAI2")
    sArr = .Range("B5", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  Set dicDS = CreateObject("scripting.dictionary")
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      maSP = sArr(i, 1)
      dicDS.Item(maSP) = Chr(10) & sArr(i, 2) & Chr(10) & sArr(i + 1, 2) & Chr(10) & sArr(i + 2, 2)
    End If
    dicDS.Item(maSP & "|" & sArr(i, 2)) = sArr(i, 3)
  Next i
End Sub
Anh ơi, code anh sửa đúng rồi ah, chỉ có một chút nhỏ nữa chưa bắt lỗi được là: khi em nhập giá trị là 0 vào cả dung sai hướng X và hướng Y, mặc dù giá trị là sai nhưng không hiển thị được lỗi anh ah. Nhờ a sửa lại giúp em với ah.
 
Upvote 0
Anh ơi, code anh sửa đúng rồi ah, chỉ có một chút nhỏ nữa chưa bắt lỗi được là: khi em nhập giá trị là 0 vào cả dung sai hướng X và hướng Y, mặc dù giá trị là sai nhưng không hiển thị được lỗi anh ah. Nhờ a sửa lại giúp em với ah.
Chỉnh lệnh
If Target.Value =Empty Then Exit Sub
Thành
If Len(Target.Value) = 0 Then Exit Sub
 
Upvote 0
Anh ơi dung sai x nhập 0 nếu sai đã hiển thị báo lỗi, nhưng em nhập tiếp dung sai y là 0 thì lại hiện thì thông báo chưa nhập dung sai x như hình ảnh đính kèm dưới đây nhờ anh sửa giúp ah.
E xin hỏi thêm anh vấn đề nữa : nếu sau này trong quá trình sử dụng không chỉ yêu cầu check mỗi "loại 2" phát sinh phải check thêm cả " loại 1" nữa hoặc "loại n" thì anh sửa code giúp em để khi đó tùy vào yêu thực tế em có thể dựa vào để tùy biến không ah.
Em gửi file đính kèm nhờ anh check thêm "loại 1" giúp em ah.
Mong anh giúp đỡ ah.
 

File đính kèm

  • DSC_0207.JPG
    DSC_0207.JPG
    118.8 KB · Đọc: 6
  • BQL-1 (2).xlsb
    BQL-1 (2).xlsb
    433.4 KB · Đọc: 2
Upvote 0
Anh ơi dung sai x nhập 0 nếu sai đã hiển thị báo lỗi, nhưng em nhập tiếp dung sai y là 0 thì lại hiện thì thông báo chưa nhập dung sai x như hình ảnh đính kèm dưới đây nhờ anh sửa giúp ah.
E xin hỏi thêm anh vấn đề nữa : nếu sau này trong quá trình sử dụng không chỉ yêu cầu check mỗi "loại 2" phát sinh phải check thêm cả " loại 1" nữa hoặc "loại n" thì anh sửa code giúp em để khi đó tùy vào yêu thực tế em có thể dựa vào để tùy biến không ah.
Em gửi file đính kèm nhờ anh check thêm "loại 1" giúp em ah.
Mong anh giúp đỡ ah.
Nhập các loại vào ô N1
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, loai$, DungSai, DungSai_Y, iR&, jC&
 
  loai = Range("N1").Value
  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
  iR = Target.Row:  jC = Target.Column
  If InStr(1, loai, Range("H" & iR).Value, vbTextCompare) = 0 Then Exit Sub
  If dicDS Is Nothing Then Call Create_Dic
  maSP = Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Len(Range("J" & iR).Value) = 0 Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub
 

File đính kèm

Upvote 0
Nhập các loại vào ô N1
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, loai$, DungSai, DungSai_Y, iR&, jC&
 
  loai = Range("N1").Value
  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
  iR = Target.Row:  jC = Target.Column
  If InStr(1, loai, Range("H" & iR).Value, vbTextCompare) = 0 Then Exit Sub
  If dicDS Is Nothing Then Call Create_Dic
  maSP = Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Len(Range("J" & iR).Value) = 0 Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub
Anh HieuCD ơi thành thật xin lỗi anh vì em diễn đạt yêu cầu chưa rõ ràng ah. Ý của em là nếu sau này phát sinh cần check thêm "loại 1" hoặc "loại n" nào đó, cứ mỗi một loại cần check thì sẽ có tương ứng với một sheet đi cùng để check ah. Ví dụ check loại 2 thì check theo sheet "loai2", check loại 1 thì sẽ check thông tin theo sheet "loai1", nếu check loại 3 thì sẽ check thông tin theo sheet "loai3". Hiện tại file a gửi thì khi check loại 1 và loại 2 đều check theo sheet "loai2". Anh sửa giúp em với khi e chọn loại 1 thì sẽ check thông tin theo sheet "loai1", nếu chọn loại 2 thì check theo sheet "loại2". File mẫu e đã gửi ở bài #21 ah.
 
Upvote 0
Anh HieuCD ơi thành thật xin lỗi anh vì em diễn đạt yêu cầu chưa rõ ràng ah. Ý của em là nếu sau này phát sinh cần check thêm "loại 1" hoặc "loại n" nào đó, cứ mỗi một loại cần check thì sẽ có tương ứng với một sheet đi cùng để check ah. Ví dụ check loại 2 thì check theo sheet "loai2", check loại 1 thì sẽ check thông tin theo sheet "loai1", nếu check loại 3 thì sẽ check thông tin theo sheet "loai3". Hiện tại file a gửi thì khi check loại 1 và loại 2 đều check theo sheet "loai2". Anh sửa giúp em với khi e chọn loại 1 thì sẽ check thông tin theo sheet "loai1", nếu chọn loại 2 thì check theo sheet "loại2". File mẫu e đã gửi ở bài #21 ah.

Anh HieuCD ơi thành thật xin lỗi anh vì em diễn đạt yêu cầu chưa rõ ràng ah. Ý của em là nếu sau này phát sinh cần check thêm "loại 1" hoặc "loại n" nào đó, cứ mỗi một loại cần check thì sẽ có tương ứng với một sheet đi cùng để check ah. Ví dụ check loại 2 thì check theo sheet "loai2", check loại 1 thì sẽ check thông tin theo sheet "loai1", nếu check loại 3 thì sẽ check thông tin theo sheet "loai3". Hiện tại file a gửi thì khi check loại 1 và loại 2 đều check theo sheet "loai2". Anh sửa giúp em với khi e chọn loại 1 thì sẽ check thông tin theo sheet "loai1", nếu chọn loại 2 thì check theo sheet "loại2". File mẫu e đã gửi ở bài #21 ah.
Nhập các loại vào cột M
Mã:
Option Explicit
Dim dicDS As Object

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, loai$, DungSai, DungSai_Y, iR&, jC&

  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
 
  If dicDS Is Nothing Then Call Create_Dic
  iR = Target.Row:  jC = Target.Column
  loai = Range("H" & iR).Value
  If dicDS.exists(loai) = False Then Exit Sub
 
  maSP = loai & "|" & Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Len(Range("J" & iR).Value) = 0 Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub

Private Sub Worksheet_Activate()
  Call Create_Dic
End Sub

Sub Create_Dic()
  Dim sArr(), aLoai(), maSP$, sRow&, n&, i&
 
  Set dicDS = CreateObject("scripting.dictionary")
  aLoai = Range("M1:N" & Range("M" & Rows.Count).End(xlUp).Row).Value 'Loai 1, Loai 2
  On Error Resume Next
  For n = 1 To UBound(aLoai)
    dicDS.Item(aLoai(n, 1)) = ""
    With Sheets("LOAI" & Split(aLoai(n, 1), " ")(1))
      If Err.Number <> 0 Then GoTo Thoat
      sArr = .Range("B5", .Range("D" & Rows.Count).End(xlUp)).Value
    End With
    sRow = UBound(sArr)
    For i = 1 To sRow
      If sArr(i, 1) <> Empty Then
        maSP = aLoai(n, 1) & "|" & sArr(i, 1)
        dicDS.Item(maSP) = Chr(10) & sArr(i, 2) & Chr(10) & sArr(i + 1, 2) & Chr(10) & sArr(i + 2, 2)
      End If
      dicDS.Item(maSP & "|" & sArr(i, 2)) = sArr(i, 3)
    Next i
Thoat:
    Err = 0
  Next n
End Sub
 

File đính kèm

Upvote 0
Nhập các loại vào cột M
Mã:
Option Explicit
Dim dicDS As Object

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, loai$, DungSai, DungSai_Y, iR&, jC&

  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
 
  If dicDS Is Nothing Then Call Create_Dic
  iR = Target.Row:  jC = Target.Column
  loai = Range("H" & iR).Value
  If dicDS.exists(loai) = False Then Exit Sub
 
  maSP = loai & "|" & Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Len(Range("J" & iR).Value) = 0 Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub

Private Sub Worksheet_Activate()
  Call Create_Dic
End Sub

Sub Create_Dic()
  Dim sArr(), aLoai(), maSP$, sRow&, n&, i&
 
  Set dicDS = CreateObject("scripting.dictionary")
  aLoai = Range("M1:N" & Range("M" & Rows.Count).End(xlUp).Row).Value 'Loai 1, Loai 2
  On Error Resume Next
  For n = 1 To UBound(aLoai)
    dicDS.Item(aLoai(n, 1)) = ""
    With Sheets("LOAI" & Split(aLoai(n, 1), " ")(1))
      If Err.Number <> 0 Then GoTo Thoat
      sArr = .Range("B5", .Range("D" & Rows.Count).End(xlUp)).Value
    End With
    sRow = UBound(sArr)
    For i = 1 To sRow
      If sArr(i, 1) <> Empty Then
        maSP = aLoai(n, 1) & "|" & sArr(i, 1)
        dicDS.Item(maSP) = Chr(10) & sArr(i, 2) & Chr(10) & sArr(i + 1, 2) & Chr(10) & sArr(i + 2, 2)
      End If
      dicDS.Item(maSP & "|" & sArr(i, 2)) = sArr(i, 3)
    Next i
Thoat:
    Err = 0
  Next n
End Sub
Cảm ơn anh đã hỗ trợ kết quả đúng như yêu cầu rồi ah.
 
Upvote 0
Nhập các loại vào cột M
Mã:
Option Explicit
Dim dicDS As Object

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim maSP$, loai$, DungSai, DungSai_Y, iR&, jC&

  If Target.Row < 5 Or Target.Column < 10 Or Target.Column > 11 Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
 
  If dicDS Is Nothing Then Call Create_Dic
  iR = Target.Row:  jC = Target.Column
  loai = Range("H" & iR).Value
  If dicDS.exists(loai) = False Then Exit Sub
 
  maSP = loai & "|" & Range("F" & iR).Value
  DungSai = Target.Value
  If dicDS.exists(maSP) = True Then
    Application.EnableEvents = False
    If jC = 10 Then
      If dicDS.exists(maSP & "|" & DungSai) = False Then
        MsgBox "Dung Sai Huong_X khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo cac gia tri:" & dicDS.Item(maSP)
        Target.Value = Empty: Target.Select
        GoTo Thoat
      End If
    ElseIf jC = 11 Then
      DungSai_Y = dicDS.Item(maSP & "|" & Range("J" & iR).Value)
      If Len(Range("J" & iR).Value) = 0 Then
        MsgBox "Phai nhap Dung Sai Huong_X truoc khi nhap Dung Sai Huong_Y! "
        Target.Value = Empty: Target.Offset(, -1).Select
        GoTo Thoat
      ElseIf DungSai_Y <> DungSai Then
        MsgBox "Dung sai Huong_Y khong dung!" & Chr(10) & Chr(10) & _
                "Nhap lai theo gia tri:   " & Format(DungSai_Y, "0.0##")
        Target.Value = Empty
        Target.Select
        GoTo Thoat
      End If
    End If
Thoat:
    Application.EnableEvents = True
  End If
End Sub

Private Sub Worksheet_Activate()
  Call Create_Dic
End Sub

Sub Create_Dic()
  Dim sArr(), aLoai(), maSP$, sRow&, n&, i&
 
  Set dicDS = CreateObject("scripting.dictionary")
  aLoai = Range("M1:N" & Range("M" & Rows.Count).End(xlUp).Row).Value 'Loai 1, Loai 2
  On Error Resume Next
  For n = 1 To UBound(aLoai)
    dicDS.Item(aLoai(n, 1)) = ""
    With Sheets("LOAI" & Split(aLoai(n, 1), " ")(1))
      If Err.Number <> 0 Then GoTo Thoat
      sArr = .Range("B5", .Range("D" & Rows.Count).End(xlUp)).Value
    End With
    sRow = UBound(sArr)
    For i = 1 To sRow
      If sArr(i, 1) <> Empty Then
        maSP = aLoai(n, 1) & "|" & sArr(i, 1)
        dicDS.Item(maSP) = Chr(10) & sArr(i, 2) & Chr(10) & sArr(i + 1, 2) & Chr(10) & sArr(i + 2, 2)
      End If
      dicDS.Item(maSP & "|" & sArr(i, 2)) = sArr(i, 3)
    Next i
Thoat:
    Err = 0
  Next n
End Sub
Anh ơi cho em hỏi thêm chút là nếu loại sản phẩm "loại 1", "loại 2" em muốn đổi thành "thông dụng" và "cao cấp" đồng thời tên các sheet chứa dữ liệu dùng để check khi nhập liệu cũng thay đổi tương ứng theo thì phải chỉnh lại như thế nào để check tự động được ah. Nhờ anh chỉnh lại giúp em với ah.
 
Upvote 0
Anh ơi cho em hỏi thêm chút là nếu loại sản phẩm "loại 1", "loại 2" em muốn đổi thành "thông dụng" và "cao cấp" đồng thời tên các sheet chứa dữ liệu dùng để check khi nhập liệu cũng thay đổi tương ứng
Gởi file với sheet mới, lưu ý tên sheet nên không có dấu tiếng Việt
 
Upvote 0
Nếu vài ô chưa nhập có cho phép thêm mới không?
Code trong sheet Data kiểm tra dữ liệu nhập có dùng không?
Nếu thêm mới nhưng chưa nhập gì hoặc một vài ô chưa nhập vẫn cho phép thêm mới ah.
Code trong sheet data là code cũ dùng check dữ liệu nhập vào nhưng do em đổi tên loại sản phẩm từ "loại 1" thành "thông dụng" và "loại 2" thành "cao cấp" và tên 2 sheet tương ứng chứa dữ liệu dùng để check khi nhập liệu nên code không check được nữa ah, anh sửa giúp e với ah.
 
Upvote 0
Nếu thêm mới nhưng chưa nhập gì hoặc một vài ô chưa nhập vẫn cho phép thêm mới ah.
Code trong sheet data là code cũ dùng check dữ liệu nhập vào nhưng do em đổi tên loại sản phẩm từ "loại 1" thành "thông dụng" và "loại 2" thành "cao cấp" và tên 2 sheet tương ứng chứa dữ liệu dùng để check khi nhập liệu nên code không check được nữa ah, anh sửa giúp e với ah.
Bạn tự viết thêm lệnh đổi từ "loại 1" thành "thông dụng" "loại 2" thành "cao cấp"
 
Upvote 0
Bạn tự viết thêm lệnh đổi từ "loại 1" thành "thông dụng" "loại 2" thành "cao cấp"
Bạn tự viết thêm lệnh đổi từ "loại 1" thành "thông dụng" "loại 2" thành "cao cấp"
Em mới tìm hiểu về vba. Vậy để em tìm hiểu thêm về vba rồi thử làm xem có được không, dù sao cũng cảm ơn anh đã nhiệt tình hỗ trợ ah.
 
Upvote 0

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

Back
Top Bottom