VBA中的变量区分对象变量与非对象变量,采用不同的赋值方式。同时,对于对象变量,又区分内置对象与非内置对象,在语法上有所区别。对于非内置对象的引用,可以使用前期绑定或后期绑定的方式。
1 非对象变量的声明和赋值
对于非对象变量,一般使用关键字let来赋值:
Sub 非对象变量赋值() Dim i As Integer Let i = 23 'Let可省略 i = 45 '省略Let形式的非对象变量赋值 Debug.Print i End Sub
2 内置对象的声明与赋值
Sub 内置对象的声明和赋值() Dim wb As Workbook Dim sht As Workbook Dim rng As Range Dim cht As Chart Dim shp As Shape Dim commt As Comment Dim commb As CommandBar Dim commbb As CommandBarButton Set wb1 = Workbooks("excelVBA.xlsm") Set wb2 = Workbooks(1) Set wb3 = ActiveWorkbook Set wb4 = ThisWorkbook Set sht1 = Worksheets("sheet2") Set sht2 = Worksheets(1) Set sht3 = Workbooks(1).ActiveSheet Set sht4 = ActiveSheet Set rng1 = Range("A1:F10") Set rng2 = Range("A1").Resize(3, 3) Set rng3 = ActiveSheet.UsedRange Set rng4 = Range("A1").CurrentRegion Set rng5 = Cells Set rng6 = Cells(8, 8) Set rng7 = Selection Set shp1 = Sheet1.Shapes(1) Set commt1 = Cells(1).Comment Set commt2 = ActiveCell.Comment Set commt3 = Sheet5.Comments Set commt4 = ActiveSheet.Comments rng6.Value = 11 End Sub
3 非内置对象的前期绑定和new声明
3.1 引入库(VBE→工具→引用)
3.2 new声明
Sub 非内置对象的前期绑定和new声明() Dim dic As New Dictionary dic("红") = "red" dic("blue") = 2 Debug.Print dic("红") Debug.Print dic("blue") End Sub 立即窗口中输出: red 2
前期绑定的优势是在引入库后写代码时编辑器有代码提示,弊端是当库未引入时时,会产生如下的编译错误:
需要手动引入包含Dictionary对象的Microsoft Scripting Runtime(scrrun.dll)库。
4 非内置对象的后期绑定和CreateObject()赋值
后期绑定在编辑器编写代码时没有代码提示,但不需手动引入库。
Sub 把数据装入数组与字典() Application.ScreenUpdating = False Dim arr0, arr, nRow arr0 = Range("A1:B7") 'Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") Sheets("把数据装入数组与字典").Activate Sheets("把数据装入数组与字典").Select '把A1到B7的区域的数据,装入数组 arr = Range("a1").CurrentRegion '把A列的数据装入字典的key '把B列的数据装入字典的item nRow = Range("a" & Rows.Count).End(3).Row For i = 1 To nRow dic(Cells(i, 1)) = Cells(i, 2) Next i '把数组写到D E列 Range("d1").Resize(UBound(arr), UBound(arr, 2)) = arr '把字典的key与item分别写到H I列 Range("h1").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.Keys) Range("I1").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.items) Application.ScreenUpdating = True Dim k As Integer k = 0 For Each dd In dic k = k + 1 Cells(k, 15) = dic(dd) Next End Sub