999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于VBA對Office二次開發的可移植性研究

2014-10-21 11:09:39李圓
電子世界 2014年12期
關鍵詞:二次開發

【摘要】利用VBA對Word等辦公軟件進行二次開發的程序,可移植性差,只能在開發機器中運行,不便于開發成果的共享使用。將開發的程序,通過VBA直接導出,然后再導入到其它Word程序的VBA中,并解決好當中Thisdocument文件的代碼,可以實現程序的移植共享,但安全性差。利用VB將導出的代碼,以DLL文件的形式編譯封裝,并用批處理指令幫助用戶進行注冊,可以極好地解決程序的安全性與移植共享問題。

【關鍵詞】可移植性;VBA;二次開發;封裝

引言

微軟的Office軟件在一些特殊的應用中,有力所不及之處。利用VBA(Visual Basic For Application)對Office進行拓展性的二次開發,是當前解決Office功能不足的常見方法。但此法最明顯的不足就是所開發的程序不具備可移植性,僅限于開發者所在的機器中能夠使用,其它需要同樣功能程序的用戶或機器,只能重復開發,極大地影響了開發成果的共享。因此, VBA二次開發程序的可移植性問題,是亟待每個程序員研究、解決的問題。下文將以VAB在Word中的二次開發為例,對其可移植性問題的研究進行詳細闡述。

1.VBA二次開發的現狀

1.1 關于VBA

VBA微軟開發出來的宏語言。主要用來擴展Windows的應用程式功能,特別是微軟的Office軟件。它完全繼承了VB(Visual Basic)的語言機制,是VB的一個子集,但又不同于VB,VB是一個可視化的程序開發環境,能夠獨立創建一個應用程序并編譯運行,而VBA則要求有一個宿主應用程序(如Word)才能開發、運行,而且不能用于創建獨立的應用程序。

由于VBA必須寄生于宿主程序,離開宿主程序以后,程序便無法被解讀與運行。這是制約VBA二次開發程序可移植性的主要因素之一。因此,我們對VBA程序的可移植性研究,主要集中在二次開發程序在其宿主程序中的移植,即如何使開發出來的程序,能夠方便、快捷地移植到其它機器中,并在相應的宿主軟件中正確運行,使得開發成果能夠發揮資源共享的作用。

1.2 VBA對Word的開發與存在問題

1.2.1 錄制宏

錄制宏是當前VBA對Word最簡單、常見的開發模式。這種方法優點是簡單,易實現,完全可視化操作,用戶不需編寫任何代碼,只要按照功能需求,一步步操作Word即可,VBA會根據用戶的操作,自動生成相應的VBA程序代碼,并保存在指定的文件中。

但該法的缺點也很明顯,就是能擴展的功能非常有限。所謂錄制宏,實際就是利用已有的Word功能,將需要反復進行的一系列操作,組合為一步操作,并作以VBA程序的形式保存下來。用戶在打開該文檔的同時,啟動文檔中已保存的VBA程序,并根據用戶的指令運行、發揮作用。因此,這種開發完全依賴于Word中已有的可操作功能,只能在功能組合的基礎上進行。

1.2.2 VBA環境開發

利用VBA對Word進行二次開發,更重要的方法是在Word中集成的VBA環境里,通過編寫程序實現。VBA環境不僅為開發者準備了窗體、按鈕、組合框等常用的Windows圖形化控件,還繼承了VB中的模塊、類、對象等概念。開發者不僅可以擺脫Word已有功能的掣肘,還可以像在VB中一樣,自由編寫出功能強大的程序。甚至可以結合其它軟件,相比于“錄制宏”,更能擴展Word的功能。

如在日常辦公中,有時需將Word與Excel兩個軟件結合使用。那么,在VBA中,只要以下簡單的程序,即可實現Word對Excel的調用:

Set E_obj = CreateObject(“Excel.Applicattion”)

E_obj.visible=True

但無論是利用“錄制宏”還是利用VBA環境進行Word的二次開發,其共同的缺點都是所開發出來的程序,必須與Word文件捆綁保存,無法獨立于Word程序獨立存在運行。因為在VBA程序中的許多對象、系統變量與系統常量都完全來源并被識別于Word,并且只有開發所在的機器與用戶能夠正常使用。例如若在VBA中有以下程序:

ActiveDocument.Paragraphs(3).Range.Characters(2).Font.Size = 14

程序中的ActiveDocument,Paragraphs,Range,Characters都屬于Word的專有對象,如果程序被獨立運行的話,便會報錯中斷運行,因為脫離Word環境以后,這些對象就無法再被識別,成為無效引用。

2.解決VBA程序可移植性的方法

2.1 代碼導入法

代碼導入法即是在Word中的VBA環境下,完成二次開發以后,將全部代碼按分類直接導出到一個目錄中,發布分享。需要同樣的功能程序的用戶,再通過VBA將全部代碼導入到自己的Word中。其操作流程示意圖如圖1所示:

圖1 操作流程示意圖

利用導入法解決VBA程序的可移植性問題,最大的優點是簡單、快捷、易實現,對于安全要求不高,面向有限的內部用戶群體的二次開發程序,該法是可行的選擇。但必須解決的一個問題,就是“ThisDocument”文件中代碼的移植。在分析這個問題之前,我們必須先對VBA中的文件結構有所了解。Word將VBA程序文件分為五類,分別存放在Microsoft Word對象、窗體、模塊、類模塊、引用五個目錄中,其結構關系如圖2所示。

圖2 結構關系

其中,“Microsoft Word對象”目錄下,通常只有一個文件,名為ThisDocument。存放的就是控制、操作當前Word文檔的相關程序代碼以及公開、通用類的聲明、函數與過程,如打開文檔時觸發的“Document_Open()”過程就保存在這里。如果ThisDocument文件中沒有任何VBA代碼的話,代碼導入法解決VBA程序的移植就能正確進行。但是,如果這個文件中增加了開發的代碼,就會發現新文檔導入代碼文件以后,程序失效,也即意味著移植失敗。

這是因為在導出代碼時,VBA是把ThisDocument文件中的代碼,作為一個類文件導出保存的,這個類文件的名字默認為ThisDocument.cls。但是當在新文檔中再次導入這個文件中的代碼時,VBA卻并沒有自動將代碼覆蓋到新文檔的“ThisDocument”文件中,而且將其作為一個獨立的類文件,以原來的類文件名保存在新文檔的“類模塊”目錄下。這就會導致新文檔無法運行該文件中的代碼,使程序移植失敗。

注意到這個問題以后,只要在導入This-Document.cls文件以后,打開其中的代碼并全部復制,然后粘貼到新文檔的ThisDocument代碼窗口中,再把所導入的ThisDocument.cls文件移除便可保證全部程序的成功移植。

2.2 將VBA程序封裝成DLL文件

2.2.1 關于DLL與VBA代碼封裝

DLL即動態鏈接庫(Dynamic Link Library),是由可被其它程序調用的函數集合組成的可執行文件模塊。DLL不是應用程序的組成部分,而是運行時鏈接到應用程序中。將VBA程序封裝成DLL就是通過編譯軟件,將二次開發的VBA程序編譯成DLL文件,以方便地為其它用戶引用到各自的Word程序中運行使用。其基本的實現流程如圖3所示:

圖3 實現流程

具體的實現過程,不是本文闡述的重點,在此不再累述。通過DLL封裝進行程序移植,其優點主要有以下幾點:

(1)一個DLL可以為多個Word文檔同時共享,而且當多個Word文件調用DLL中的同一個函數時,裝入的只是該函數的內存地址,從而節省內存和磁盤空間;

(2)便于開發者維護用戶程序,即使對動態鏈接庫進行修改也不會影響正在使用的用戶程序;

(3)VBA代碼通過編譯封裝成為DLL文件以后,是以二進制的形式保存在磁盤中的,這就可以保證代碼的安全。

(4)省去了運行時的編譯過程,可以提高代碼的運行速度。

因此,不考慮實現過程相對繁瑣的話,通過DLL封裝,是VBA程序移植的最佳方案。

2.2.2 消除宿主程序的對象模型對封裝DLL的影響

Word中的VB編輯器不能夠將VBA代碼編譯成DLL。因此,必須借助微軟的VB軟件。但直接將VBA代碼導入VB進行編譯,通常都會報錯導致編譯中斷。錯誤信息是運行時錯誤,對象的引用無效。這是因為所編譯的代碼中,含有Word程序的特有對象,在Word中運行這些代碼時,程序能夠識別這些對象。代碼移植到VB中以后,VB本身并沒有這些對象,因此,編譯時,就會認為是無效的引用而報錯。

因此,將VBA代碼移到VB中進行編譯工作之前,必須詳細了解Word的對象模型,并對VB中的代碼進行修改,使其能夠通過VB的語法檢查,又能為Word所運行,才能完成DLL的編譯封裝。

編譯前的代碼修改,主要從以下兩個方面檢查:

(1)修改VBA代碼中Word所特有的對象。如果所要編譯移植的代碼中,含有Document、Selection、Tables等等Word所特有類型的對象(如圖4所示),那么VB是無法識別的。必須給這些對象所在的過程或函數,定義一個數據類型為Object的參數,將這些對象通過這個參數進行傳遞調用。如在一個過程Removal_Test中要訪問對象Tables,即Removal_Test可定義為Removal_Test (Test_Tab As Object)。那么Tables對象就可以用以下程序進行調用:

Dim new_table as object

Set new_table=CreateObject(“,”Word.Application”) ‘

Removal_Test(new_table)

(2)修改Word的VBA專屬常量。Word的 VBA專屬常量以“wd”開頭,不同的宿主程序的VBA專屬常量具體有所區別,必須根據實際情況,進行代碼的修改編寫。比如代碼中有設置段落格式的命令“.ParagraphFormat.Alignment = wdAlignParagraphCenter”。其中的wdAlignParagraphCenter就屬于Word的專屬常量。如果在VB中直接編譯,就會出現“類型不匹配”或“該屬性值不是一個有效值”的錯誤。解決的方法是需要使用常量的地方,用“常量值”來替代“常量名”。.ParagraphFormat.Alignment = 1。常量值的獲取,可以查閱有關文檔資料,也可以在Word的VB編輯器中用Msgbox方法,讓Word自己將值返回。如Msgbox wdAlignParagraphCenter 。

2.2.3 相關類庫的引用

VB環境中,許多對象,依然需要相關的類庫文件來支持,才能支持識別其相關的屬性與方法。

因此,將程序編譯封裝前,還必須在VB環境中的【工程】菜單下,通過【引用】菜單項,調出“引用”對話框,然后將所需的類庫引用到VB中來,如圖4所示。

圖4

在Word中利用VBA進行的二次開發程序,必須引用的至少有兩個類庫:Microsoft Word 12.0 Object Library與Microsoft Office 12.0 Object Library。不同版本的Office,類庫的版本也相應不同。如果在開發的過程中,還曾經引用過其他類庫,在VB中編譯時也必須先將這些類庫引用進來。

3.DLL文件的移植

3.1 常見的DLL文件移植問題

封裝成為DLL文件(實驗名為Test_VBA.dll,下同)以后,當中的程序能否為其它Word用戶所運行使用,是決定VBA程序的移植是否成功的關鍵。通常在編譯工作所在的機器中,這個DLL文件的使用是沒有任何障礙的,但把這個DLL文件轉移到其它機器上以后,將其引用到Word中時,卻容易出現各樣的錯誤,程序無法運行,也即意味著程序移植的最后一步失敗。常見的錯誤類型主要有以下幾種:

(1)找不到工程或庫:

這是由于在Windows平臺中,DLL文件未被注冊,因此,無法被引用。

(2)引用的動態鏈接庫(DLL)丟失:

即使一個DLL文件的注冊信息已經寫入系統注冊表,但是文件的存放路徑相對于注冊時的路徑發生了改變,系統就會認為DLL文件丟失而報錯。

(3)自動化(Automation)錯誤:

錯誤的原因是DLL文件注冊并被Word引用以后,在運行的過程中,文件的路徑再次發生改變。

3.2 解決DLL文件移植問題的對策

解決DLL文件移植過程中出現的各類問題,可以通過批處理程序完成。程序首先將DLL文件復制到system目錄下,然后運行Regsvr32命令進行注冊。將批處理指令保存成為批處理文件以后,隨同DLL文件一起打包發布。用戶在獲得文件包以后,運行批處理文件,由批處理文件自動完成DLL文件的復制與注冊,完成后,用戶在Word中進行DLL文件的引用運行即可。批處理指令如下:

@echo off

if exist Test_VBA.dll goto A

if not exist Test_VBA.dll goto B

:A

copy Test_VBA.dll %windir%\system32

regsvr32 %windir%\system32\Test_VBA.dll /s

echo 文件注冊成功,請打開Word并在VBA環境中引用運行

pause

exit

:B

echo DLL文件丟失,請重新下載

pause

exit

對于已注冊的DLL文件的引用,比較穩定且高效的方法,是通過VBA中的CreateObject方法實現引用。關鍵代碼如下:

Dim New_obj As Object ‘定義一個新對象

Set New_obj = CreateObject(“Test_VBA.Ulogin”) ‘ 將定義的對象實例化

……

Set New_obj = Nothing ‘釋放對象

至此,即可解決VBA二次開發程序的移植過程中的全部問題。我們可以將問題解決的方法與過程用圖6簡要表述。

圖6

4.結語

VBA使Word等一系列軟件的功能得到了更廣的拓展,但VBA本身能力的不足,使VBA的二次開發程序不能直接移植,嚴重影響到Word用戶對開發成果的分享。直接將代碼導出共享,并在導入使用時,妥當解決好ThisDocument文件中的代碼,是可行的方法之一,但程序毫無安全性可言。而將VBA代碼導出以后,再借助VB作可移植性的代碼修改,然后封裝成為DLL動態鏈接庫文件,并利用批處理命令對DLL文件注冊,再在Word中進行引用。

這種方法不僅能保證程序代碼安全,而且可以提高運行效率,并且在開發者的程序維護與用戶的繼續使用之間,不存在任何沖突,是當前解決VBA程序可移植性問題中,最佳的選擇。

參考文獻

[1]周靜,袁方等. 基于VSTO的Office二次開發[J].福建電腦,2011(9):22-23.

[2]王燕.VBA在辦公中的編程應用[J].福建電腦,2013(10): 177-179.

[3]江云林.DLL巧注冊 系統更隨心[J].電腦愛好者,2013(3): 59-59.

[4]張發凌.批處理命令在Windows操作中的典型應用[M].北京:人民郵電出版社,2008,2.

[5]Word對象模型概述[EB/OL].http://msdn.microsoft.com/zh-cn/library/d2tx7z6d(v=vs.80).aspx.

[6]黃聰會,陳靖等.軟件移植理論與技術研究[J].計算機應用研究,2012(6):2024-2027.

[7][英]Lan Sommerville.軟件工程(第九版)[M] .北京:機械工業出版社,2011,5.

[8]李殿勛.淺談Windows環境下對象的鏈接與嵌入[J].中國科技博覽,2011(37):157-157.

[9]何振林,胡綠慧.MS Office與VBA高級應用案例教程[M].北京:水利水電出版社,2010,09.

[10]劉春裕.基于VBA開發技術的接口測試技術研究[J].計算機技術與發展,2014(1):69-72.

[11]梁潔.利用VB實現OFFICE對象的訪問控制[J]成都醫學院學報,2007(1):48-51.

[12]梁德強,王省書等.基于ActiveX控件的視頻跟蹤系統軟件設計[J].微計算機信息,2010(19):201-202.

[13]祝晉.office的二次開發及在工業設計中的應用[J].自動化與儀器儀表,2012(1):86-87.

[14]陳永松.Office操作題自動閱卷組件設計[J].實驗室研究與探索,2013(8):64-67.

[15]周維京.VBA封裝技術分析[J].電腦與電信,2008(4): 34-35.

[16]羅雨滋.在應用程序中使用Office對象的方法[J].遼寧師專學報(自然科學版),2007(1):37-38.

作者簡介:李圓(1984—),女,廣東河源人,惠州商貿旅游高級職業技術學校講師,研究方向:計算機應用與程序設計。

猜你喜歡
二次開發
淺談基于Revit平臺的二次開發
甘肅科技(2020年20期)2020-04-13 00:30:02
西門子Operate高級編程的旋轉坐標系二次開發
淺談Mastercam后處理器的二次開發
模具制造(2019年3期)2019-06-06 02:11:02
基于C#的AutoCAD建筑構件庫二次開發
江西建材(2018年2期)2018-04-14 08:01:14
西門子Easy Screen對倒棱機床界面二次開發
基于全站儀二次開發的覆冰厚度測量與實現
電測與儀表(2016年9期)2016-04-12 00:29:52
Micaps3.2 版本二次開發入門淺析
西藏科技(2015年12期)2015-09-26 12:13:51
基于VB的ANSYS二次開發在變壓器抗短路性能分析中的應用
基于CATIA的橡皮囊成形毛料展開的二次開發
機械工程師(2015年9期)2015-02-26 08:38:10
ANSYS Workbench二次開發在汽車穩定桿CAE分析中的應用
汽車零部件(2014年5期)2014-11-11 12:24:32
主站蜘蛛池模板: 91久久偷偷做嫩草影院电| 91精品国产一区| 国产91色在线| 99久久无色码中文字幕| 亚洲浓毛av| 国产精品思思热在线| 秋霞午夜国产精品成人片| 国产高清在线丝袜精品一区| 亚洲天堂视频在线观看| 国产成人久久综合777777麻豆| 在线欧美一区| 一级一级一片免费| 日韩精品成人网页视频在线| 色播五月婷婷| a色毛片免费视频| 99在线视频网站| 久久久久亚洲AV成人网站软件| 国产乱子伦精品视频| 全午夜免费一级毛片| 中文字幕无码中文字幕有码在线| 99精品视频在线观看免费播放| 伊人久久大香线蕉aⅴ色| 欧美 亚洲 日韩 国产| 中文字幕免费播放| 国产精鲁鲁网在线视频| 亚洲最猛黑人xxxx黑人猛交| 天天色天天综合| 成人在线不卡视频| 99无码熟妇丰满人妻啪啪| 亚洲成人精品久久| 狠狠综合久久| 无码内射中文字幕岛国片| 欧美精品亚洲精品日韩专区| 91青青视频| 天堂亚洲网| 六月婷婷精品视频在线观看| 久久无码av三级| 亚洲中文精品人人永久免费| 亚洲色无码专线精品观看| 亚洲av无码成人专区| 狠狠干综合| 国产一区二区三区精品久久呦| 中文字幕无码制服中字| 亚洲欧美日本国产综合在线| 91精品伊人久久大香线蕉| 色综合天天综合中文网| 亚洲一区二区三区国产精品 | 免费毛片视频| 国产主播在线观看| 囯产av无码片毛片一级| 国产成人精品男人的天堂| 中国黄色一级视频| 日韩欧美国产成人| 欧美性猛交一区二区三区| 国产精品亚欧美一区二区 | 在线观看无码a∨| 国产黄色片在线看| 无码日韩人妻精品久久蜜桃| 免费人成又黄又爽的视频网站| 国产精品丝袜视频| 久久久久人妻一区精品色奶水| 日本人妻丰满熟妇区| 成人在线天堂| 久久综合国产乱子免费| 国产在线小视频| 白浆免费视频国产精品视频| 91亚洲国产视频| 国产乱视频网站| 麻豆国产在线不卡一区二区| 国产乱人伦偷精品视频AAA| 亚洲va在线∨a天堂va欧美va| 无码丝袜人妻| 亚洲人成色在线观看| 欧美伦理一区| 国产精品亚洲专区一区| 九九热在线视频| 亚洲天堂福利视频| 亚洲最大福利视频网| 久久成人国产精品免费软件| 亚洲精品自拍区在线观看| 欧洲av毛片| 亚洲人成影院午夜网站|