tft每日頭條

 > 科技

 > word和excel互相轉換

word和excel互相轉換

科技 更新时间:2024-08-18 21:45:12

【分享成果,随喜正能量】漫漫職場路,總要有所擔當,有所技長,追求來自動力,奮鬥有樂趣,付出乃儲蓄,常懷感恩心,堅持是勝利。 ​​

《VBA信息獲取與處理》教程是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級後的教程。

信息,含義非常之廣泛,是我們日常生活不可或缺的一部分。從天氣情況和預報,到人際關系,宇宙洪荒,都是信息的組成部分。信息在某種程度上就是數據,或者可以用數據來體現,獲得信息也就是數據的獲得。這部教程給大家講解的内容有:跨應用程序信息獲得、随機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪切闆應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等内容。程序文件通過32位和64位兩種OFFICE系統測試。是非常抽象的,更具研究的價值。

這套教程共兩冊,八十四講,今後一段時間會給大家陸續推出修訂後的教程内容。今日的内容是第2講:word與excel應用程序間的切換。

word和excel互相轉換(word與excel應用程序間的切換)1

第二節 在word和excel兩個應用程序間的激活操作

如我們的報告界面,當我們的界面繼續往下進行,在第二個以及第三個按鈕處我們要激活剛才打開的excel,這個按鈕的代碼該如何寫呢?

1 用AppActivate語句

利用AppActivate語句激活EXCEL是非簡單的,我們看下面的按鈕代碼:

Private Sub CommandButton2_Click()

Set ws = CreateObject("wscript.shell")

ws.AppActivate "001 工作表"

End Sub

代碼的截圖:

word和excel互相轉換(word與excel應用程序間的切換)2

代碼講解:我們先看看AppActivate語句的語法:

語法:AppActivate title [, wait]

參數title;是必須的,這是應用程序的名稱,正如它顯示在應用程序窗口的标題欄那樣,或者它也可以是Shell函數返回的任務ID号碼。注意,參數title要跟每個正運行的應用程序的标題字符串進行對比,如果沒有精确的匹配,那麼任何标題字符串裡前面的字符和參數title一緻的應用程序就會被激活。(例如,你要激活Excel,那麼title參數應該是“Microsoft Excel”,如果你寫的是“Microsoft”,那麼激活的就也可能是Word,PowerPoint……)。

第二個參數wait是可選的,它是個布爾值(True或False),明确VB什麼時候激活應用程序。如果在這裡是False的話,該應用程序就立即會被激活,甚至被調應用程序并沒有焦點。如果在wait參數處放置True的話,那麼被調的應用程序就會等到它有了焦點,然後才會激活該應用程序。

例如,要激活Word,你就得輸入下列語句:AppActivate “Microsoft Word”注意,應用程序名稱用雙引号引用起來。

也可以使用Shell函數返回的數值作為語句AppActivate的參數,例如(僅适合于32位OFFICE系統):

Sub mynz()

ReturnValue = Shell("C:\Microsoft Office\Office\Word.exe",1)

AppActivate ReturnValue

End sub

  • 特别注意點,對于AppActivate的用法,我在修訂代碼的時候進行了完善,對于64位的OFFICE系統和32位的OFFICE系統,下面的代碼:

Set ws = CreateObject("wscript.shell")

ws.AppActivate "001 工作表"

是都是可以利用的。

  • 對于教程最初給出的代碼:

Private Sub CommandButton2_Click()

AppActivate "Microsoft Excel"

End Sub

隻适合于32位系統。大家要注意。

2 利用API函數

如本講的内容,在Word中使用代碼自動化激活Excel,其實,在我們寫程序的時候,會發現,當運行某個活動應用程序時(如word),從這個運行程序的代碼激活另外一個應用程序作為主窗口(如在word運行時激活Excel窗口)對于用戶來說是非常有用的。這時我們可以嘗試使用上面的AppActivate語句,但這要求事先知道要激活的窗口的标題。而且,從實際的表現看,AppActivate有點給人不靠譜的感覺,有時工作,有時不工作(會提示:引發錯誤5,無效的過程調用)。所以,我給大家講解下面的第二種方案就是調用API函數的方案。

我們可以使用幾個簡單的Windows API函數完成同樣的任務。API是直接調用組成Windows的DLL庫文件的過程。可以使用API函數完成VBA本身無法執行的操作。但是有一點值得注意。就是API沒有VBA代碼的錯誤處理功能,如果使用無效參數調用API函數,可能會導緻Excel崩潰并丢失所有工作。API函數的使用應該非常謹慎。

以下代碼将激活主Excel窗口并将鍵盤焦點設置為Excel中的活動工作表。我這裡給出的代碼在13版32位office中已經實測,在16版及64位ofiice或許不能完全得到你需要的效果,這一點要注意。當然為了保證代碼應适用于其他的場合我給出的是通用的版本,可以将MyCLASS的值從xlmain更改為其他應用程序的WINDOW類從而完成實際的需要。

Option Compare Text '聲明比較字符串數據時要使用的默認比較方法按TEXT比較。

' Window API 引用聲明

#If VBA7 Then

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

#Else

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 Long

#End If

Private Sub CommandButton1_Click()

Dim Res As Long

Dim XLHWnd As Long

Const MyCLASS = "XLMAIN"

'假如有多個EXCEL運行,程序是無法判斷是要激活哪一個EXCEL的;

'同時必須使用vbNullString調用,而不是""的空字符串的調用在FindWindow函數中兩者有不同

XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString)

If XLHWnd > 0 Then

'設置活動窗口

Res = BringWindowToTop(HWnd:=XLHWnd)

If Res = 0 Then

MsgBox "置頂激活錯誤,錯誤代碼: " & CStr(Err.LastDllError)

Else

SetFocus HWnd:=XLHWnd

End If

Else

MsgBox "沒有發現 Excel被打開"

End If

End Sub

代碼截圖:

word和excel互相轉換(word與excel應用程序間的切換)3

代碼講解:上述代碼在頭部建立了引用API函數的聲明,在代碼中首先會查找excel程序,如果找到會将EXCEL置頂。此程序将激活主EXCEL程序,并獲得焦點,注意:如果打開VBA編輯器,此操作将無法正常工作。如果打開VBA編輯器窗口,系統将設置焦點到那個窗口,而不是XLMAIN窗口。此代碼可以激活任何應用程序,隻需更改myCLASS到應用程序主窗口的類,這裡我給大家一些常見的OFFICE應用程序常見的類:

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應用程序窗口的窗口句柄("XLMAIN")。如果“正在運行Excel的多個實例”,您無法控制将檢索哪個實例的HWnd。

② XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString)

在調用' FindWindow時,你必須使用vbNullString不是一個空字符串"",當調用API函數時,vbNullString和空字符串“”之間有區别。

③ BringWindowToTop(HWnd:=XLHWnd) 将應用程序置頂

函數語法: BringWindowToTop(HWND hWnd);

函數功能:該函數将指定的窗口設置到Z序的頂部。如果窗口為頂層窗口,則該窗口被激活;如果窗口為子窗口,則相應的頂級父窗口被激活。

參數:hWnd: 設置到Z序的頂部的窗口句柄。

返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零。若想獲得更多錯誤信息,可以調用GetLastError函數。

④ FindWindow用法

函數功能:該函數獲得一個頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數不查找子窗口。在查找時不區分大小寫。

函數語法:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);

參數:IpClassName :指向一個指定了類名的空結束字符串,或一個标識類名字符串的成員的指針。如果該參數為一個成員,則它必須為前次調用theGlobafAddAtom函數産生的全局成員。該成員為16位,必須位于IpClassName的低 16位,高位必須為 0。

IpWindowName:指向一個指定了窗口名(窗口标題)的空結束字符串。如果該參數為空,則為所有窗口全匹配。

返回值:如果函數成功,返回值為具有指定類名和窗口名的窗口句柄;如果函數失敗,返回值為NULL。

這個函數有兩個參數,第一個是要找的窗口的類,第二個是要找的窗口的标題。在搜索的時候不一定兩者都知道,但至少要知道其中的一個。有的窗口的标題是比較容易得到的,如"計算器",所以搜索時應使用标題進行搜索。但有的軟件的标題不是固定的,如"記事本",如果打開的文件不同,窗口标題也不同,這時使用窗口類搜索就比較方便。如果找到了滿足條件的窗口,這個函數返回該窗口的句柄,否則返回0。

⑤關于句柄,句柄是整個Windows編程的基礎。一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來标識應用程序中的不同對象和同類中的不同的實例,諸如,一個窗口,按鈕,圖标,滾動條,輸出設備,控件或者文件等。應用程序能夠通過句柄訪問相應的對象的信息,但是句柄不是指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無用處的。 句柄是Windows用來标志應用程序中建立的或是使用的唯一整數,Windows大量使用了句柄來标識對象。

⑥ SetFocus HWnd:=XLHWnd

設置焦點。

本節知識點回向:在本節中我們講了如何做到在不同的應用程序間切換,主要利用了兩種方案,一種是利用API函數,要查找到程序的局部然後置頂,一種是利用了AppActivate,這兩種方法在應用上要注意測試,對于前者要注意所用的office是否合适于這種應用,後者要注意應用的穩定性。本講的知識點:

① AppActivate 如何應用。

② FindWindow 和 SetFocus 如何應用。

③ 上述兩種應用的優缺點分析。

④ 理解API函數聲明與OFFICE版本的關系。

本節代碼參考文件“001 在WORD中激活EXCEL.docm”

word和excel互相轉換(word與excel應用程序間的切換)4

  • 學習是自我提高的過程,也是自我修行的過程。學,總會有收獲。生命向前,沒有達到不了的遠方。

我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中,教程學習順序:

① 7→1→3→2→6→5或者7→4→3→2→6→5。

② 7→8

各套教程内容簡介:

第7套教程(共三冊):《VBA之EXCEL應用》:是對VBA基本的講解

第1套教程(共三冊):《VBA代碼解決方案》:是入門後的提高教程

第4套教程(16G):VBA代碼解決方案之視頻(第一套的視頻講解)

第3套教程(共兩冊):《VBA數組與字典解決方案》:是對數組和字典的專題講解

第2套教程(共兩冊):《VBA數據庫解決方案》:是對數據庫的專題講解

第6套教程(共兩冊):《VBA信息獲取與處理》:講解VBA的網絡及跨程序應用

第5套教程(共兩冊):VBA中類的解讀和利用:類及接口技術的講解

第8套教程(共三冊):VBA之Word應用(最新教程):word中VBA的利用

  • 第六套教程:VBA信息獲取與處理,是一部高級教程,涉及範圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程序信息獲得、随機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪切闆應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等内容。程序文件通過32位和64位兩種OFFICE系統測試。
,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved