1.Union的用法:
组合
Sub SeveralRows() Worksheets("Sheet1").Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5)) myUnion.Font.Bold = True End Sub
2.Array函数:
Sub FormatSheets() Sheets(Array("Sheet2", "Sheet3", "Sheet5")).Select Range("A1:H1").Select Selection.Borders(xlBottom).LineStyle = xlDouble End Sub
3.单元格错误值列表:
常量 | 错误号 | 单元格错误值 |
---|---|---|
xlErrDiv0 | 2007 | #DIV/0! |
xlErrNA | 2042 | #N/A |
xlErrName | 2029 | #NAME? |
xlErrNull | 2000 | #NULL! |
xlErrNum | 2036 | #NUM! |
xlErrRef | 2023 | #REF! |
xlErrValue | 2015 | #VALUE! |
4.
由命名冲突所引起的典型错误包括有仿真两可的名称、重复声明、未声明标识符,以及找不到过程。在模块开头加上 Option Explicit 语句,可以强迫在变量被使用前对变量做明确的声明,如此可以避免一些可能的命名冲突以及和标识符有关的错误。
5.调用具有多个参数的 Sub 过程
使用 Call 语句所以需要利用括号将参数括起来。
Sub Main() HouseCalc 99800, 43100 Call HouseCalc(380950, 49500) //如果换成 Call HouseCalc 380950,49500, 则报错 End Sub Sub HouseCalc(price As Single, wage As Single) If 2.5 * wage <= 0.8 * price Then MsgBox "You cannot afford this house." Else MsgBox "This house is affordable." End If End Sub
6.在调用 Function 过程时使用括号
Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3")
7.传递命名参数
Sub 或 Function 过程中的语句可以利用命名参数来传递值给被调用的过程。可以将命名参数以任何顺串行出。命名参数的组成是由参数名称紧接着冒号(:=)以及等号,然后指定一个值给参数。
answer3 = MsgBox(Title:="Question 3", _
Prompt:="Are you happy with your salary?", Buttons:=4)
8.赋值对象变量给对象
使用 Set 语句可以赋值一个对象给对象变量。可以赋值对象表达式或是 Nothing 。例如,下列的对象变量赋值是有效的:
Set MyObject = YourObject ' 赋值对象引用。
Set MyObject = Nothing ' 中断关联。
可以同时使用 New 关键字和 Set 语句来声明对象变量,并赋值一对象给它。例如:
Set MyObject = New Object ' 创建和赋值
设置一个对象变量等于 Nothing,会中断此对象变量与任何特定对象的关联,如此可预防因意外的改变变量而更改对象。在关闭关联对象后,对象变量总是设置为 Nothing,所以可以检测对象变量是否指到有效的对象。例如:
If Not MyObject Is Nothing Then
' 变量引用有效的对象。
. . .
End If
当然,该检测不能绝对的决定用户是否已关闭包含对象变量所引用对象的应用程序。
9.引用对象的当前实例
Me 关键字可用来引用对象的当前实例,而此为代码正在执行的对象。所有与当前对象关联的过程都可以通过 Me 来引用。使用 Me 来传递关于对象的当前实例信息到其它模块中的过程显得特别有用。例如,假设在模块中有以下这些过程:
'*********
' 类名:clsPerson
'*********
Option Explicit
Private name As String
Private age As Integer
Public Property Let setName(n As String)
name = n
End Property
Public Property Let setAge(y As Integer)
age = y
End Property
Public Property Get getName()
getName = name
End Property
Public Property Get getAge()
getAge = age
End Property
Public Sub prints()
Debug.Print Me.getAge & "," & Me.getName
End Sub
10.创建递归过程
Function Factorial (N)
If N <= 1 Then ' 到达递归调用的末尾。
Factorial = 1
Else ' 如果 N > 0 再调用 Factorial 。
Factorial = Factorial(N - 1) * N
End If
End Function
11.声明数组
数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为 1,则数组索引从零开始。
a,固定大小的数组
ReDim MyIntegerArray(10) As Integer
b,动态数组
Dim sngArray() As Single
注意 可以在过程中使用 ReDim 语句来做隐含性的数组声明。当使用 ReDim 语句时要小心点,不要拼错数组的名称。否则即使在模块中有包含 Option Explicit 语句,仍然会因此而生成第二个数组。
对于过程中的数组范围,可以使用 ReDim 语句去改变它的维数,去定义元素的数目以及每个维数的底层绑定。每当需要时,可以使用 ReDim 语句去更改动态数组。然而当做这个动作时,数组中存在的值会丢失。若要保存数组中原先的值,则可以使用 ReDim Preserve 语句来扩充数组。例如,下列的语句将 varArray
数组扩充了10 个元素,而原本数组中的当前值并没有消失掉。
ReDim Preserve varArray(UBound(varArray) + 10)
12.传递参数
所有的参数传递给过程都是按地址的,默认是以Byref传递
可以按值的来传递参数,只要在过程的声明中包含 ByVal 关键字,使用按值的方法时会将原来的变量复制一份,当做参数传递过去。改变过程内部的参数时将不会影响到原来的变量。
Sub Factorial1(ByVal MyVar As Integer) ' Function declaration.
MyVar = 12
End Sub
Sub Factorial2(MyVar As Integer) ' Function declaration.
MyVar = 12
End Sub
Sub Factorial3(ByRef MyVar As Integer) ' Function declaration.
MyVar = 12
End Sub
Sub test()
Dim aa As Integer
aa = 5
Call Factorial1(aa)
Debug.Print aa
aa = 5
Call Factorial2(aa)
Debug.Print aa
aa = 5
Call Factorial3(aa)
Debug.Print aa
End Sub