iT邦幫忙

DAY 23
0

Excel VBA 的眉眉角角系列 第 23

Excel VBA 的眉眉角角Day23:使用AutoHotKey自動跳過開啟巨集警告,以及偵測是否為AutoHotKey開啟Excel檔

很多時候,我們撰寫好程式,需要讓系統自動執行,而非人工點開執行,由於Office 巨集的安全性設定,一般都是設定「中」,以免開啟不明人士編輯的巨集,造成系統或資料的損壞,但是要怎麼繞過那個「安全性警告」視窗呢?以下我們採用AutoHotKey的腳本來解決此問題,AHK提供了控制視窗鍵盤、滑鼠的功能,因此有人拿來設計完遊戲的腳本,讓滑鼠連按、省的按到滑鼠按鈕壞掉。我們這裡則拿來繞過「安全性警告」視窗,以下是我們的程式:

AHK程式碼:

; 關閉所有Excel畫面
Run, taskkill /IM excel.exe,,Hide
Sleep, 2000

;以 程式+資料 的方式開啟Excel檔案
Run, C:\Program Files\Microsoft Office\OFFICE11\Excel.exe "Excel VBA的眉眉角角.xls"

;等待安全性警告出現
WinWait, 安全性警告, 
IfWinNotActive, 安全性警告, , WinActivate, 安全性警告, 
WinWaitActive, 安全性警告, 
Sleep, 1000

;執行巨集
Send, {RIGHT}{ENTER}

將以上程式碼貼到文字檔,並另存為Day23.ahk。以上程式預設開啟 "Excel VBA的眉眉角角.xls" 的Excel檔案,可以依照情況調整。

好了,我們可以自動開啟Excel檔案,然後開啟巨集,但是要怎麼讓巨集自動執行呢?首先開啟Excel檔時,選擇啟用巨集,第一個會自動被執行的,是放在「ThisWorkbook」物件的Workbook_Open程式,但是有個問題,如果我把設計好的程式都放在這裡,開啟Excel檔時,就會自動執行,那我要修改檔案時,不就很麻煩?原本是固定時間執行的,現在只要我想開啟檔案,就造成執行,微軟也知道這點,因此設計了,只要開啟檔案,按住Shift+點選啟用巨集,即可跳過自動執行的部份,但這實在不理想,當腦袋不靈光時,可能就會釀成大錯。

因此,我們需要更好的方法,以下程式碼,可以帶出執行Excel時的命令列字串,由此,我們可以清楚的分辨是由AutoHotKey程式開啟,還是人為點開Excel檔案。

以下為VBA程式碼,請插入新模組,並將以下程式碼貼到該模組最上方:

Public Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long

以下則是主要的子程式,它提供了取出開啟Excel檔案的命令列字串

Function CommandLine() As String
' 用來取得執行時的字串
    Dim length As Long, lngCmdLine As Long
    lngCmdLine = GetCommandLine()           '讀取執行時的字串指標
    iCmdLine = lstrlen(lngCmdLine)          '讀取該字串長度
    CommandLine = String(iCmdLine + 1, 0)   '調整字串大小
    lstrcpy CommandLine, lngCmdLine         '複製字串
End Function

可以使用以下程式測試結果:

Sub Day23_ShowCommandLine()
    MsgBox CommandLine
End Sub

若是一般開啟,則字串會是「"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e 」若是透過AutoHotKey開啟,則字串會變成「"C:\Program Files\Microsoft Office\OFFICE11\Excel.exe" "Excel VBA的眉眉角角.xls"」,要注意的是,若AHK檔案裡,開啟Excel的方法不是「Run, C:\Program Files\Microsoft Office\OFFICE11\Excel.exe "Excel VBA的眉眉角角.xls"」,而是寫成「Run, "Excel VBA的眉眉角角.xls"」的話,CommandLine子程式抓出的字串,還會是「"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e 」,因此AHK要先寫好,以便區別是如何開啟。另外,若使用的是Office 2000,AHK的程式還可以設定其他的「假參數」,例如「/AutoRun」這參數沒辦法被Excel接受,但不會對程式造成影響,而自己可以設計程式判斷後面加參數,來執行不同的程式碼。但在Office 2003之後,放上不能用的參數,並不會被紀錄到CommandLine中,所以只能使用這篇提供的判別方法了。

我們將程式碼貼到「ThisWorkbook」物件中

Private Sub Workbook_Open()
    If InStr(CommandLine, "Excel VBA的眉眉角角.xls") > 0 Then
        MsgBox "AHK開啟"
    Else
        MsgBox "直接開啟"
    End If
End Sub

我們用以上的程式來判斷,是否有出現開啟的檔案名稱,若有的話,就執行AHK開啟時,要自動執行的程式,否的話,看是跳過,或執行其他程式。

以上的介紹,希望對各位有所助益,能設計出更「自動化」與「人性化」的程式!


上一篇
Excel VBA 的眉眉角角Day22: 如何存取剪貼簿?
下一篇
Excel VBA 的眉眉角角Day24: 使用正規表達式
系列文
Excel VBA 的眉眉角角30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言