乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > VBA 代码的健壮性-excel平方根

VBA 代码的健壮性-excel平方根

作者:乔山办公网日期:

返回目录:excel表格制作

一、 什么是健壮性

1.1 除法引发的血案

在讨论代码的健壮性之前,我们开看这样一段简短的代码,在Excel VBA中,求一个单元格对另一个单元格的“除法”,当然可以简单地写成如下的VBA代码形式:

Function MyDevide(A As Double, B As Double) As Double

MyDevide=A/B

End Function

那么,这个程序有没有啥问题呢?除法当然是A/B,这本身没有错。可是,如果我们用这样定义的“除法”运算,就会发现一个潜在的漏洞,即当第二个数字为0的时候,也就是说一旦我们将这个算法运用到一个空单元格的时候,就会发生运算错误。即出现#Value的结果。

也许你会说,对啊,0不能做除数,这一点我们大家都清楚。可是作为程序开发者来说,应该对所有可能出现的情况做充分的判断,上面那一段代码出现这种情况的究其原因,是这个程序的代码不够健壮。

1.2 健壮性

所谓的健壮性,就是程序在用户任意的输入情况下,都可以得到稳定并且正确的输出。当然,用一些手段限制用户输入的情况除外,因为这种情况已经在某种程度上拒绝了程序中错误的出现。以上面这个例子,用户在使用这个函数时,并不知道(或者不期望其知道)第二个参数(除数)不能为0,所以,他们用0作为除数的行为是应该可以得到谅解的。

通过上述的讨论,我们有必要将这样一段简单的程序加以修改,以保证运行的正确性。

Function MyDevide(A As Double, B As Double)

If B=0 Then MyDevide=”Error, DevBy 0”: Exit Function

MyDevide=A/B

End Function

这一次的运行结果,如果用户选择了空单元格(除数为0)则显示“Error! DevBy 0”,也就是说告诉用户你参数错了,错的原因是,DevBy 0(用0做除数)

二、如何解决程序中隐含的Bug

2.1 什么是Bug

Bug就是在程序的运行中,没有得到程序预想的结果。这些Bug大部分是由于用户没有按照希望的形式或者方法进行数据输入。当然,我们不能希望用户像编写程序的程序员那样熟知每一个函数或者过程的具体细节,程序编写的精华也在于将函数或者过程的具体细节进行“封装”,只给用户提供一个“入口”。由此可见,在程序编写的过程中,程序中存在的Bug是一个避免不了,又无法逃避的问题。例如,尽管编程者通过提示让用户输入一个数字,但无果不加以额外的手段,谁也保不齐用户会输入一个字符,或者让用户按某一个顺序进行某项输入,但谁也不能保证用户会100%地按照正确的顺序进行输入。

2.2 如何解决程序中的Bug

第一个方法是写一个类似Manu之类的手册,并且通过某种方式强制让用户进行阅读。这种方法见于早期,由于软件功能有限,加之编写水平不高,所以出现了这种”使用手册“之类的东西。但是这种基于用户的行为是程序中不推荐使用的。

第二种方法,对用户的每一种可能输入情况进行判断,如果输入不符合规则,则提示用户“输入错误”或者让用户再次输入一遍。例如对于“性别”这个变量,只允许用户输入“男”或者“女”,此时可以加入一个判断,如果用户输入了“男”或“女”以外的字符,则显示输入错误,并且让用户重新再出入一遍。这种方法的好处是,可以保证程序按照希望的方法正确运行,但是,这样做的不好的地方在于用户体验会比较差,这样的程序甚至可以作为一个教材,逼着用户成为下一个程序员。

第三种方法,按照一般人的习惯对输入的情况进行编写。例如,一般人都会用”>”表示“大于“,而不是用诸如”GT“这样的英文字母。但是这种方法也存在一定的差异,例如某些人习惯用”!=“表示”不等于“。另外一些人则习惯用”<>“表示”不等于“。

第四种方法,在程序中列出所有的可能出现情况,并一一加以解决,当然大多数情况下,作为程序的编写者,不大可能预见所有的情况,也只好将程序做到尽量完善。

第五种方法,遇到Bug时使用错误处理语句,通过错误处理语句,可以高效的、快速地构建一个健壮性很好的程序。VBA提供了很多种处理异常(Error)的方法,例如:On Error Resume Next,On Error Goto 0等。

三、对出现的错误进行操作

  1. 使用On Error Goto语句

可以用 On Error Goto+行标的方法对程序中可能出现的错误进行操作,例如,在平方根的运算中,当被开平方的数为负数时,我们可以让它显示成“虚数”的结果。

Function MySqr(A As Double)

On Error Goto L1

MySqr=Sqr(A)

Exit Function

L1:

A=-A

MySqr=Sqr(A) & “i”

End Function

当然对于这个简单的例子,也可以先判断A是否大于0,然后分别调用两个不同的函数。下面我们再来看一下On Error Goto语句的用法

例如,求一元一次方程ax+b=0的解,这里,如果a=0则需要对方程做额外处理。

Function MyF(A As Double, B As Double)

On Error GoTo L1

MyF = -B / A

Exit Function

L1:

If B = 0 Then

MyF = "Any"

Else

MyF = "Inf"

End If

End Function

这一段程序的作用:当方程系数A不为0时,方程的解是-B/A,当A等于0的时候,如果B=0则显示“Any”表示任意一个数,如果B≠0,则显示“Inf”表示结果为无穷大。

2.使用On Error Resume Next 语句

On Error Resume Next 语句可以使系统自动忽略掉运行中出现的错误,而继续向下运行。

我们以修改一个区域的颜色为例说明On Error Resume Next的用法。例如,让用户输入一个RGB颜色,然后把Sheet1的A1单元格背景填充成这种颜色。一般地,RGB颜色由3个0~255之间的整数构成,但是如果用户只输入了两个或者一个怎么办?当然,另外的数值只好认为是0了。

Sub MyColor()

On Error Resume Next

Dim r As Integer,g As Integer,b As Integer

Dim StrL

StrL=InputBox("输入RGB颜色")

r=Val(Split(StrL,",")(0))

g=Val(Split(StrL,",")(1))

b=Val(Split(StrL,",")(2))

Sheet1.Range("A1").Interior.Color=RGB(r,g,b)

End Sub

这一段的作用,用户输入三个以逗号分隔的数字(0~255之间整数),然后作为RGB的值给A1单元格着色,由于用户可能会输入完整的信息。例如255,0,0,也有可呢个输入不完整的信息,例如255,0,无论怎么用户如何输入,总之第一个逗号前是R的数值,两个逗号中间是G的数值,最后一个数为B的数值。

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网