Excel中VBA编程学习笔记(三)

 

12、使用InputBox函数进行输入

语法如下:

InputBox(prompt [,title] [,default] [,xpos] [,ypos] [,helpfile,context])

参数说明:

  1. prompt为提示内容,必选;
  2. title对话框标题;
  3. default为对话框中缺省的文字内容;
  4. xpos和ypos表示对话框距离屏幕左上角的距离,缺省则居中.

使用示例:

Private Sub b()

   Dim a As String

   a = InputBox("请输入姓名:", "输入对话框", "张三")

   MsgBox (a)

End Sub

注:如果用户点击了“取消”按钮,则返回空串(“”).

13、循环及判断语句

使用exit for;exit loop;exit sub;exit function;exit select等退出对应的循环结构

【例一】 if  then

Private Sub test()

   If Sheet1.Cells(1, 1).Value = "1" Then

    Application.Quit

   End If

End Sub

 

【例二】if else then

Private Sub test()

   Dim a As Integer

   a = MsgBox("华工计算机", 1 + 64 + 0, "对话框")

   If a = vbOK Then

    MsgBox ("点击了确定")

   Else

     MsgBox ("点击了取消")

   End If

 

         Dim a%

    score = 76

    Debug.Print IIf(score > 60, IIf(score >= 70, IIf(score >= 80, IIf(score >= 90, "优秀", "良好"), "中等"), "及格"), "差")

End Sub

注:IIF跟公示编辑栏输入的IF语句一样可以直接嵌套

【例三】select case

Private Sub test()

   Dim num As Integer

   Dim res As String

   res = InputBox("请输入分数")

   If res <> "" Then '不是点击取消按钮

     num = CInt(res) '强制转换为整型

     Select Case (num)

     Case 0 To 59

        MsgBox ("不及格")

     Case Is < 85

         MsgBox ("良好")

     Case Is < 98

         MsgBox ("优秀")

     Case 98, 99, 100

         MsgBox ("特别优秀")

     Case Else  ‘没有匹配上面所有情况时候执行,可以省略

        MsgBox ("输入分数不合法")

     End Select

   End If

End Sub

注意:select case中使用的is关键字与is比较运算符不同.

【例四】whle wend

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   i = 60

   While i > 12

    sum = sum + i

    i = i - 1

   Wend

   MsgBox (sum)

End Sub

【例五】do loop

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   i = 60

   Do While i >= 12

    sum = sum + i

    i = i - 1

   Loop

   MsgBox (sum)

  

   Do

     i = i + 2

   Loop While i < 100

   MsgBox (i)

  

   Do Until i <= 0

    i = i - 10

   Loop

   MsgBox (i)

  

   i = 2

   Do

    i = i * 2

   Loop Until i > 111

   MsgBox (i)

End Sub

 

do loop的四种循环结构

do while … loop循环

先测试条件,如果成立则执行循环体

do … loop while循环

先执行一遍循环体,则测试循环条件,如果条件成立,则执行循环体

do until … while循环

先测试条件,如果不成立则执行循环体

do … loop until循环

先执行一遍循环体,则测试循环条件,如果条件不成立,则执行循环体

 

【例六】for next

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   For i = 1 To 12

    sum = sum + i

   Next

   MsgBox (sum)

 

sum = 0

   For i = 1 To 12 Step 2

    sum = sum + i

   Next

   MsgBox (sum)

End Sub

 

【例七】for each next

Private Sub test()

Sheet1.Range("M1:M86").Select   '设置选中部分

  Dim r

  Dim t As Long

  For Each r In Selection   ‘求所有选中部分数值和

    If IsNumeric(r.Value) Then

        t = t + r.Value

    End If

  Next

  MsgBox (t)

End Sub

 

【例8】使用GOTO语句

Sub test()

    Dim value$, k%

line:

    If k > 3 Then Exit Sub

    value = InputBox("请输入用户名")

    If value <> "admin" Then

        k = k + 1

        GoTo line

    Else

        MsgBox ("输入正确")

    End If

End Sub

注:上例中的“line”可以换成任意数字或者字符串

【例9】使用GOSUB语句

Sub test()

    Dim value$, k%, counter%

    counter = 1

    Do Until counter = 10

        k = Application.WorksheetFunction.RandBetween(1, 100)

        If k < 60 Or k > 95 Then GoSub line

        ActiveSheet.Range("A" & counter).value = k

        counter = counter + 1

    Loop

    Exit Sub    '此句不可少

line:

    ActiveSheet.Range("A" & counter).Interior.ColorIndex = 3

    Return

End Sub

注:红色背景部分不可少。GOTO与GOSUB不同的是GOSUB可以使用RETURN。

 

14、错误处理

on error语法:

On Error GoTo line

On Error Resume Next

On Error GoTo 0

On Error 语句的语法可以具有以下任何一种形式:

              语句                                                             描述

On Error GoTo line              启动错误处理程序,且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到 line,激活错误处理程序。指定的 line 必须在一个过程中,这个过程与 On Error 语句相同; 否则会发生编译时间错误。

On Error Resume Next        说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用 On Error GoTo。

On Error GoTo 0                 禁止当前过程中任何已启动的错误处理程序。

 

说明

如果不使用 On Error 语句,则任何运行时错误都是致命的;也就是说,结果会导致显示错误信息并中止运行。

 一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的。错误处理程序每次将控件返回调用过程时,该过程就成为当前过程。在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运行。

 注意 一个错误处理程序不是 Sub 过程或 Function 过程。它是一段用行标签或行号标记的代码

 

 

Resume语句:

在错误处理程序结束后,恢复原有的运行。

语法

Resume [0]

Resume Next

Resume line

Resume 语句的语法可以具有以下任何一种形式:

语句                                                             描述

Resume                        如果错误和错误处理程序出现在同一个过程中,则从产生错误的语句恢复运行。如果错误出现在被调用的过程中,则从最近一次调用包含错误处理程序的过程的语句处恢复运行。

Resume Next                如果错误和错误处理程序出现在同一个程序中,则从紧随产生错误的语句的下个语句恢复运行。如果错误发生在被调用的过程中,则对最后一次调用包含错误处理程序的过程的语句(或 On Error Resume Next 语句),从紧随该语句之后的语句处恢复运行。

Resume line                在必要的 line 参数指定的 line 处恢复运行。line 参数是行标签或行号,必须和错误处理程序在同一个过程中。

 

说明

在错误处理程序之外的任何地方使用 Resume 语句都会导致错误发生。

 

15、函数(function)定义

Function过程的功能较Sub过程的应用范围稍小,Function过程仅仅用于返回一个值或者多个数的组合即数组,而Sub过程可以返回值,还可以对引用的对象进行修改。例如,引用单元格A1的值后对单元格A1设置新的格式,或者修改工作表名称等。Function可以获取工作表名称,但无法修改工作表的名称。

Function过程可以不使用参数,类似于工作表函数Rand和Now等,但绝大部分函数是需要一个参数或者多个参数的,最多时可达255个参数。

语法:

[Public | Private | Friend] [Static] Function name [(arglist)] [As type]

 

说明:

Public        可选的。表示所有模块的所有其他过程都可以访问这个 Function 过程。如果是在包含 Option Private 的模块中使用,则这个过程在该工程外是不可使用的

Private     可选的。表示只有包含其声明的模块的其他过程可以访问该 Function 过程

Friend       可选的。只能在类模块中使用。表示该 Function 过程在整个过程中都是可见的,但对于对象实例的控制者是不可见的

Static        可选的。表示在调用之间将保留 Function 过程的局部变量值。Static 属性对在该 Function 外声明的变量不会产生影响,即使过程中也使用了这些变量

name        必需的。Function 的名称,遵循标准的变量命名约定

arglist       可选的。代表在调用时要传递给 Function 过程的参数变量列表。多个变量应用逗号隔开

type 可选的。Function 过程的返回值的数据类型,可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(除定长)、Object、Variant或任何用户定义类型.

注:可以将自定义的函数保存为加载宏,這样所有工作簿均可用。

【例1】参数不定

如果参数不定,则不能指定参数类型;如果有不定参数,则不定参数一定要写在最后。

Public Function MyPlus(ParamArray num())

    m = 0

    For Each value In num

       m = m + value

    Next

    MyPlus = m

End Function

调用:=MyPlus(12,22,32)

【例2】

Public Function MyJoin(ParamArray num())

    result = ""

    For Each va In num

        For Each v In va

            result = result & v

        Next

    Next

    MyJoin = result

End Function

16、sub过程

语法:

[Private | Public | Friend] [Static] Sub name [(arglist)]

其中“(arglist)”即表示它支持可选的参数,可以不用参数,也可以使用参数;可以使用一个参数,也可以使用多个参数。其中参数(arglist)的具体语法如下:

 [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

Optional   可选的。表示参数不是必需的关键字。如果使用了该选项,则 arglist 中的后续参数都必须是可选的,而且必须都使用 Optional 关键字声明。如果使用了 ParamArray,则任何参数都不能使用 Optional

ByVal        可选的。表示该参数按值传递

ByRef        可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的默认选项

ParamArray     可选的。只用于 arglist 的最后一个参数,指明最后这个参数是一个 Variant 元素的 Optional 数组。使用 ParamArray 关键字可以提供任意数目的参数。ParamArray 关键字不能与 ByVal、ByRef或 Optional 一起使用

varname  必需的。代表参数的变量的名称,遵循标准的变量命名约定

type 可选的。传递给该过程的参数的数据类型,如果没有选择参数 Optional,则可以指定用户定义类型,或对象类型

defaultvalue     可选的。任何常数或常数表达式。只对 Optional 参数合法。如果类型为 Object,则显式的默认值只能是 Nothing.

【例一】调用多个参数的SUB过程

Sub main()

   HouseCalc 99800, 43100 '直接调用法

   Call HouseCalc(380950, 49500) 'Call调用法

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

【例二】调用function过程

Sub Main()

  temp = InputBox("请输入华氏温度")

  MsgBox "温度是 " & Celsius(temp) & " 摄氏度"

End Sub

 

Function Celsius(fDegrees)

   Celsius = (fDegrees - 32) * 5 / 9

End Function

【例三】在function过程中使用可选参数

Sub main()

Dim ReturnValue

 

ReturnValue = ReturnTwice()    ' 返回 Null。

ReturnValue = ReturnTwice(2)    ' 返回 4。

End Sub

 

 

Function ReturnTwice(Optional A)

    If IsMissing(A) Then

        ' 如果参数丢失,则返回 Null。

        ReturnTwice = Null

    Else

        ' 如果参数出现,则返回两倍的值。

        ReturnTwice = A * 2

 

    End If

End Function

注:IsMissing函数返回布尔值,指出一个可选的Variant参数是否已经传给过程.

【例四】在function中使用不定参数

Sub main()

Call sum(2, 3, 4)

End Sub

 

Function sum(ParamArray a()) As Single

 

Dim i As Integer

For i = 0 To UBound(a())

Debug.Print a(i)

Next i

End Function

 

FUNCTIONSUB的比较

调用SUB过程可以使用CALL,也可以省略。使用CALL调用SUB过程时候,如果SUB过程有参数则必须使用括号把参数括起来;如果省略CALL,对于带参数的SUB过程不应该使用括号。

对于FUNCTION,如果要使用返回值,应该使用括号,否则不需要括号。

【例】

Sub main()

    fun1 "张三"     '正确写法

    fun1 ("张三")   '正确写法

    Call fun1("张三")   '正确写法

    'call fun1 "张三"   '错误写法

   

    fun4 ("李四")   '正确写法

    fun4 "李四" '正确写法

    'result=fun4 "李四"  '错误写法

    result = fun4("李四") '正确写法

    Debug.Print fun5(1, 2)  '正确写法

    'fun5(1,2)   '错误写法

    fun5 1, 2   '正确写法

    Debug.Print fun5; 1, 2 '错误写法

   

End Sub

 

Sub fun1(name As String)

    Debug.Print name

End Sub

 

Sub fun2(name As String)

    Debug.Print "my Name is" & name

End Sub

 

Function fun3(name As String)

    fun3 = "my Name is" & name

End Function

 

Function fun4(name As String)

    Debug.Print name

End Function

 

Function fun5(num1 As Integer, num2 As Integer)

    res = num1 + num2

    Debug.Print res

    fun5 = res

End Function

  1. VBA中常用函数

字符串函数

Trim(string)   

去掉string左右两端空白

Ltrim(string)   

去掉string左端空白

Rtrim(string)   

去掉string右端空白

Len(string)    

计算string长度

Left(string, x) 

取string左段x个字符组成的字符串

Right(string, x) 

取string右段x个字符组成的字符串

Mid(string, start,x)

取string从start位开始的x个字符组成的字符串

Ucase(string)   

转换为大写

Lcase(string)   

转换为小写

Space(x)      

返回x个空白的字符串

Asc(string)    

返回一个 integer,代表字符串中首字母的字符代码

Chr(charcode)   

返回 string,其中包含有与指定的字符代码相关的字符

StrReverse

将字符串倒置,例如StrReverse(“123”)结果为”321”

 

类型转换函数

CBool(expression) 

转换为Boolean型

CByte(expression) 

转换为Byte型

CCur(expression) 

转换为Currency型

CDate(expression) 

转换为Date型

CDbl(expression) 

转换为Double型

CDec(expression) 

转换为Decemal型

CInt(expression) 

转换为Integer型

CLng(expression) 

转换为Long型

CSng(expression) 

转换为Single型

CStr(expression) 

转换为String型

CVar(expression) 

转换为Variant型

Val(string) 

转换为数据型

Str(number) 

转换为String

日期时间函数

Now    

返回一个 Variant (Date),根据计算机系统设置的日期和时间来指定日期和时间。

Date    

返回包含系统日期的 Variant (Date)。

Time    

返回一个指明当前系统时间的 Variant (Date)。

Timer   

返回一个 Single,代表从午夜开始到现在经过的秒数。

TimeSerial(hour, minute, second)

返回一个 Variant(Date),包含具有具体时、分、秒的时间。

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目

Second(time)

返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一分钟之中的某个秒

Minute(time)

返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一小时中的某分钟

Hour(time)

返回一个 Variant (Integer),其值为 0 到 23 之间的整数,表示一天之中的某一钟点

Day(date)

返回一个 Variant (Integer),其值为 1 到 31 之间的整数,表示一个月中的某一日

Month(date)

返回一个 Variant (Integer),其值为 1 到 12 之间的整数,表示一年中的某月

Year(date)

返回 Variant (Integer),包含表示年份的整数。

Weekday(date, [firstdayofweek])

返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几

 

测试函数

IsNumeric(x)

是否为数字, 返回Boolean结果。

IsDate(x) 

是否是日期, 返回Boolean结果。

IsEmpty(x)

是否为Empty, 返回Boolean结果。

IsArray(x)

指出变量是否为一个数组。

IsError(expression)

指出表达式是否为一个错误值。

IsNull(expression)

指出表达式是否不包含任何有效数据 (Null)。

IsObject(identifier)

指出标识符是否表示对象变量。

 

数学函数

Sin(X)、Cos(X)、Tan(X)、Atan(x)

三角函数,单位为弧度。

Log(x)、Exp(x)

返回x的自然对数,指数。

Abs(x)

返回x的绝对值。

Int(number)、Fix(number)

都返回参数的整数部分,区别:Int 将 8.4 转换成9,而 Fix 将8.4 转换成8

Sgn(number)

返回一个 Variant (Integer),指出参数的正负号。

Sqr(number)

返回一个 Double,指定参数的平方根。

VarType(varname)

返回一个 Integer,指出变量的子类型。

 

逻辑判断相关函数

And

 如果所有参数都为True,则返回True;只要有一个返回False,则返回False。

Or

 如果所有参数都为False,则返回False;只要有一个返回True,则返回True。

IsErr

 检查是不是除了#N/A外的错误值.

IsError

 检查是不是错误值(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?,或者 #NULL!).

IsEven

 检查是否是偶数.

IsOdd

 检查是否是奇数.

IsLogical

 检查是不是布尔值.

 

猜你喜欢

转载自blog.csdn.net/huzhizhewudi/article/details/84497106
今日推荐