TA的每日心情 | 开心 2012-10-14 19:24 |
---|
签到天数: 6 天 [LV.2]偶尔看看I
|
马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
x
解决方案:
通过常规思路开发一段程序完成基本需求。然后查找存在的问题并进行完善;再对新的过程审核是否有新问题,继续完善,直到没有任何问题。
操作方法
步骤1 以让用户从对话框录入一个值,并对该值开平方后写入活动单元格。根据题目需求,编写以下代码:
Sub 获取平方根1()
Dim Value As Long
Value = InputBox("请输入数值:", "待开方之数值", 0)
ActiveCell.Value = Sqr(Value)
End Sub
步骤2 执行以上过程,并输入100或者789、123.455等等数据测试,可以发现实现了需求的功能。然而如果用户在对话框上单击“取消”按钮,那么程序会出错。修改代码如下:
Sub 获取平方根2()'解决按“取消”键问题
Dim Value As Variant
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
ActiveCell.Value = Sqr(Value)
End Sub
步骤3 再执行程序验证,按下“取消”键后程序会自动退出,具有了防错功能。然而输入一个负数,程序仍然要出错。继续改进代码:
Sub 获取平方根3()'解决负数问题
Dim Value
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox "不能小于0"
End Sub
步骤4 当输入负数后,程序会提示用户,然后退出。但如果用户录入文本,程序仍然要出错,所以再次对代码做优化:
Sub 获取平方根4()'解决文字问题
Dim Value
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
If VBA.IsNumeric(Value) Then
If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox "不能小于0"
Else
MsgBox "不能输入文本", 64, "提示"
End If
End Sub
步骤5 如果输入文本,程序具有了识别并警告用户的功能。然而,活动表是图表时,执行程序仍然会出错。完善的程序需要处理所有意外,那么程序可以如下改进:
Sub 获取平方根5()'解决图表问题
Dim Value
If TypeName(ActiveSheet) = "Chart" Then MsgBox "不要选择图表": Exit Sub
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
If VBA.IsNumeric(Value) Then
If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox "不能小于0"
Else
MsgBox "不能输入文本", 64, "提示"
End If
End Sub
步骤6 如果工作表被保护状态下执行以上程序仍然会出错,继续完善代码:
Sub 获取平方根6()'解决工作表保护问题
Dim Value
If TypeName(ActiveSheet) = "Chart" Then MsgBox "不要选择图表": Exit Sub
If ActiveSheet.ProtectContents Then MsgBox "工作表已保护": Exit Sub
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
If VBA.IsNumeric(Value) Then
If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox "不能小于0"
Else
MsgBox "不能输入文本", 64, "提示"
End If
End Sub
步骤7 如果活动单元格处理数组区域之间,程序仍然会产生错误。所以最后将代码优化为:
Sub 获取平方根7()'解决数组区域问题
Dim Value
If TypeName(ActiveSheet) = "Chart" Then MsgBox "不要选择图表": Exit Sub
If ActiveSheet.ProtectContents Then MsgBox "工作表已保护": Exit Sub
Value = InputBox("请输入数值:", "待开方之数值", 0)
If Len(Value) = 0 Then Exit Sub
If VBA.IsNumeric(Value) Then
On Error Resume Next
Debug.Print ActiveCell.CurrentArray
If Err = 0 Then MsgBox "请不要选择数组区域": Exit Sub
If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox "不能小于0"
Else
MsgBox "不能输入文本", 64, "提示"
End If
End Sub
原理分析
编程的基本条件是准确性。然而程序除了准确以外,还必须具备防错、通用的功能,否则代码在当前状态下正确执行,环境稍加变化就出现错误,那么会增加很多维护成本。一个好的程序应该尽量通用于所有状况,而本例正是通过一个典范来展示程序的完善过程,让读者对程序可能出现的错误进行了解,并提供所有错误的解决之道。在实际工作中,都应该严格按此思路编写代码,提升程序的准确性、纠错性,同时也减少维护成本。
知识扩展
区域数组公式是同时存在于多个连续单元格中的带有“{}”标志的公式,将它录入到工作表后就将占据一个区域,而非一个单元格,该区域即为数组区域。它的特性是不能单独修改区域中任意一个单元格,如果代码修改其中一个单元格,程序会中断。
本例中也可以利用“On Error Resume Next”一次解决所有问题,其代码如下。不过如果执行程序后得不到结果,就无法知道出错的原因。
Sub 获取平方根8()'解决所有问题
On Error Resume Next
ActiveCell.Value = Sqr(Application.InputBox("请输入数值:", "开平方", 0, , , , , 1))
End Sub
注意:本书中编程的主题是准确性、效率、防错性和兼容性,代码一定要对所有错误进行防范,确保程序通用。然而为了节约篇幅,让书中展现更多内容,所以尽量减少重复代码,对于工作表是否保护、当前表是否图表以及活动单元格是否在数组区域之间就不再每个案例都进行判断,只对其它出错的可能性进行防错。但读者在实际工作中应该全面进行防错。
|
评分
-
查看全部评分
|