《VBA信息獲取與處理》教程是我推出第六套教程,目前已經(jīng)是第一版修訂了。這套教程定位于最高級,是學(xué)完初級,中級后的教程。信息,含義非常之廣泛,是我們?nèi)粘I畈豢苫蛉钡囊徊糠?。從天氣情況和預(yù)報,到人際關(guān)系,宇宙洪荒,都是信息的組成部分。信息在某種程度上就是數(shù)據(jù),或者可以用數(shù)據(jù)來體現(xiàn),獲得信息也就是數(shù)據(jù)的獲得。這部教程給大家講解的內(nèi)容有:跨應(yīng)用程序信息獲得、隨機(jī)信息的利用、電子郵件的發(fā)送、VBA互聯(lián)網(wǎng)數(shù)據(jù)抓取、VBA延時操作,剪切板應(yīng)用、Split函數(shù)擴(kuò)展、工作表信息與其他應(yīng)用交互,F(xiàn)SO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數(shù)等等內(nèi)容。程序文件通過32位和64位兩種OFFICE系統(tǒng)測試。是非常抽象的,更具研究的價值。這套教程共兩冊,八十四講,今后一段時間會給大家陸續(xù)推出修訂后的教程內(nèi)容。今日的內(nèi)容是第2講:word與excel應(yīng)用程序間的切換。第二節(jié) 在word和excel兩個應(yīng)用程序間的激活操作
如我們的報告界面,當(dāng)我們的界面繼續(xù)往下進(jìn)行,在第二個以及第三個按鈕處我們要激活剛才打開的excel,這個按鈕的代碼該如何寫呢?1 用AppActivate語句
利用AppActivate語句激活EXCEL是非簡單的,我們看下面的按鈕代碼:Private Sub CommandButton2_Click() Set ws = CreateObject('wscript.shell')代碼講解:我們先看看AppActivate語句的語法:語法:AppActivate?title?[,?wait]參數(shù)title;是必須的,這是應(yīng)用程序的名稱,正如它顯示在應(yīng)用程序窗口的標(biāo)題欄那樣,或者它也可以是Shell函數(shù)返回的任務(wù)ID號碼。注意,參數(shù)title要跟每個正運行的應(yīng)用程序的標(biāo)題字符串進(jìn)行對比,如果沒有精確的匹配,那么任何標(biāo)題字符串里前面的字符和參數(shù)title一致的應(yīng)用程序就會被激活。(例如,你要激活Excel,那么title參數(shù)應(yīng)該是“Microsoft Excel”,如果你寫的是“Microsoft”,那么激活的就也可能是Word,PowerPoint……)。第二個參數(shù)wait是可選的,它是個布爾值(True或False),明確VB什么時候激活應(yīng)用程序。如果在這里是False的話,該應(yīng)用程序就立即會被激活,甚至被調(diào)應(yīng)用程序并沒有焦點。如果在wait參數(shù)處放置True的話,那么被調(diào)的應(yīng)用程序就會等到它有了焦點,然后才會激活該應(yīng)用程序。例如,要激活Word,你就得輸入下列語句:AppActivate “Microsoft Word”注意,應(yīng)用程序名稱用雙引號引用起來。也可以使用Shell函數(shù)返回的數(shù)值作為語句AppActivate的參數(shù),例如(僅適合于32位OFFICE系統(tǒng)):ReturnValue = Shell('C:\Microsoft Office\Office\Word.exe',1) u特別注意點,對于AppActivate的用法,我在修訂代碼的時候進(jìn)行了完善,對于64位的OFFICE系統(tǒng)和32位的OFFICE系統(tǒng),下面的代碼: Set ws = CreateObject('wscript.shell')Private Sub CommandButton2_Click() AppActivate 'Microsoft Excel'2 利用API函數(shù)
如本講的內(nèi)容,在Word中使用代碼自動化激活Excel,其實,在我們寫程序的時候,會發(fā)現(xiàn),當(dāng)運行某個活動應(yīng)用程序時(如word),從這個運行程序的代碼激活另外一個應(yīng)用程序作為主窗口(如在word運行時激活Excel窗口)對于用戶來說是非常有用的。這時我們可以嘗試使用上面的AppActivate語句,但這要求事先知道要激活的窗口的標(biāo)題。而且,從實際的表現(xiàn)看,AppActivate有點給人不靠譜的感覺,有時工作,有時不工作(會提示:引發(fā)錯誤5,無效的過程調(diào)用)。所以,我給大家講解下面的第二種方案就是調(diào)用API函數(shù)的方案。我們可以使用幾個簡單的Windows API函數(shù)完成同樣的任務(wù)。API是直接調(diào)用組成Windows的DLL庫文件的過程??梢允褂肁PI函數(shù)完成VBA本身無法執(zhí)行的操作。但是有一點值得注意。就是API沒有VBA代碼的錯誤處理功能,如果使用無效參數(shù)調(diào)用API函數(shù),可能會導(dǎo)致Excel崩潰并丟失所有工作。API函數(shù)的使用應(yīng)該非常謹(jǐn)慎。以下代碼將激活主Excel窗口并將鍵盤焦點設(shè)置為Excel中的活動工作表。我這里給出的代碼在13版32位office中已經(jīng)實測,在16版及64位ofiice或許不能完全得到你需要的效果,這一點要注意。當(dāng)然為了保證代碼應(yīng)適用于其他的場合我給出的是通用的版本,可以將MyCLASS的值從xlmain更改為其他應(yīng)用程序的WINDOW類從而完成實際的需要。Option Compare Text '聲明比較字符串?dāng)?shù)據(jù)時要使用的默認(rèn)比較方法按TEXT比較。 Private Declare PtrSafe Function BringWindowToTop Lib 'user32' (ByVal HWnd As LongPtr) As Long Private Declare PtrSafe Function FindWindow Lib 'user32' Alias 'FindWindowA' ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare PtrSafe Function SetFocus Lib 'user32' (ByVal HWnd As LongPtr) As Long Private Declare Function BringWindowToTop Lib 'user32' (ByVal HWnd As Long) As Long Private Declare Function FindWindow Lib 'user32' Alias 'FindWindowA' ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function SetFocus Lib 'user32' (ByVal HWnd As Long) As LongPrivate Sub CommandButton1_Click() '假如有多個EXCEL運行,程序是無法判斷是要激活哪一個EXCEL的; '同時必須使用vbNullString調(diào)用,而不是''的空字符串的調(diào)用在FindWindow函數(shù)中兩者有不同 XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString) Res = BringWindowToTop(HWnd:=XLHWnd) MsgBox '置頂激活錯誤,錯誤代碼: ' & CStr(Err.LastDllError) MsgBox '沒有發(fā)現(xiàn) Excel被打開'代碼講解:上述代碼在頭部建立了引用API函數(shù)的聲明,在代碼中首先會查找excel程序,如果找到會將EXCEL置頂。此程序?qū)⒓せ钪鱁XCEL程序,并獲得焦點,注意:如果打開VBA編輯器,此操作將無法正常工作。如果打開VBA編輯器窗口,系統(tǒng)將設(shè)置焦點到那個窗口,而不是XLMAIN窗口。此代碼可以激活任何應(yīng)用程序,只需更改myCLASS到應(yīng)用程序主窗口的類,這里我給大家一些常見的OFFICE應(yīng)用程序常見的類: Excel 97、2000、2002、2003、2007、2013 為 XlMain Word 97、2000、2002、2003、2007、2013 為OpusApp Access 2000、2002、2003、2007、2013 為OMain① Const MYCLASS = 'XLMAIN'獲取主'Excel應(yīng)用程序窗口的窗口句柄('XLMAIN')。如果“正在運行Excel的多個實例”,您無法控制將檢索哪個實例的HWnd。② XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString)在調(diào)用' FindWindow時,你必須使用vbNullString不是一個空字符串'',當(dāng)調(diào)用API函數(shù)時,vbNullString和空字符串“”之間有區(qū)別。③ BringWindowToTop(HWnd:=XLHWnd) 將應(yīng)用程序置頂函數(shù)語法: BringWindowToTop(HWND hWnd);函數(shù)功能:該函數(shù)將指定的窗口設(shè)置到Z序的頂部。如果窗口為頂層窗口,則該窗口被激活;如果窗口為子窗口,則相應(yīng)的頂級父窗口被激活。參數(shù):hWnd: 設(shè)置到Z序的頂部的窗口句柄。返回值:如果函數(shù)成功,返回值為非零;如果函數(shù)失敗,返回值為零。若想獲得更多錯誤信息,可以調(diào)用GetLastError函數(shù)。函數(shù)功能:該函數(shù)獲得一個頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數(shù)不查找子窗口。在查找時不區(qū)分大小寫。函數(shù)語法:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);參數(shù):IpClassName :指向一個指定了類名的空結(jié)束字符串,或一個標(biāo)識類名字符串的成員的指針。如果該參數(shù)為一個成員,則它必須為前次調(diào)用theGlobafAddAtom函數(shù)產(chǎn)生的全局成員。該成員為16位,必須位于IpClassName的低 16位,高位必須為 0。 IpWindowName:指向一個指定了窗口名(窗口標(biāo)題)的空結(jié)束字符串。如果該參數(shù)為空,則為所有窗口全匹配。返回值:如果函數(shù)成功,返回值為具有指定類名和窗口名的窗口句柄;如果函數(shù)失敗,返回值為NULL。這個函數(shù)有兩個參數(shù),第一個是要找的窗口的類,第二個是要找的窗口的標(biāo)題。在搜索的時候不一定兩者都知道,但至少要知道其中的一個。有的窗口的標(biāo)題是比較容易得到的,如'計算器',所以搜索時應(yīng)使用標(biāo)題進(jìn)行搜索。但有的軟件的標(biāo)題不是固定的,如'記事本',如果打開的文件不同,窗口標(biāo)題也不同,這時使用窗口類搜索就比較方便。如果找到了滿足條件的窗口,這個函數(shù)返回該窗口的句柄,否則返回0。⑤關(guān)于句柄,句柄是整個Windows編程的基礎(chǔ)。一個句柄是指使用的一個唯一的整數(shù)值,即一個4字節(jié)(64位程序中為8字節(jié))長的數(shù)值,來標(biāo)識應(yīng)用程序中的不同對象和同類中的不同的實例,諸如,一個窗口,按鈕,圖標(biāo),滾動條,輸出設(shè)備,控件或者文件等。應(yīng)用程序能夠通過句柄訪問相應(yīng)的對象的信息,但是句柄不是指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無用處的。 句柄是Windows用來標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù),Windows大量使用了句柄來標(biāo)識對象。本節(jié)知識點回向:在本節(jié)中我們講了如何做到在不同的應(yīng)用程序間切換,主要利用了兩種方案,一種是利用API函數(shù),要查找到程序的局部然后置頂,一種是利用了AppActivate,這兩種方法在應(yīng)用上要注意測試,對于前者要注意所用的office是否合適于這種應(yīng)用,后者要注意應(yīng)用的穩(wěn)定性。本講的知識點: ① AppActivate 如何應(yīng)用。 ② FindWindow 和 SetFocus 如何應(yīng)用。 ③ 上述兩種應(yīng)用的優(yōu)缺點分析。 ④ 理解API函數(shù)聲明與OFFICE版本的關(guān)系。本節(jié)代碼參考文件“001 在WORD中激活EXCEL.docm”l學(xué)習(xí)是自我提高的過程,也是自我修行的過程。學(xué),總會有收獲。生命向前,沒有達(dá)到不了的遠(yuǎn)方。我20多年的VBA實踐經(jīng)驗,全部濃縮在下面的各個教程中,教程學(xué)習(xí)順序:① 7→1→3→2→6→5或者7→4→3→2→6→5。第7套教程(共三冊):《VBA之EXCEL應(yīng)用》:是對VBA基本的講解第1套教程(共三冊):《VBA代碼解決方案》:是入門后的提高教程第4套教程(16G):VBA代碼解決方案之視頻(第一套的視頻講解)第3套教程(共兩冊):《VBA數(shù)組與字典解決方案》:是對數(shù)組和字典的專題講解第2套教程(共兩冊):《VBA數(shù)據(jù)庫解決方案》:是對數(shù)據(jù)庫的專題講解第6套教程(共兩冊):《VBA信息獲取與處理》:講解VBA的網(wǎng)絡(luò)及跨程序應(yīng)用第5套教程(共兩冊):VBA中類的解讀和利用:類及接口技術(shù)的講解第8套教程(共三冊):VBA之Word應(yīng)用(最新教程):word中VBA的利用l第六套教程:VBA信息獲取與處理,這是一部高級教程,涉及范圍更廣,實用性更強(qiáng),面向中高級人員。教程共二十個專題,包括:跨應(yīng)用程序信息獲得、隨機(jī)信息的利用、電子郵件的發(fā)送、VBA互聯(lián)網(wǎng)數(shù)據(jù)抓取、VBA延時操作,剪切板應(yīng)用、Split函數(shù)擴(kuò)展、工作表信息與其他應(yīng)用交互,F(xiàn)SO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數(shù)等等內(nèi)容。程序文件通過32位和64位兩種OFFICE系統(tǒng)測試。_______________________________
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。