Kiểm tra dữ liệu nhập vào có đúng không ?

Liên hệ QC

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

  • BQL-1.xlsb
    425.2 KB · Đọc: 17
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

  • BQL-1.xlsb
    425.1 KB · Đọc: 17
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

  • BQL-1.xlsb
    427.2 KB · Đọc: 11
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
Web KT

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

Back
Top Bottom