用VB.NET(Visual Basic 2010)封裝EXCEL VBA為DLL_COM組件(二)


——將EXCEL VBA代碼移植到VB.NET

.NET是微軟公司在2002年推出的全新編程框架,支持多種語言應用程序開發。使用Visual Basic在Microsoft .NET Framework上編程,這就是Visual Basic.NET,簡稱VB.NET。

VB.NET是Microsoft Visual Studio .NET組件中的重要組成部分,是VB6.0的后續版本,VB.NET仍使用VB的基本語法,二者幾乎在90%以上保持相似或相同,雖然Excel VBA代碼不能完全像移植到VB6.0那樣直接移植到Visual Basic 2010,但大多數情況下,移植還是相當簡單的。

一、Excel程序的對象模型。

在 Excel 中,Excel 程序對象(Application)是頂級的對象,往下依次是工作簿對象(Workbook)、工作表對象(Worksheet)和單元格對象(Range)。只有當打開了 Excel 程序(Appliation 對象),才能創建或打開工作簿(Workbook 對象),才能選中某個工作表(Worksheet 對象),以及對某個單元格區域(Range 對象)進行操作。

眾多個工作簿,若干張工作表,數不清的單元格,要在“Book1”工作簿中的“Sheet1”工作表中的“A1”單元格內錄入內容“A1”,必須像敘述家庭住址一樣把各個需引用的對象關系從大到小的順序敘述清楚。如下代碼:

1 Sub Rng2()
2  Application.Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1").Value = "A1"
3 End Sub

Application對象代表Excel程序,屬於最頂層對象,通常可以省略,上述代碼亦可修改為:

1 Sub Rng3()
2  Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1").Value = "A1"
3 End Sub

在 Excel VBA 中,引用或操作對象時允許省略其上級對象,但並非表示該對象的上一級的對象不存在。

二、Visual Basic.NET編寫處理Excel表格代碼(即代碼移植)

1、聲明對象變量時需要前置“Excel”,例如:

Dim VbApp As Excel.Application '定義Excel對象

Dim VbBook As Excel.Workbook '定義工作簿對象

Dim VbSht As Excel.Worksheet '定義工作表對象

Dim VbRng As Excel.Range '定義單元格對象

2、不能直接使用“Application”(即Excel.exe進程),而需要一個變量調用。

首先在模塊中聲明一個變量VbApp:

Public VbApp As Excel.Application '定義Excel對象

然后對變量VbApp賦值:

(1)、引用Excel.exe進程

通在Excel中引用DLL動態鏈接庫Excel程序都是已經打開了的,即通過任務管理器查看進程可以看到Excel.exe進程,我們需要處理已打開Excel文檔,必須引用當前Excel.exe進程。代碼如下:

VbApp = GetObject(, "Excel.Application") '引用當前Excel.exe進程,確保已打開Excel程序否則報錯

(2)、創建Excel.exe進程

通過下列語句就可以創建新的Excel.exe進程了,Visual Basic .Net可以通過對此進程的處理來操作Excel表格:

VbApp = New Excel.Application '創建新的Excel.exe進程

在后續的應用中可調用變量VbApp來代替“Application”,如:

當執行完創建一個新的Excel.exe進程語句后,通過任務管理器查看進程就發現多出Excel.exe進程,當此時Excel程序的運行界面並沒有顯示,在此語句后加入以下代碼,Excel的運行界面就顯示出來了:

VbApp.Visible = True '顯示Excel程序的運行界面

Excel運行界面雖然顯示,但其中並沒有表格,下列代碼是在Excel程序中創建一個新表格:

VbApp.Workbooks.Add

3、所有對象必須顯示聲明,表示它是Excel的對象。

在 Excel VBA 中,引用或操作對象時允許省略其上級對象,但把代碼移植到VB.NET中,我們必須使用完整的表達式精確表示某個對象。例如:

Visual Basic .Net處理Excel表格是通過引用(或創建)的Excel.exe進程來實現的。引用(或創建)的Excel.exe進程對應上述代碼中的VbApp,即變量VbApp代表Excel 程序對象(Application)。下面代碼給工作簿Book1.xls的第1張工作表的“A1”單元格賦值“A1”:

VbApp. BookExcel.Worksheets("Book1.xls").Range("A1").Value = "A1"

當編輯完Excel表格后,可以通過下列語句就關閉Excel表格,並銷毀Excel.exe進程:

VbApp. BookExcel.Close ( )'關閉Excel表格

VbApp.Quit ( )'銷毀Excel.exe進程

VbApp = Nothing '釋放對象變量

可見,我們在Excel編寫VBA代碼時嚴格使用完整的表達式精確表示對象,移植代碼時使用變量VbApp來調用“Application”,即可。

三、VBA與VB.NET語法變通

隨着VB.NET的引入,VB迎來了自發布以來最大的變革,整個運行庫模型變成了一個新的公共語言運行庫(CLR)環境,語言也從基於對象變成面向對象,對熟悉Excel VBA的程序員移植封裝代碼帶來了困難。不僅需要掌握VB.NET語法,還需要理解並運用VB.NET提出的新功能、概念和觀點。當然也需要掌握.Net框架,理解CLR(Common Language Runtime,通用語言進行時)。在移植代碼時要特別以下語法變化。

1、數據類型

用於存儲任意類型數據的數據類型Variant被Object替代;用於存儲大浮點數的數據類型Currency被Decimal替代,並支持更高數度;在VBA中可以在聲明字符 串時指定其長度,而VB.NET不支持固定長度字符串。

2、變量賦值

在VBA中不能同時聲明和初始化變量,而VB.NET則支持聲明的同時初始化變量。例如:

Dim StrName As String

StrName = "VBA封裝"

在VB.NET中可以二合一:

Dim StrName As String = "VBA封裝"

在VBA中對對象變量賦值必須使用Set語句,而在VB.NET中已取消Set語句,也就是說對象變量的賦值與普通變量一樣。如:

ExcelVBA初始化對象變量: Set Rng=Nothing 

而在VB.NET中不需要Set語句: Rng=Nothing 

3、數組

VBA數組下界可以自定義,如以下語句聲明了下界為1、上界為10共10個元素的數組Arr:

Dim Arr(1 To 10) As String

而在VB.NET中,數組下界總是從0開始,若使用Dim Arr(1 To 10) As String聲明數組將會報錯。

在VBA中,可以指定數組的長度,如:

Dim Arr(2) As Integer

這里的Arr數組長度是固定的,不能用ReDim語句改變長度。VB.NET不支持固定長度數組,所以ReDim總是有效。

在VBA中,ReDim用於初始化動態數組,而在VB.NET中,ReDim關鍵字的使用略有變化,第一個變化是:必須先定義該數組實例,不能用ReDim語句聲明數組;第二個變化是:ReDim只能用於改變數組長度,不能改變數組的維數。在VB.NET中動態數組聲明時特別注意,如:

Dim Arr() As Integer '聲明一維動態數組

上面的聲明只能創建一個一維動態數組,若要聲明一個二維動態數組,上述聲明應包含一個逗號,如:

Dim Arr(,) As Integer '聲明二維動態數組

4、變量作用域

在VBA中,變量作用域有:過程級、模塊級和全局。在VB.NET中新增了塊作用域,也稱為結構作用域。

結構是由兩條語句而不是一條語句組成的編碼結構,如If…Then決策結構、For…Next循環結構。在VB.NET中,如果變量是在結構中聲明的,則其作用域限定在結構內,該變量在遇到相應的Dim語句后才被創建,在結構結束處被銷毀。如:

1 If Flag = True Then
2 
3     Dim IntNum As Integer
4 
5 End If

5、循環語句

VB.NET增加了Continue關鍵字,使用Continue For語句,在For…Next循環結構中能夠在到達Next語句之前進入下一次For…Next循環;當然也可以使用Continue Do語句,在Do…Loop循環結構中能夠在到達Loop語句之前進入下一次Do…Loop循環。

以上語法變化是必必須掌握的,當然我們還需要逐漸掌握一些新舊語法替代,如:雖VB.NET還支持數據類型轉換函數,但在VB.NET應力爭避免使用,處理數據類型轉換的更通用方法是使用System.Convert類;Excel VBA是通過On Error語句來處理錯誤,這種處理方法在VB.NET中仍得到支持,但已被摒棄,強烈建議使用Try…Catch…Finally結構來處理異常(錯誤);VB.NET仍支持老式MsgBox()函數,但不建議使用,而是改用MessageBox.Show()函數。

以上介紹並不能使讀者了解VB.NET語法的方方面面,如果想進一步了解必須閱讀一些專業書籍。如:

《Visual Basic 2010入門經典(中文版)》——[美] James Foxall 著、梅興文 譯、人民郵電出版社。

《Visual Basic 2010 & .NET 4 高級編程(第6版)》——(美) Billy Hollis 等著、彭琿 余科洋 譯、清華大學出版社。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM