2014年11月3日 星期一

VBA 疑難經驗 - 印表機 port 問題

        今天早上接到電話,對方表示其excel檔某個button按下去無法列印,我印象中這個button是有VB程式碼在背景執行,因為有過上次的經驗是印表機的名稱跑掉,所以其程式碼找不到印表機,自然就沒辦法列印了。

Printer Port VB

        不過這次我遠端登入其電腦時發現,印表機的名稱是對的,所以我研究了一下子,發現可能是連接埠(port)不對造成,可是找了一下印表機的port,只有顯示這樣(攤手)

Printer Port VB2

        不死心的我只好求救google大神了,找了幾分鐘後,在歪國人的論壇上,發現可以從登錄檔中去看到這台電腦所有印表機的連接埠(port),登錄檔的位址如下:

HKEY_CURRENT_USER/Software/Microsoft/WindowsNT/CurrentVersion/Devices

       看到的畫面就如下圖:

Printer Port VB3

        由上圖可以發現,出問題的印表機,其port已經變成Ne06,與第一張圖的Ne05不同,也難怪程式碼無法觸發列印的動作了,所以只要把它再改回Ne05就沒問題了。此外,我再keep digging的結果,這個port是有機會自動變化的,因為它是網路的印表機的關係。

        同時我也找到了程式碼可以直接秀出電腦所有印表機port。內容如下,僅供參考:
=======================================================
Dim reg As Variant, oreg As Object, mystr As Variant 
Const HKEY_CURRENT_USER = &H80000001
Set oreg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") oreg.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", mystr, Arr
For Each reg In mystr 
oreg.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\WindowsNT\CurrentVersion\Devices", reg, regvalue list1.additem reg & " on " & Mid(regvalue, InStr(regvalue, ",") + 1) 
Next
=======================================================

        再來就是要研究怎麼寫讓它隨著port而改變的語法了。


沒有留言:

張貼留言