阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 1479|回复: 2

如何开发完善的程序?

[复制链接]
  • TA的每日心情
    开心
    2012-10-14 19:24
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2012-8-19 05:14:43 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    解决方案

    通过常规思路开发一段程序完成基本需求。然后查找存在的问题并进行完善;再对新的过程审核是否有新问题,继续完善,直到没有任何问题。



    操作方法


    步骤1 以让用户从对话框录入一个值,并对该值开平方后写入活动单元格。根据题目需求,编写以下代码:


    Sub 获取平方根1()

    Dim Value As Long

    Value = InputBox("请输入数值:", "待开方之数值", 0)

    ActiveCell.Value = Sqr(Value)

    End Sub




    步骤2 执行以上过程,并输入100或者789123.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




    注意:本书中编程的主题是准确性、效率、防错性和兼容性,代码一定要对所有错误进行防范,确保程序通用。然而为了节约篇幅,让书中展现更多内容,所以尽量减少重复代码,对于工作表是否保护、当前表是否图表以及活动单元格是否在数组区域之间就不再每个案例都进行判断,只对其它出错的可能性进行防错。但读者在实际工作中应该全面进行防错。


    评分

    参与人数 1贡献 +2 收起 理由
    卢和萍 + 2 楼主是参照一个视频整理的吧?不过,也有价.

    查看全部评分

  • TA的每日心情
    奋斗
    2015-8-27 09:21
  • 签到天数: 734 天

    [LV.9]以坛为家II

    发表于 2012-8-19 10:35:14 | 显示全部楼层
    楼主做什么的。。一口气发那么多帖子
  • TA的每日心情
    开心
    2021-11-1 03:35
  • 签到天数: 956 天

    [LV.10]以坛为家III

    发表于 2014-12-9 13:09:25 | 显示全部楼层
    支持楼主顶顶顶顶顶顶顶

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2024-5-23 15:50 , Processed in 0.071758 second(s), 24 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表