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:
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
    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

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

  • BQL-1 (2).xlsb
    430.4 KB · Đọc: 17
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
Web KT

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

Back
Top Bottom