(1条消息) Excel中VBA编程学习笔记(三)
12、使用InputBox函数进行输入语法如下:InputBox(prompt [,title] [,default] [,xpos] [,ypos] [,helpfile,context])参数说明:prompt为提示内容,必选;title对话框标题;default为对话框中缺省的文字内容;xpos和ypos表示对话框距离屏幕左上角的距离,缺省则居中.使用示例:Private Sub b()Dim a As Stringa = InputBox("请输入姓名:", "输入对话框", "张三")MsgBox (a)End Sub
注:如果用户点击了“取消”按钮,则返回空串(“”).13、循环及判断语句使用exit for;exit loop;exit sub;exit function;exit select等退出对应的循环结构【例一】 if thenPrivate Sub test()If Sheet1.Cells(1, 1).Value = "1" ThenApplication.QuitEnd IfEnd Sub【例二】if else thenPrivate Sub test()Dim a As Integera = MsgBox("华工计算机", 1 + 64 + 0, "对话框")If a = vbOK ThenMsgBox ("点击了确定")ElseMsgBox ("点击了取消")End IfDim a%score = 76Debug.Print IIf(score > 60, IIf(score >= 70, IIf(score >= 80, IIf(score >= 90, "优秀", "良好"), "中等"), "及格"), "差")End Sub注:IIF跟公示编辑栏输入的IF语句一样可以直接嵌套【例三】select casePrivate Sub test()Dim num As IntegerDim res As Stringres = InputBox("请输入分数")If res <> "" Then '不是点击取消按钮num = CInt(res) '强制转换为整型Select Case (num)Case 0 To 59MsgBox ("不及格")Case Is < 85MsgBox ("良好")Case Is < 98MsgBox ("优秀")Case 98, 99, 100MsgBox ("特别优秀")Case Else '没有匹配上面所有情况时候执行,可以省略MsgBox ("输入分数不合法")End SelectEnd IfEnd Sub注意:select case中使用的is关键字与is比较运算符不同.【例四】whle wendPrivate Sub test()Dim i, sum As Integersum = 0i = 60While i > 12sum = sum + ii = i - 1WendMsgBox (sum)End Sub【例五】do loopPrivate Sub test()Dim i, sum As Integersum = 0i = 60Do While i >= 12sum = sum + ii = i - 1LoopMsgBox (sum)Doi = i + 2Loop While i < 100MsgBox (i)Do Until i <= 0i = i - 10LoopMsgBox (i)i = 2Doi = i * 2Loop Until i > 111MsgBox (i)End Subdo loop的四种循环结构do while … loop循环先测试条件,如果成立则执行循环体do … loop while循环先执行一遍循环体,则测试循环条件,如果条件成立,则执行循环体do until … while循环先测试条件,如果不成立则执行循环体do … loop until循环先执行一遍循环体,则测试循环条件,如果条件不成立,则执行循环体【例六】for nextPrivate Sub test()Dim i, sum As Integersum = 0For i = 1 To 12sum = sum + iNextMsgBox (sum)sum = 0For i = 1 To 12 Step 2sum = sum + iNextMsgBox (sum)End Sub【例七】for each nextPrivate Sub test()Sheet1.Range("M1:M86").Select '设置选中部分Dim rDim t As LongFor Each r In Selection '求所有选中部分数值和If IsNumeric(r.Value) Thent = t + r.ValueEnd IfNextMsgBox (t)End Sub【例8】使用GOTO语句Sub test()Dim value$, k%line:If k > 3 Then Exit Subvalue = InputBox("请输入用户名")If value <> "admin" Thenk = k + 1GoTo lineElseMsgBox ("输入正确")End IfEnd Sub注:上例中的“line”可以换成任意数字或者字符串【例9】使用GOSUB语句Sub test()Dim value$, k%, counter%counter = 1Do Until counter = 10k = Application.WorksheetFunction.RandBetween(1, 100)If k < 60 Or k > 95 Then GoSub lineActiveSheet.Range("A" & counter).value = kcounter = counter + 1LoopExit Sub '此句不可少line:ActiveSheet.Range("A" & counter).Interior.ColorIndex = 3ReturnEnd Sub注:红色背景部分不可少。GOTO与GOSUB不同的是GOSUB可以使用RETURN。14、错误处理on error语法:On Error GoTo lineOn Error Resume NextOn Error GoTo 0On 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 NextResume lineResume 语句的语法可以具有以下任何一种形式:语句 描述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 = 0For Each value In numm = m + valueNextMyPlus = mEnd Function调用:=MyPlus(12,22,32)【例2】Public Function MyJoin(ParamArray num())result = ""For Each va In numFor Each v In varesult = result & vNextNextMyJoin = resultEnd Function
16、sub过程语法:[Private | Public | Friend] [Static] Sub name [(arglist)]其中“(arglist)”即表示它支持可选的参数,可以不用参数,也可以使用参数;可以使用一个参数,也可以使用多个参数。其中参数(arglist)的具体语法如下:[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]Optional 可选的。表示参数不是必需的关键字。如果使用了该选项,则 arglist 中的后续参数都必须是可选的,而且必须都使用 Optional 关键字声明。如果使用了 ParamArray,则任何参数都不能使用 OptionalByVal 可选的。表示该参数按值传递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 SubSub HouseCalc(price As Single, wage As Single)If 2.5 * wage <= 0.8 * price ThenMsgBox "You cannot afford this house."ElseMsgBox "This house is affordable."End IfEnd Sub【例二】调用function过程Sub Main()temp = InputBox("请输入华氏温度")MsgBox "温度是 " & Celsius(temp) & " 摄氏度"End SubFunction Celsius(fDegrees)Celsius = (fDegrees - 32) * 5 / 9End Function【例三】在function过程中使用可选参数Sub main()Dim ReturnValueReturnValue = ReturnTwice() ' 返回 Null。ReturnValue = ReturnTwice(2) ' 返回 4。End SubFunction ReturnTwice(Optional A)If IsMissing(A) Then' 如果参数丢失,则返回 Null。ReturnTwice = NullElse' 如果参数出现,则返回两倍的值。ReturnTwice = A * 2End IfEnd Function注:IsMissing函数返回布尔值,指出一个可选的Variant参数是否已经传给过程.【例四】在function中使用不定参数Sub main()Call sum(2, 3, 4)End SubFunction sum(ParamArray a()) As SingleDim i As IntegerFor i = 0 To UBound(a())Debug.Print a(i)Next iEnd FunctionFUNCTION与SUB的比较调用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 SubSub fun1(name As String)Debug.Print nameEnd SubSub fun2(name As String)Debug.Print "my Name is" & nameEnd SubFunction fun3(name As String)fun3 = "my Name is" & nameEnd FunctionFunction fun4(name As String)Debug.Print nameEnd FunctionFunction fun5(num1 As Integer, num2 As Integer)res = num1 + num2Debug.Print resfun5 = resEnd FunctionVBA中常用函数字符串函数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 转换成8Sgn(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检查是不是布尔值.