2009-02-20 16 views
6

VBA'dan bir seri bağlantı noktasına erişmenin en iyi yolu nedir?VBA'dan bir seri bağlantı noktasına erişmenin en iyi yolu nedir?

Bazı satış temsilcilerinin, PowerPoint'teki bir eylem düğmesinden seri bağlantı noktası üzerinden basit bir dize gönderebilmesi için ihtiyacım var. Özellikle VBA kullanmıyorum, özellikle böyle bir şey için. Normalde onu bir çeşit uygulamaya dönüştürürüm, ama aslında fikrin o kadar kötü olduğunu düşünmüyorum. Bu cihazı bir projektörle çalışırken ve diğer satış elemanlarıyla ve teknik olmayan insanlarla konuşurken demo yapmak için kullanışlı bir araç olacaktır. Ayrıca, bu satış elemanı, VBA veya PowerPoint sunusunda küçük değişiklikler yapmakta hiçbir sorun yaşamayacak, ancak bir .NET uygulamasının yeniden derlenmesiyle pek de iyi bir şey yapmayacaktı.

Eylemdeki sunudan bir toplu iş dosyası üzerinden yapabileceğimizi biliyorum, ancak bu beni çok mutlu etmiyor. Muhtemelen bir COM nesnesine erişebildiğimizi ve oradan kaçabileceğimizi sanıyorum, ama yine VBA'da kullanılacak en yeni ve en büyük kütüphaneler kadar iyi değilim ve aynı zamanda kolayca nasıl açılacağına dair küçük bir primer almak güzel olurdu. bağlantıyı gönder ve kapat.

Bu, birden fazla kişinin bilgisayarında çalıştırılması gerekeceğinden, diğer makinelere kolayca aktarılabiliyorsa iyi olur. Office 2007 ve Windows XP'de çalışması gerektiğini söyleyebilirim. Başka bir şeyle uyumluluk olsa iyi bir bonus olurdu.

Bunu işlemeye nasıl başlamalıyım? İyi ipuçları veya püf noktaları? Kütüphane önerileri?

cevap

11

Win32 API'si seri bağlantı noktasını bir dosya olarak ele alır. Bu API işlevlerini VBA içinden çağırarak doğrudan seri bağlantı noktalarına erişebilirsiniz. Bunu eski bir .NET uygulaması için yapmak zorundaydım, ancak VBA farklı değil.

Bu sitede sizin yerinize bir alıntı yapmaktan ziyade, yıllar içinde üzerine çektiğim bir referans. How to perform serial port communications in VBA

+0

+1 Sitede çalışma örneği var. – Oorang

0
Sub Stinky() 
Dim COM_Byte As Byte 
Dim Received_Lines As Long 
Dim Input_Buffer As String 
Dim Output_Buffer As String 
Dim Chars2Send As Long 
Dim CharsRemaining As Long 
Dim lfsr As Long 
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1 
    Input_Buffer = "" 
    CharsRemaining = 0 
    Do 
    Get #1, , COM_Byte 
    If COM_Byte Then 
     If COM_Byte = 13 Then   ' look for CR line termination 
      Debug.Print Input_Buffer, Now ' print it 
      Input_Buffer = ""    ' and clear input buffer 
     ' generate some output (9 characters) 
      lfsr = &H3FFFFFFF - 2^(Received_Lines And 15) 
      Output_Buffer = "[email protected]@@@@@@@" 
      Chars2Send = 9 
      CharsRemaining = 9 
      For j = 0 To 2 
       Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr/32^(2 - j)))) 
      Next j 
      Debug.Print Output_Buffer 
     ' show what I generated 
      Received_Lines = Received_Lines + 1 ' keep track of received line count 
     Else 
      Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer 
     ' process any characters to send 
      If CharsRemaining Then 
       CharsRemaining = CharsRemaining - 1 
       COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1)) 
       Put #1, , COM_Byte 
      End If 
     End If 
    End If 
    DoEvents 
    Loop 
    Close 
End Sub 

Bu benim için çalışır. İlk olarak TeraTerm'i kullandığım için OPEN'in Baud oranını ayarlayıp ayarlamadığından emin değilim. COM bağlantı noktası, bir BASYS3 prototipleme kitine bir USB bağlantısıdır. Bu karakterler, 9600'de CR ile biten 36 karakterin kayıtları yayılıyor. 9 karakterden oluşan komutları rastgele gönderebilirim. Yukarıdaki kodda, yeni bir satır aldığım her seferde bu komut dizelerini oluşturuyorum. Hangi karakterin gönderileceğini seçme yolu biraz aksaktır: belki de daha iyi bir karakter, bir karakter işaretçisine ve bir sayı karaktere sahip olmaktır ve bunlar da her ikisini de sıfırlamak için eşittir.

+0

COM bağlantı noktası Rastgele olarak açılırsa, EOF'un alacağınız bir karakteriniz olduğunda size söyleyeceği anlaşılıyor. Bu bir boş karakter alabilir anlamına gelir. EOF, bekleyen bir karakter olmadığını söyledi. –

+0

OPEN’deki Baud hızını ayarlamak işe yaramıyor gibi görünüyor. Ama Shell "mode.com com7: 9600, n, 8,1", "COM7" yapmadan önce bir saniye beklerseniz işe yarıyor: Bu, tüm Excel 2010. –

+0

COM bağlantı noktası ile EOF'de Güncelle: Update EOF'nin alınan karakterle değişmemesi gibi, GET'in durumunu da yansıtır. Yani, GET # 1, vByte'den sonra, vByte geçerli olduğunda EOF FALSE olacaktır. –