2012年8月13日 星期一

Excel VBA 使用函數範例參考之四

1)創建Excel對象
  Excel對象模型包括了128個不同的對象,從矩形、文字方塊等簡單的對
  象到透視表,圖表等複雜的對象。下面簡單介紹一下其中最重要,也是用
  得最多的五個對象。
  (1)Application對象
  Application對象處於Excel對象層次結構的頂層,表示 Excel自身的
  運行環境。
  (2)Workbook對象
  Workbook對象直接地處於Application對象的下層,表示一個Excel工
  作薄文件。
  (3)Worksheet對象
  Worksheet對象包含於Workbook對象,表示一個Excel工作表。
  (4)Range對象
  Range對象包含於Worksheet對象,表示 Excel工作表中的一個或多個
  單元格。
  (5)Cells對象
  Cells對象包含於Worksheet對象,表示Excel工作表中的一個單元格。
  如果要啓動一個Excel,使用Workbook和Worksheet對象,下面的代碼
  啓動了Excel並創建了一個新的包含一個工作表的工作薄:
  Dim zsbexcel As Excel.Application
  Set zsbexcel = New Excel.Application
  zsbexcel.Visible = True
  如要Excel不可見,可使zsbexcel.Visible = False
  zsbexcel.SheetsInNewWorkbook = 1
  Set zsbworkbook = zsbexcel.Workbooks.Add
  2)設置單元格和區域值
  要設置一張工作表中每個單元格的值,可以使用Worksheet對象的
  Range屬性或Cells屬性。
  With zsbexcel.ActiveSheet
  .Cells(1, 2).value = "100"
  .Cells(2, 2).value = "200"
  .Cells(3, 2).value = "=SUM(B1:B2)"
  .Range("A3:A9") = "中國人民解放軍"
  End With
  要設置單元格或區域的字體、邊框,可以利用Range對象或Cells對象
  的Borders屬性和Font屬性:
  With objexcel.ActiveSheet.Range("A2:K9").Borders '邊框設置
  .Line = xlBorderLine
  .Weight = xlThin
  .ColorIndex = 1
  End With
  With objexcel.ActiveSheet.Range("A3:K9").Font'字體設置
  .Size = 14
  .Bold = True
  .Italic = True
  .ColorIndex = 3
  End With
  通過對Excel單元格和區域值的各種設置的深入瞭解,可以創建各種複
  雜、美觀、滿足需要的、具有自己特點的報表。
  3)預覽及列印
  生成所需要的工作表後,就可以對EXCEL發出預覽、列印指令了。
  zsbexcel.ActiveSheet.PageSetup.Orientation = xlPortrait '
  設置列印方向
  zsbexcel.ActiveSheet.PageSetup.PaperSize = xlPaperA4'
  設置列印紙的打下
  zsbexcel.Caption = "列印預覽" '設置預覽視窗的
  標題
  zsbexcel.ActiveSheet.PrintPreview'列印預覽
  zsbexcel.ActiveSheet.PrintOut'列印輸出
  通過列印方向、列印紙張大小的設置,不斷進行預覽,直到滿意爲止,
  最終進行列印輸出。
  爲了在退出應用程式後EXCEL不提示用戶是否保存已修改的檔,需使
  用如下語句:
  zsbexcel.DisplayAlerts = False
  zsbexcel.Quit '退出EXCEL
  zsbexcel.DisplayAlerts = True
  如此設計的報表列印是通過 EXCEL程式來後台實現的。對於使用者來
  說,根本看不到具體過程,只看到一張張漂亮的報表輕易地被列印出來了。
  4)具體實例
  下麵給出一個具體實例,它在window98、Visual Basic 6.0、
  Microsoft Office97的環境下調試通過。
  在VB中啓動一個新的Standard EXE工程,在“工程”菜單的“引用”
  選項下引用Excel Object Library;然後在Form中添加一個命令按鈕
  cmdExcel;最後在窗體中輸入如下代碼:
  Dim zsbexcel As Excel.Application
  Private Sub cmdExcel_Click()
  Set zsbexcel = New Excel.Application
  zsbexcel.Visible = True
  zsbexcel.SheetsInNewWorkbook = 1
  Set zsbworkbook = zsbexcel.Workbooks.Add
  With zsbexcel.ActiveSheet.Range("A2:C9").Borders'邊框設置
  .Line = xlBorderLine
  .Weight = xlThin
  .ColorIndex = 1
  End With
  With zsbexcel.ActiveSheet.Range("A3:C9").Font'字體設置
  .Size = 14
  .Bold = True
  .Italic = True
  .ColorIndex = 3
  End With
  zsbexcel.ActiveSheet.Rows.HorizontalAlignment =
  xlVAlignCenter'水準居中
  zsbexcel.ActiveSheet.Rows.VerticalAlignment =
  xlVAlignCenter'垂直居中
  With zsbexcel.ActiveSheet
  .Cells(1, 2).value = "100"
  .Cells(2, 2).value = "200"
  .Cells(3, 2).value = "=SUM(B1:B2)"
  .Cells(1, 3).value = "中國人民解放軍"
  .Range("A3:A9") = "50"
  End With
  zsbexcel.ActiveSheet.PageSetup.Orientation = xlPortrait '
  xlLandscape
  zsbexcel.ActiveSheet.PageSetup.PaperSize = xlPaperA4
  zsbexcel.ActiveSheet.PrintOut
  zsbexcel.DisplayAlerts = False
  zsbexcel.Quit
  zsbexcel.DisplayAlerts = True
  Set zsbexcel = Nothing
  提高EXCEL中VBA的效率
  方法1:盡量使用VBA原有的屬性、方法和Worksheet函數
  由於Excel對象多達百多個,對象的屬性、方法、事件多不勝數,對于初學者來
  說可能對它們不全部瞭解,這就産生了編程者經常編寫與Excel對象的屬性、方法相
  同功能的VBA代碼段,而這些代碼段的運行效率顯然與Excel對象的屬性、方法完成
  任務的速度相差甚大。例如用Range的屬性CurrentRegion來返回 Range 對象,該對
  象代表當前區。(當前區指以任意空白行及空白列的組合爲邊界的區域)。同樣功能
  的VBA代碼需數十行。因此編程前應盡可能多地瞭解Excel對象的屬性、方法。
  充分利用Worksheet函數是提高程式運行速度的極度有效的方法。如求平均工資
  的例子:For Each c In Worksheet(1).Range(″A1:A1000″)
  Totalvalue = Totalvalue + c.value
  Next
  Averagevalue = Totalvalue / Worksheet(1).Range(″
  A1:A1000″).Rows.Count
  而下面代碼程式比上面例子快得多:
  Averagevalue="/blog/Application.WorksheetFunction.Average(Worksheets
  (1).Range(″A1:A1000″))
  其它函數如Count,Counta,Countif,Match,Lookup等等,都能代替相同功能的
  VBA程式代碼,提高程式的運行速度。
  方法2:盡量減少使用對象引用,尤其在循環中
  每一個Excel對象的屬性、方法的調用都需要通過OLE介面的一個或多個調用,
  這些OLE調用都是需要時間的,減少使用對象引用能加快VBA代碼的運行。例如
  1.使用With語句。
  Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
  Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Font
  ...
  則以下語句比上面的快
  With Workbooks(1).Sheets(1).Range(″A1:A1000″).Font
  .Name = ″Pay″
  .Font = ″Bold″
  ...
  End With
  2.使用對象變量。
  如果你發現一個對象引用被多次使用,則你可以將此對象用Set 設置爲對象變
  量,以減少對對象的訪問。如:
  Workbooks(1).Sheets(1).Range(″A1″).value = 100
  Workbooks(1).Sheets(1).Range(″A2″).value = 200
  則以下代碼比上面的要快:
  Set MySheet = Workbooks(1).Sheets(1)
  MySheet.Range(″A1″).value = 100
  MySheet.Range(″A2″).value = 200
  3.在循環中要盡量減少對象的訪問。
  For k = 1 To 1000
  Sheets(″Sheet1″).Select
  Cells(k,1).value = Cells(1,1).value
  Next k
  則以下代碼比上面的要快:
  Set Thevalue = Cells(1,1).value
  Sheets(″Sheet1″).Select
  For k = 1 To 1000
  Cells(k,1).value = Thevalue
  Next k
  方法3:減少對象的啟動和選擇
  如果你的通過錄制宏來學習VBA的,則你的VBA程式裏一定充滿了對象的啟動和選
  擇,例如Workbooks(XXX).Activate、Sheets(XXX).Select、Range(XXX).Select等
  ,但事實上大多數情況下這些操作不是必需的。例如
  Sheets(″Sheet3″).Select
  Range(″A1″).value = 100
  Range(″A2″).value = 200
  可改爲:
  With Sheets(″Sheet3″)
  .Range(″A1″).value = 100
  .Range(″A2″).value = 200
  End With
  方法4:關閉螢幕更新
  如果你的VBA程式前面三條做得比較差,則關閉螢幕更新是提高VBA程式運行速度
  的最有效的方法,縮短運行時間2/3左右。關閉螢幕更新的方法:
  Application.ScreenUpdate = False
  請不要忘記VBA程式運行結束時再將該值設回來:
  Application.ScreenUpdate = True

 相關閱讀...

Excel VBA 使用函數範例參考之一
Excel VBA 使用函數範例參考之二
Excel VBA 使用函數範例參考之三
Excel VBA 使用函數範例參考之五
Excel VBA 使用函數範例參考之六

沒有留言:

張貼留言