Báo hộp thoại khi nhập sai mã

Liên hệ QC

Congky74

Thành viên mới
Tham gia
25/10/18
Bài viết
43
Được thích
5
Kính chào mọi người.

em đang gặp vấn đề là khi quét mã barcode sản phẩm. nếu khác mã hàng thì thông báo hộp thoại cảnh báo. điều kiện là 12 ký tự đầu của mã khác nhau
vd: có 2 mã có 12 ký tự đầu khác nhau là báo hộp thoại (file đính kèm)
mong mọi người giúp đỡ
18DK9700306B0007J7G9991
18DK9700312A0007J7G990
 

File đính kèm

  • baosaima.xlsx
    9.4 KB · Đọc: 15
Kính chào mọi người.

em đang gặp vấn đề là khi quét mã barcode sản phẩm. nếu khác mã hàng thì thông báo hộp thoại cảnh báo. điều kiện là 12 ký tự đầu của mã khác nhau
vd: có 2 mã có 12 ký tự đầu khác nhau là báo hộp thoại (file đính kèm)
mong mọi người giúp đỡ
18DK9700306B0007J7G9991
18DK9700312A0007J7G990
Chỉ một mã hay nhiều mã, nếu chỉ 1 mã "18DK9700305B" thì bạn làm như file xem đúng ý không nhe
 

File đính kèm

  • baosaima.xlsx
    10.2 KB · Đọc: 10
Chỉ một mã hay nhiều mã, nếu chỉ 1 mã "18DK9700305B" thì bạn làm như file xem đúng ý không nhe
Mình quét bằng máy quét mã vạch chứ không nhập bằng tay bạn ơi! nếu nhập bằng tay thì sử dụng Data Validation là hợp lý.
Cơ quan mình hiện tại có 5 mã sản phẩm khác nhau thôi. để dùng chung cho một file nên ý tưởng của mình là lấy mã quét đầu tiên làm chuẩn, nếu các mã quét sau khác mã đầu tiên là báo hộp thoại.
Hiện tại file của mình đang dùng Conditional Formatting để báo màu trùng mã và sai mã (12 ký tự đầu tiên khác mã cho lần quẹt đầu tiên). nhưng do trùng mã thì có thể chấp nhận vì lỗi do người công nhân quét 2 lần. còn việc sai mã là không cho phép. bắt buộc phải có hộp thoại cảnh báo để không cho nhập .
Mình có sử dụng file của bạn OT trên diễn đàn để làm file thực tế. file này do bác @Nguyễn Duy Tuân , bác @batman1 ... và các anh chị khác trên diễn đàn viết cho bạn OT.
Rất mong bạn có thể viết code hoàn thiện giúp mình. cảm ơn bạn nhiều!
 

File đính kèm

  • mavach.xlsm
    32.6 KB · Đọc: 8
Với tôi bạn giải thích lằng nhằng, không rõ ràng.

Ở trên
Mình quét bằng máy quét mã vạch chứ không nhập bằng tay bạn ơi
Ở dưới
bắt buộc phải có hộp thoại cảnh báo để không cho nhập

Vậy thì "quét" hay "nhập"? Nếu ở trên dùng 2 khái niệm khác nhau là "quét" và "nhập" để phân biệt thao tác thì ở dưới khi diễn tả phải dùng đúng khái niệm thì người khác mới hiểu.

ý tưởng của mình là lấy mã quét đầu tiên làm chuẩn, nếu các mã quét sau khác mã đầu tiên là báo hộp thoại.

Tôi hiểu là có 1 mã, tạm gọi là ABC (1 trong số 5 mã khác nhau) được quét và nó đeo huy hiệu "quẹt đầu tiên". Tiếp theo nếu những mã được quét khác với mã "quẹt đầu tiên" thì báo lỗi. Nhưng có 5 mã khác nhau vậy sẽ phải có chỗ mã XYZ (1 trong số 5 mã khác nhau) được "quẹt" và tuy nó khác ABC nhưng không được phép báo lỗi mà bắt buộc phải cài cho nó huy hiệu "quẹt đầu tiên". Các mã tiếp theo XYZ sẽ được kiểm tra và báo lỗi. Vậy có câu hỏi: Làm sao biết mã là mã "quẹt đầu tiên"? Có dấu hiệu nào để biết mã "quẹt đầu tiên"? Do tôi và có thể nhiều người không hiểu về mặt kỹ thuật nên phải giải thích rõ ràng.

Tôi cho vd. Nhập ABC vào A1. Nó đeo huy hiệu "quẹt đầu tiên". Quét tiếp 2 mã vào A2 và A3. Bây giờ quét vào A4 mã XYZ. Tuy nó <> ABC nhưng theo tôi hiểu thì phải không có thông báo lỗi. Vậy căn cứ vào đâu để biết mã XYZ là mã "quẹt đầu tiên"?

nhưng do trùng mã thì có thể chấp nhận vì lỗi do người công nhân quét 2 lần. còn việc sai mã là không cho phép. bắt buộc phải có hộp thoại cảnh báo để không cho nhập .

"Nhập" tay thì có thể sai chứ máy đã "quét" thì sao sai được? Trùng do người công nhân "quét" 2 lần nhưng thế nào là "máy quét sai"?

nếu các mã quét sau khác mã đầu tiên là báo hộp thoại.

Dùng mầu để "báo" không được sao mà phải dùng "hộp thoại"?

Kinh nghiệm đính kèm tập tin: hãy mô tả trong tập tin cho rõ. Vd. cho vài mã được quét làm ví dụ rồi chỉ ra những mã nào được coi là sai, và tại sao lại sai, so sánh nó với mã "quẹt đầu tiên" nào. Bởi vì theo tôi hiểu sẽ có 5 mã khác nhau đều đeo huy hiệu "quẹt đầu tiên".
 
Mình quét bằng máy quét mã vạch chứ không nhập bằng tay bạn ơi! nếu nhập bằng tay thì sử dụng Data Validation là hợp lý.
Cơ quan mình hiện tại có 5 mã sản phẩm khác nhau thôi. để dùng chung cho một file nên ý tưởng của mình là lấy mã quét đầu tiên làm chuẩn, nếu các mã quét sau khác mã đầu tiên là báo hộp thoại.
Hiện tại file của mình đang dùng Conditional Formatting để báo màu trùng mã và sai mã (12 ký tự đầu tiên khác mã cho lần quẹt đầu tiên). nhưng do trùng mã thì có thể chấp nhận vì lỗi do người công nhân quét 2 lần. còn việc sai mã là không cho phép. bắt buộc phải có hộp thoại cảnh báo để không cho nhập .
Mình có sử dụng file của bạn OT trên diễn đàn để làm file thực tế. file này do bác @Nguyễn Duy Tuân , bác @batman1 ... và các anh chị khác trên diễn đàn viết cho bạn OT.
Rất mong bạn có thể viết code hoàn thiện giúp mình. cảm ơn bạn nhiều!
Cho cái dữ liệu cụ thể lên.5 thằng nào để kiểm tra.Mà dùng vba dùng ko.
 
Với tôi bạn giải thích lằng nhằng, không rõ ràng.

Ở trên

Ở dưới


Vậy thì "quét" hay "nhập"? Nếu ở trên dùng 2 khái niệm khác nhau là "quét" và "nhập" để phân biệt thao tác thì ở dưới khi diễn tả phải dùng đúng khái niệm thì người khác mới hiểu.



Tôi hiểu là có 1 mã, tạm gọi là ABC (1 trong số 5 mã khác nhau) được quét và nó đeo huy hiệu "quẹt đầu tiên". Tiếp theo nếu những mã được quét khác với mã "quẹt đầu tiên" thì báo lỗi. Nhưng có 5 mã khác nhau vậy sẽ phải có chỗ mã XYZ (1 trong số 5 mã khác nhau) được "quẹt" và tuy nó khác ABC nhưng không được phép báo lỗi mà bắt buộc phải cài cho nó huy hiệu "quẹt đầu tiên". Các mã tiếp theo XYZ sẽ được kiểm tra và báo lỗi. Vậy có câu hỏi: Làm sao biết mã là mã "quẹt đầu tiên"? Có dấu hiệu nào để biết mã "quẹt đầu tiên"? Do tôi và có thể nhiều người không hiểu về mặt kỹ thuật nên phải giải thích rõ ràng.

Tôi cho vd. Nhập ABC vào A1. Nó đeo huy hiệu "quẹt đầu tiên". Quét tiếp 2 mã vào A2 và A3. Bây giờ quét vào A4 mã XYZ. Tuy nó <> ABC nhưng theo tôi hiểu thì phải không có thông báo lỗi. Vậy căn cứ vào đâu để biết mã XYZ là mã "quẹt đầu tiên"?



"Nhập" tay thì có thể sai chứ máy đã "quét" thì sao sai được? Trùng do người công nhân "quét" 2 lần nhưng thế nào là "máy quét sai"?



Dùng mầu để "báo" không được sao mà phải dùng "hộp thoại"?

Kinh nghiệm đính kèm tập tin: hãy mô tả trong tập tin cho rõ. Vd. cho vài mã được quét làm ví dụ rồi chỉ ra những mã nào được coi là sai, và tại sao lại sai, so sánh nó với mã "quẹt đầu tiên" nào. Bởi vì theo tôi hiểu sẽ có 5 mã khác nhau đều đeo huy hiệu "quẹt đầu tiên".
Lần đầu tiên cho con xin cám ơn sự quan tâm của bác @batman1 và anh @snow25 !
Con xin giải thích lại vấn đề khó khăn của con như sau!
Ở cơ quan con đang sản xuất 5 loại sản phẩm, mỗi sản phẩm khi sản xuất xong thì phải dán barcode cho nó. do thời gian gần đây đang xẩy ra tình trạng lỗi dán sai barcode (có nghĩa là sản phẩm A thì dán barcode B, ......) nên ảnh hưởng đến chất lượng sản phẩm.
Để khắc phục tình trạng trên ngoài việc quản lý sản xuất chặt chẽ, thì còn dùng máy quét mã vạch để kiểm tra lần cuối cùng.
- file quét mã con đang vận dụng file của bạn OT trên diễn đàn.
- Hình thức quét: là bằng máy quét barcode (không nhập bằng tay)
- Mã barcode quét ra là 23 ký tự. trong đó 2 ký tự đầu tiên là mã công ty, 10 ký tự tiếp theo được hiểu là tên sản phẩm, còn các ký tự sau là các ký hiệu khác. (con đang lấy 10 ký tự của tên sản phẩm để so sánh )
- File này dùng chung cho cả 5 sản phẩm: để làm được điều này thì ô quét đầu tiên (A1) con lấy làm chuẩn, do đó tại ô E1 con dùng công thức lấy ra 10 ký tự của tên sản phẩm để so sánh với ô A2 trở đi.
Yêu cầu khi mỗi lần quét ra mã barcode mà trong mã đó có (10 ký tự tên sản phẩm) sai với ô E1 thì báo hộp thoại để không cho máy quét thực hiện quét. (mục đích là khắc phục tình trạng dán sai barcode). vd: báo lỗi khi quét mã khác ở ô A7 là báo hộp thoại. (file đính kèm)
Con giải thích vậy nếu có chỗ chưa rõ thì nhờ bác ý kiến để con hoàn thiện hơn!
Con cám ơn bác và anh nhiều!
 

File đính kèm

  • mavach.xlsm
    34.8 KB · Đọc: 5
Lần đầu tiên cho con xin cám ơn sự quan tâm của bác @batman1 và anh @snow25 !
Con xin giải thích lại vấn đề khó khăn của con như sau!
Ở cơ quan con đang sản xuất 5 loại sản phẩm, mỗi sản phẩm khi sản xuất xong thì phải dán barcode cho nó. do thời gian gần đây đang xẩy ra tình trạng lỗi dán sai barcode (có nghĩa là sản phẩm A thì dán barcode B, ......) nên ảnh hưởng đến chất lượng sản phẩm.
Để khắc phục tình trạng trên ngoài việc quản lý sản xuất chặt chẽ, thì còn dùng máy quét mã vạch để kiểm tra lần cuối cùng.
- file quét mã con đang vận dụng file của bạn OT trên diễn đàn.
- Hình thức quét: là bằng máy quét barcode (không nhập bằng tay)
- Mã barcode quét ra là 23 ký tự. trong đó 2 ký tự đầu tiên là mã công ty, 10 ký tự tiếp theo được hiểu là tên sản phẩm, còn các ký tự sau là các ký hiệu khác. (con đang lấy 10 ký tự của tên sản phẩm để so sánh )
- File này dùng chung cho cả 5 sản phẩm: để làm được điều này thì ô quét đầu tiên (A1) con lấy làm chuẩn, do đó tại ô E1 con dùng công thức lấy ra 10 ký tự của tên sản phẩm để so sánh với ô A2 trở đi.
Yêu cầu khi mỗi lần quét ra mã barcode mà trong mã đó có (10 ký tự tên sản phẩm) sai với ô E1 thì báo hộp thoại để không cho máy quét thực hiện quét. (mục đích là khắc phục tình trạng dán sai barcode). vd: báo lỗi khi quét mã khác ở ô A7 là báo hộp thoại. (file đính kèm)
Con giải thích vậy nếu có chỗ chưa rõ thì nhờ bác ý kiến để con hoàn thiện hơn!
Con cám ơn bác và anh nhiều!
Bạn thử cái này.
 

File đính kèm

  • mavach.xlsm
    33.5 KB · Đọc: 12
Cảm ơn anh @snow25 đã giúp em!
em sửa cái này
Mã:
arr = Range("G4:G8").Value
thành
Mã:
arr = Range("E1:E1").Value
thì mới đúng ý em
Cảm ơn anh nhiều!
À anh ơi anh có thể làm giúp em thêm một việc nữa được không? là làm cho cái UserForm1 hiển thị song song với bảng tính giúp em. vì mỗi lần mở file là phải vào chạy code đã mới hiển thị UserForm1. (ý em là mở file lên là cái UserForm1 hiển thị lên để quét luôn đó)
Bài đã được tự động gộp:

Mỗi lần dữ liệu nhập thử rồi dùng bàn phím xóa dữ liệu thì nó báo lỗi thế này. Nhờ anh khắc phục giúp em với!
222948
 
Lần chỉnh sửa cuối:
Cảm ơn anh @snow25 đã giúp em!
em sửa cái này
Mã:
arr = Range("G4:G8").Value
thành
Mã:
arr = Range("E1:E1").Value
thì mới đúng ý em
Cảm ơn anh nhiều!
À anh ơi anh có thể làm giúp em thêm một việc nữa được không? là làm cho cái UserForm1 hiển thị song song với bảng tính giúp em. vì mỗi lần mở file là phải vào chạy code đã mới hiển thị UserForm1. (ý em là mở file lên là cái UserForm1 hiển thị lên để quét luôn đó)
Bài đã được tự động gộp:

Mỗi lần dữ liệu nhập thử rồi dùng bàn phím xóa dữ liệu thì nó báo lỗi thế này. Nhờ anh khắc phục giúp em với!
View attachment 222948
Bạn thử xem đúng chưa.
 

File đính kèm

  • mavach.xlsm
    34.7 KB · Đọc: 13
Không được anh ơi! code bây giờ cùng mã sản phẩm thì không cho nhập. và chọn nhiều ô để xóa vẫn báo lỗi 13.
anh xem lại giúp em với
Bạn thử code này nhé.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        Dim arr As String, i As Long, dk As Boolean, ma As String
        If Target.Column = 1 And Target.Value <> Empty And Target.Count = 1 Then
            arr = Range("E1").Value
            ma = Mid(Target.Value, 3, 10)
                If UCase(ma) <> arr Then
                   MsgBox "ban nhap khong dung voi ma"
                   Target.Value = Empty
                End If
      End If
      Application.EnableEvents = True
End Sub
 
Bạn thử code này nhé.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        Dim arr As String, i As Long, dk As Boolean, ma As String
        If Target.Column = 1 And Target.Value <> Empty And Target.Count = 1 Then
            arr = Range("E1").Value
            ma = Mid(Target.Value, 3, 10)
                If UCase(ma) <> arr Then
                   MsgBox "ban nhap khong dung voi ma"
                   Target.Value = Empty
                End If
      End If
      Application.EnableEvents = True
End Sub
code chạy đúng rồi anh à! còn vấn đề em xóa dữ liệu trên dòng A thì báo lỗi. vd bôi chọn từ A2: A7 và xóa dữ liệu bằng phím delete thì báo lỗi như hình ảnh em chụp lại.
222959

có cách nào khắc phục được không anh !
em xin chân thành cảm ơn anh rất nhiều!
 
code chạy đúng rồi anh à! còn vấn đề em xóa dữ liệu trên dòng A thì báo lỗi. vd bôi chọn từ A2: A7 và xóa dữ liệu bằng phím delete thì báo lỗi như hình ảnh em chụp lại.
Khi bạn thay đổi nhiều cell thì đk Target.Value <> Empty sẽ gây lỗi vì Target không là 1 cell.

Bạn thử code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, cell_ As Range
Dim cellE1 As String
    Set rng = Intersect(Target, Me.Range("A2:A100000"))
    If rng Is Nothing Then Exit Sub
    Application.EnableEvents = False
    cellE1 = LCase(Me.Range("E1").Value)
    For Each cell_ In rng
        If Not IsEmpty(cell_.Value) Then
            If LCase(Mid(cell_.Value, 3, 10)) <> cellE1 Then
                MsgBox "ban nhap khong dung voi ma"
                cell_.Value = Empty
            End If
        End If
    Next cell_
    Application.EnableEvents = True
End Sub
Nếu 100 000 là ít quá thì đổi thành số lớn hơn.
 
Chờ mãi không thấy chủ thớt ý kiến gì, vậy tôi tự bàn.
Chủ thớt không nói rõ quá trình thao tác nên tôi tự bàn thế này. Có 5 mã khác nhau. Người ta nhập vào A1 mã nào đó. Sau đó từ A2 quét mã hàng. Sau khi quét hàng nghìn, hàng trăm nghìn mã hàng thì người ta có thể muốn kiểm tra mã khác. Nếu bây giờ người ta chọn cả cột A và nhấn Delete thì sao? Tất nhiên mục đích để xóa dữ liệu cũ và nhập vào A1 mã mới, rồi sau đó từ A2 quét các mã hàng. Khi chọn cả cột A và nhấn Delete thì code được thực hiện. Code đọc liên tục từ sheet: If LCase(Mid(cell_.Value, 3, 10)) <> cellE1 Then, mà số cell là > 1 triệu nên code có thể sẽ thực hiện lâu. Có lẽ nên cho dữ liệu vào mảng rồi duyệt mảng chăng?
 
code chạy đúng rồi anh à! còn vấn đề em xóa dữ liệu trên dòng A thì báo lỗi. vd bôi chọn từ A2: A7 và xóa dữ liệu bằng phím delete thì báo lỗi như hình ảnh em chụp lại.
View attachment 222959

có cách nào khắc phục được không anh !
em xin chân thành cảm ơn anh rất nhiều!
Thử Code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Dim Rng As Range, Ma As String, tmp As String
    Dim eR As Long, i As Long, sRow As Long, dk As Boolean
    
    eR = Range("A" & Rows.Count).End(xlUp).Row
    sRow = Target.Rows.Count
    i = Target.Row + sRow - 1
    If eR < i Then eR = i
    Set Rng = Intersect(Target, Range("A1:A" & eR))
    If Not Rng Is Nothing Then
        Ma = UCase(Range("E1").Value)
        For i = 1 To sRow
            tmp = UCase(Rng(i, 1))
            If Len(tmp) > 0 Then
                If Mid(tmp, 3, 10) <> Ma Then
                    MsgBox "ban nhap khong dung voi ma"
                    Rng(i, 1) = Empty
                End If
            End If
        Next i
    End If
    Set Rng = Nothing
    Application.EnableEvents = True
End Sub
 
Khi bạn thay đổi nhiều cell thì đk Target.Value <> Empty sẽ gây lỗi vì Target không là 1 cell.

Bạn thử code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, cell_ As Range
Dim cellE1 As String
    Set rng = Intersect(Target, Me.Range("A2:A100000"))
    If rng Is Nothing Then Exit Sub
    Application.EnableEvents = False
    cellE1 = LCase(Me.Range("E1").Value)
    For Each cell_ In rng
        If Not IsEmpty(cell_.Value) Then
            If LCase(Mid(cell_.Value, 3, 10)) <> cellE1 Then
                MsgBox "ban nhap khong dung voi ma"
                cell_.Value = Empty
            End If
        End If
    Next cell_
    Application.EnableEvents = True
End Sub
Nếu 100 000 là ít quá thì đổi thành số lớn hơn.
Cảm ơn bác đã quan tâm và viết code giúp con! code chạy rất đúng và khi xóa dữ liệu thì hết lỗi rồi ạ!
Bài đã được tự động gộp:

Chờ mãi không thấy chủ thớt ý kiến gì, vậy tôi tự bàn.
Chủ thớt không nói rõ quá trình thao tác nên tôi tự bàn thế này. Có 5 mã khác nhau. Người ta nhập vào A1 mã nào đó. Sau đó từ A2 quét mã hàng. Sau khi quét hàng nghìn, hàng trăm nghìn mã hàng thì người ta có thể muốn kiểm tra mã khác. Nếu bây giờ người ta chọn cả cột A và nhấn Delete thì sao? Tất nhiên mục đích để xóa dữ liệu cũ và nhập vào A1 mã mới, rồi sau đó từ A2 quét các mã hàng. Khi chọn cả cột A và nhấn Delete thì code được thực hiện. Code đọc liên tục từ sheet: If LCase(Mid(cell_.Value, 3, 10)) <> cellE1 Then, mà số cell là > 1 triệu nên code có thể sẽ thực hiện lâu. Có lẽ nên cho dữ liệu vào mảng rồi duyệt mảng chăng?
Do ngày thứ 7 và chủ nhật cơ quan con nghỉ nên khi về nhà con không có máy tính và mạng để vào diễn đàn được ạ. con cảm ơn bác rất nhiều!
Bài đã được tự động gộp:

Thử Code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Dim Rng As Range, Ma As String, tmp As String
    Dim eR As Long, i As Long, sRow As Long, dk As Boolean
   
    eR = Range("A" & Rows.Count).End(xlUp).Row
    sRow = Target.Rows.Count
    i = Target.Row + sRow - 1
    If eR < i Then eR = i
    Set Rng = Intersect(Target, Range("A1:A" & eR))
    If Not Rng Is Nothing Then
        Ma = UCase(Range("E1").Value)
        For i = 1 To sRow
            tmp = UCase(Rng(i, 1))
            If Len(tmp) > 0 Then
                If Mid(tmp, 3, 10) <> Ma Then
                    MsgBox "ban nhap khong dung voi ma"
                    Rng(i, 1) = Empty
                End If
            End If
        Next i
    End If
    Set Rng = Nothing
    Application.EnableEvents = True
End Sub
Xin cảm ơn anh @HieuCD đã viết code cho giúp em! code chạy rất đúng anh ạ! chúc anh buổi sáng đầu tuần vui vẽ ạ! do ngày chủ nhật em nghỉ ở cơ quan, ở nhà không có máy cũng không có mạng nên bây giờ mới vào xem được. cảm ơn anh rất nhiều ạ !
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom