Youtube da izleyebilirsin..
Örnek projemizde, seri port ile haberleşen bir cihazdan (barkod okuyucu, terazi, PLC, Arduino..) Excel sayfasına bilgi alacağız. Yazılımı geliştirmek için tek ihtiyacımız Excel oluyor.. Seri haberleşme için eskiden beri (yaklaşık 30 yıldır) VB6 ile kullanılan MSCOMM32.OCX isimli ActiveX bileşeni kullanıyoruz. Önceki yazıda bahsetmiştim, yine hatırlatayım, bu tip bileşenleri kullanabilmemiz için Excel versiyonumuz 32-bit olmalıdır. Hesap > Excel Hakkında penceresinde en üstte yazıyor.. Office versiyonu önemli değil 2007-2021 arası hatta 365 olabilir, hepsinde çalışır.. (365 bulut sürümü hariç, orada VBA değil kodlaması Basic e göre çok daha zor olan TypeScript veya JavaScript kullanılıyor..)
Neyse ki Microsoft, eski VBA müşterilerini kızdırmamak için VBA desteğini yeni Office uygulamalarında da devam ettiriyor.
Senaryo şu şekilde; seri porttan gelen virgül ile ayrılmış bilgiler 6. satıra gelecektir.. Her bilgi geldiğinde 10. satır bir alt satıra kayacak ve 10. satıra yeni bilgiler yazılacaktır. Böylece cihazdan gelen bilgiler için log kaydı yapılmış olacaktır. Cihaz simülasyonu için sanal port ve Hercules programını kullandım.
Bileşenin çalışabilmesi için Güvenlik Merkezi (Trust Center) 'ne tıklayarak, ulaşacağınız ActiveX Ayarları aşağıdaki gibi olmalıdır.
MSCOMM32.OCX bileşeninin Windows 10 a tanıtılması
ocxme.com sitesinden bileşenin son versiyonunu indirin.
Bilgisayarınızdaki işletim sistemi Windows 10 64-bit ise ki genelde öyle oluyor, bu dosyayı C:\Windows\SysWOW64 dizini altına, 32-bit ise C:\Windows\System32 dizinine kopyalayın..
Ardından resimdeki komutları komut isteminde çalıştırın..
Boş bir .xlsx dosyası açın ve farklı kaydet i seçerek farklı kaydet tipini .xlsm olarak seçin. Geliştirici sekmesinden Ekle (insert) > ActiveX controls > More controls menüsünü takip edin. Açılan pencerede Microsoft Communications Control, version 6.0 (SP6) seçin. Ardından sayfada bir yere tıklayın, telefon simgesi gelecektir.
Sizde Geliştirici sekmesi gözükmüyorsa önceki yazıya bakınız..
Not: Resimde Insert butonunun yanında Design Mode butonu basılmış görülüyor, programı çalıştırırken bu butona basarak dizayn modundan çıkmamız gerekiyor.
Telefon simgesine sağ tık yaparak özelliklerine girin. burada RThreshold ve SThreshold değerlerine 1 yazın..
Bu işlemleri yaparken resimdeki gibi bir hata ile karşılaşabilirsiniz..
Bu sorunun çözümü olarak, kayıt defterine bir değer eklemek gerekiyor..
Bunun için Notepad ile bir .txt dosyasına aşağıdaki satırları yazın :
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]
@ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"
ve dosyayı .reg uzantılı olarak kaydedin. Çift tık ile çalıştırın..
Excel Sheet1 in düzenlenmesi
En üstteki resimde görüldüğü gibi sayfayı düzenleyin.. E6 hücresine =NOW() yazın, şimdiki zamanı gösterecektir.. E sütununu seçin, seçime sağ tık yapın ve Format Cells... e tıklayın ve resimdeki gibi düzenleyin..
Not: Resimdeki format Türkçe içindir, siz kendi dilinize göre gün, ay, yıl, saat, dakika ve saniye ayarını yapınız..
Geliştirici sekmesinden Ekle (insert) > ActiveX controls > Command Button ile üç adet butonu sayfaya ekleyin ve düzenleyin.. Dizayn modu düğmesi basılı durumdayken bir butona çift tıklarsak kodlama penceresi açılacaktır..
Seri porttan Excel'e her bilgi geldiğinde MSComm1_OnComm olayı oluşur, bu olaya yazılan kodlar sayesinde program çalışıyor..
İlk satırdaki kodu yazarken veya kopyala yapıştır yaparken dikkat edin, kodlama penceresinde Sheet1 e tıklandığında üstteki kutularda (General) ve (Declarations) yazmalıdır..
Public EnableLog As Boolean 'should be in General Declarations in Sheet1
Private Sub CommandButton1_Click() 'Save As button
Dim FileName As String
FileName = ThisWorkbook.Path
FileName = FileName & "\" & Format(CStr(Now), "yyyy_mm_dd_hh_mm")
FileName = FileName & ".xlsm"
ActiveWorkbook.SaveAs FileName
End Sub
Private Sub CommandButton2_Click() 'Enable Logging button
EnableLog = True
'http://www.endprod.com/colors/colors.htm
CommandButton2.BackColor = 52582 'green
On Error Resume Next
If MSComm1.PortOpen = False Then 'check if the serial port is open
MSComm1.PortOpen = True 'open the serial port
End If
If Err Then MsgBox Error$, 48 'Display error in message box
'MSComm1.Output = "ABC" + Chr$(10)'to send something
End Sub
Private Sub CommandButton3_Click() 'Disable Logging button
EnableLog = False
CommandButton2.BackColor = 15790320 'grey
On Error Resume Next
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False 'close the serial port
End If
If Err Then MsgBox Error$, 48
End Sub
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then 'when send, comEvSend occurs
Dim arr() As String
arr = Split(MSComm1.Input, ",")
Cells(6, 2) = arr(0)
Cells(6, 3) = arr(1)
Cells(6, 4) = arr(2)
'shift cells down at row 10
Range("B10:E10").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'update row 10
Cells(10, 2) = Cells(6, 2)
Cells(10, 3) = Cells(6, 3)
Cells(10, 4) = Cells(6, 4)
Cells(10, 5) = Cells(6, 5)
End If
End Sub
Turuncu satırlarda yazan kodları, Geliştirici sekmesindeki Makro Kaydet butonunu kullanarak elde ettim.. Makro kaydı çok kolay.. Butona bastıktan sonra mouse ile B10:E10 seçin, seçime sağ tık yapın ve insert seçin, ardından shift cells down seçin. Kaydı durdura tıklayın. Alt+F11 kodlama penceresinde oluşan Module e bakın.. Excel, kodları bizim için üretebiliyor ve bunu yıllardır yapıyor.. ChatGPT yeni çıktı ve yanlış kodlar üretebiliyor.
Yorumlar
Yorum Gönder