VBA - Barkod okuyucu ile ürün etiketi basma

 


Youtube da izleyebilirsin..


Bir konveyörden farklı ürünlere ait koliler geldiğini hayal edin.. Her koli üzerinde farklı barkod numaraları olabilir.. Amaç bu barkodu barkod okuyucu ile okuyup o koliye uygun ürün etiketinin basılması ve koliye otomatik olarak yapıştırılmasıdır. Novexx Print and Apply cihazları etiketi basıp yapıştırabilir ama birinin ona ne basacağını iletmesi gerekir. Bu aşamada yine Excel VBA da geliştirdiğim yazılım devreye giriyor.. 

Yazılım ihtiyaca göre yeniden düzenlenebilir. Ben barkod dışında sadece fiyat bilgisini yazdırdım örnek olarak. Barkod okuyucu seri port ile Excel’e bağlı, okuyucu simülasyonu için Hercules programında Serial sekmesini kullandım. Excel’e seri porttan bilgi almak için Mscomm ActiveX bileşenini kullandım.. Yazıcı, ağ kablosu ile Excel’e bağlı, bunun için Generic / Text Only windows sürücü ve yine Hercules de TCP Server sekmesini kullandım. Hercules de boş kutucuğa 9100 numaralı portu yazıp, Listen butonuna tıklamak yeterli oluyor. Simülasyon için Generic sürücü kurulumu yaparken IP adresi olarak 127.0.0.1 kullanabilirsiniz. Gerçek yazıcı kullanacaksanız, sürücü kurulumunda yazıcının IP adresini kullanmalısınız.

Generic sürücü yerine Ostrosoft Winsock bileşeni de kullanılabilirdi ama Mscomm gibi sadece 32-bit Excel de çalışıyor.. Generic sürücü tek yönlü çalışır yani Excel den yazıcıya bilgi gider, oysa Ostrosoft ile çift yönlü iletişim yapılabilir.. Örneğin yazıcıya sorgu yollayabilir ve yazıcıdan cevap alabiliriz. Sorgular, yazıcı içinde kaç iş var, yazıcıda bir hata durumu oluştu mu gibi şeyler olabilir.

Senaryonun simülasyonu için içinde yaklaşık 18.000 kalem malzeme olan bir excel dosyasını internetten indirdim. 

Okuyucudan gelen bilgiye göre etikete basılacak bilgileri seçmek için Excel de gelişmiş filtre olarak bilinen yöntemi kullandım. Bu yöntem, sayfadaki veri sayısı artınca, Range.Find veya Worksheetfuncion.Search e göre çok çok daha hızlı çalışıyor.. Bu arada bu tip bir iş için bilgileri Excel de tutmak yerine MSSQL sunucu da kullanılabilir, Excel VBA ile SQL sunucuya bağlantı kurulabiliyor. SQL, başka bir yazının konusu olsun..

Youtube video da mor başlıklı bölümde veriler var, mavi başlıklı alana okuyucudan gelen barkod bilgisi yani arama kriteri yazılıyor. Turuncu başlıklı bölümde de kritere göre bulunan sonuçlar gösteriliyor. Youtube da “excel gelişmiş filtre” diye aratırsanız, manuel olarak nasıl uygulandığını görebilirsiniz.. Bu işi burada yazılımla yapıyoruz yani VBA programlama ile.. Gelişmiş filtre kodunu, makro kaydederek elde edebilirsiniz ama ben tüm kodu aşağıda paylaşıyor olacağım.

Okuyucudan Excel’e bilgi geldiğinde OnComm() olayı tetikleniyor. Bütün operasyon bu olayın içinde bitiyor.. Öncesinde Excel ilk açıldığında sayfada gözüken butona tıklayarak seri portun açılması sağlanıyor. Bu arada seri port için de sanal seri port kullandım, bu nedenle video da COM2 ye bilgi yolluyorum, bu bilgi aslında Mscomm bileşeninde COM1 e gidiyor. Yani paylaşacağım kodları denemek için sadece Excel gerekiyor.. Bir barkod okuyucu veya yazıcı almanız gerekmiyor :) Yani olurda bu projeyi gerçekleştirirseniz Hercules ler yerine bir okuyucu ve bir yazıcı almanız gerekiyor.. 

LBL TEMP sayfasında A1 hücresine aşağıdaki etiket şablon dosyasını koydum..

#!A1#DC

#IMSR50.00/50.00

#RX0

#ERN/1//0

#R0/0

#T5 #J5 #YB13/0P2.0M/14/3///@barcode#G

#T5 #J23 #YN101/0B/85///@price#G

#Q1#G

#!P1

Bu EasyPlug dosyasını nasıl kolayca elde edeceğinizi daha önce anlatmıştım.. @barcode ve @price yerine bulunan kayıt verileri girilerek LBL DATA sayfası oluşturuluyor. Ardından bu sayfa yazıcıya gönderiliyor. Seri porttan gelen barkod bilgisi DATA sayfasında bulunamamışsa, program mesaj kutusu ile hata mesajı veriyor.

Program, arkada Excel sayfası gözükmeden de userform yapılarak düzenlenebilir. Bu durumda ActiveX bileşenleri, Sheet1 sayfasına değil form üzerine yerleştiriliyor. Böylece .NET te yazılmış bir program gibi gözükmesi sağlanabiliyor..

DATA veya Sheet1 sayfasına bağlı kodlar ise bu şekilde..

Dim barcodeFound As Boolean
Dim dataFromScanner, sendToPrinter, productValue, priceValue As String

Private Sub CommandButton1_Click()
On Error Resume Next
If MSComm1.portOpen = False Then  'check if the serial port is open
    MSComm1.portOpen = True       'open the serial port
    CommandButton1.BackColor = 52582
    Else
    MSComm1.portOpen = False       'close the serial port
    CommandButton1.BackColor = 15790320
End If
If Err Then MsgBox Error$, 48
End Sub

Private Sub MSComm1_OnComm()

If MSComm1.CommEvent = comEvReceive Then
    dataFromScanner = MSComm1.Input
    dataFromScanner = Replace(dataFromScanner, vbLf, "") 'Removes LineFeed
    Sheets("DATA").Range("K2") = "*" & dataFromScanner & "*"
    
    'Advanced Filter codes
    Sheets("DATA").Columns("A:B").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Sheets("DATA").Range("K1:K2"), _
    CopyToRange:=Sheets("DATA").Range("E1:F1"), Unique:=True
    
    If WorksheetFunction.CountA(Sheets("DATA").Range("E:E")) = 1 Then
        MsgBox "Barcode is not found!", 48
        Exit Sub
    End If
    
    productValue = ""
    priceValue = ""
    barcodeFound = False
    For i = 2 To WorksheetFunction.CountA(Sheets("DATA").Range("E:E"))
        If dataFromScanner = Sheets("DATA").Range("E" & i) Then
        productValue = Sheets("DATA").Range("E" & i)
        priceValue = Sheets("DATA").Range("F" & i)
        barcodeFound = True
        Exit For
        End If
    Next i
    
    If barcodeFound = False Then
        MsgBox "Barcode is not found!", 48
        Exit Sub
    End If
    
    sendToPrinter = Sheets("LBL TEMP").Range("A1").Value
    sendToPrinter = Replace(sendToPrinter, "@barcode", productValue)
    sendToPrinter = Replace(sendToPrinter, "@price", Format(priceValue, "€#,###.00"))
    
    Sheets("LBL DATA").Range("A1") = sendToPrinter
    Sheets("LBL DATA").PrintOut
End If
End Sub




Yorumlar

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Uzak I/O modülü olarak PLC kullanmak