VBA中的错误处理

  从理论上讲,VBA没有提供任何的错误处理机制,这种被用在微软Office产品中的以Visual Basic语言为基础的脚本语言根本就不要任何的错误处理,当程序出现错误或产生异常情况时,VBA会自动定位到出错的代码行,然后提示用户出错的可能原因。这是典型的脚本语言的错误提示,联想到javascript语言,在浏览器中如果出现脚本错误,浏览器会给出提示信息,但这并不影响整个程序的正常运行,最多也就是出现错误之后的脚本不被继续解释而已。不过即便如此,javascript还是提供了较为良好的错误处理机制,例如常见的try catch语句和alert提示,以及后来支持的debugger调试信息等,javascript在支持面向对象语言特性的同时也逐渐改善了它的错误处理和调试方法。

    然而Visual Basci却没有这么幸运,从诞生之初,Visual Basic就没有提供一个比较好的错误处理机制,尽管我们在实际应用中总会遇到这样或那样的运行时错误(例如错误删除文件、磁盘驱动器空间不够、网络通信发生异常等),但是对于Visual Basic的过程来说根本就没有错误处理,当错误产生时程序便停止运行,直到异常被清除。有关比较详细的介绍Visual Basic的错误处理和调试方法的文章,读者可以参考下面这个链接。

http://www.officexy.com/Articles/office/VBABasic/20061026103436501.htm

    VBA的语言特性类似于Visual Basic,应该说它们属于同一家族,所以,用来在Visual Basic中处理程序异常的方法也同样可以被用在VBA中。

    在Visual Basic中,常用的程序错误处理的方式是设置或使用错误陷阱,以告诉应用程序当错误发生时转移到何处(或处理当错误发生时要运行的代码),通过在代码中定义标签来告知应用程序当错误发生时要转到的地方。这一点和C系列语言的错误处理方式是相同的。基本步骤如下:

1. 设置一个有效的错误陷阱,以告诉应用程序发生错误时转移到何处继续运行。Visual Basic中的On Error语句可以使错误陷阱有效,并为应用程序指定错误处理的入口。

2. 在错误程序的入口处编写响应错误的具体实现,如继续尝试执行之前的代码、或告知用户出错的具体原因以让用户尝试去解决等。

3. 退出错误处理。

    有关如何使用Visual Basic的错误处理和On Error语句的具体含义,读者可以仔细阅读上面给出的那个链接的文章,里面有非常详细的介绍。我在这里会结合实际应用来讲讲在VBA中如何具体使用错误处理。

    先看一个简单的示例。

复制代码
Private   Sub  CommandButton1_Click()
    
On   Error   GoTo  Err_Handle
    
Dim  a  As   Integer
    
Dim  b  As   Integer
    
Dim  c  As   Integer
    a 
=   10
    b 
=   0
    c 
=  a  /  b  ' 除数为0会导致运行时错误
     MsgBox  c
    
End Sub
Err_Handle:
    
MsgBox  Err.Description
End Sub
复制代码

    在上述过程中,我们首先通过On Error语句设置了一个错误陷阱,该错误陷阱将自动被激活,同时错误陷阱指向了代码中定义的标签Error_Handle。当过程被调用时,如果出现异常,程序会自动运行标签所指向的代码段,这里会给用户一个提示。Err对象为系统对象,其中包含了当错误发生时的描述信息和错误编号,根据Err对象提供的这些简单信息我们也许可以告知用户应用程序发生了什么事情,从而最终找出出错的具体原因。

    在Visual Basic中,我们通过On Error语句设置并激活了一个错误陷阱,直到程序退出过程或方法,该错误陷阱会一直有效。也就是说,我们需要给每一个过程或方法在需要的时候设置单独的错误陷阱,这个有点类似于C的代码中在需要的地方插入try catch语句,错误处理程序在过程或方法内部定义的标签开始的地方,在程序运行时如果错误没有出现,则标签之后的代码应该不会被执行到,因此我们通常都需要在错误处理代码前插入退出语句,例如End Sub或方法的返回语句。

    幸运的是我们通常没有必要为每一个过程或方法定义错误陷阱,在VBA中,往往只有一少部分过程或方法需要定义错误陷阱,但是不排除复杂的VBA应用程序,当代码量达到上千行,过程或方法上百个时,应该不亚于一个小的VB系统,这个时候编写一个专门的错误处理函数还是很有必要的。在需要进行错误处理的过程或方法中设置好错误陷阱和用于处理错误的标签,然后在标签后调用错误处理函数并传入Err对象,由错误处理函数专门处理程序中各种不同的错误。这个程序看起来大致是下面这个样子。

复制代码
' -----Err number-----
Private   Const  ErrNoPermissions  =   - 2147217900
Private   Const  ErrCannotLocateURL  =   - 2146697211
Private   Const  ErrDbDenyConnect  =   - 2147217843
Private   Const  ErrCannotFoundDbProvider  =   3706
' --------------------

'  Errors handle:
'
 Return    Description
'
 0         Resume
'
 1         Resume Next
'
 2         Error
Function  ErrorsHandle()  As   Integer
   
Dim  intMsgType  As   Integer , intResponse  As   Integer , strMsg  As   String
   
Dim  myDoc  As  Worksheet
   
Set  myDoc  =  ActiveSheet
   
   
Select   Case  Err.Number
          
Case  ErrCannotLocateURL            '  Error -2146697211
             strMsg  =   " Cannot connect to the website specified. Please make sure the URL is correct and the website is available. "
             intMsgType 
=  vbRetryCancel
          
Case  ErrNoPermissions              '  Error -2147217900
             myDoc.Protect  ' Protect the sheet if current user doesn't have permissions to access the data
             strMsg  =   " User  "   &  glUserName  &   "  doesnt have permissions to access the data. "
             intMsgType 
=  vbExclamation
          
Case  ErrCannotFoundDbProvider      '  Error 3706
             strMsg  =   " Please ensure 'Microsoft SQL Server Native Client for SQL2005' installed at first. "   &  _
                      
" You can download at :http://download.microsoft.com/download/4/4/D/ "   &  _
                      
" 44DBDE61-B385-4FC2-A67D-48053B8F9FAD/sqlncli.msi "
             intMsgType 
=  vbExclamation
          
Case  ErrDbDenyConnect              '  Error -2147217843
             myDoc.Protect  ' Protect the sheet if current user doesn't have permissions to connect the database
             strMsg  =   " Database login failed for user ' "   &  glUserName  &   " '. "
             intMsgType 
=  vbExclamation
          
Case   Else
               strMsg 
=   " Fatal error. "   &  Err.Description  &   " .The error number is  "   &  Err.Number
             intMsgType 
=  vbCritical
   
End   Select
      
   intResponse 
=   MsgBox (strMsg, intMsgType)
   
Select   Case  intResponse
          
Case   4 6               '  Retry And Yes
             ErrorsHandle  =   0
          
Case   5                  '  Ignore
             ErrorsHandle  =   1
          
Case   Else               '  Cancel and Abort
             ErrorsHandle  =   2
   
End   Select
End Function
复制代码
    稍微做一下解释。当程序发生错误时,Err对象的Number属性会返回一个错误代码,ErrorsHandle函数得到这个错误代码并通过Select Case语句逐一比对错误代码,找到事先定义好的错误处理方法从而返回给用户最准确的信息。程序的一开始定义了一组常量用来描述错误代码所表示的具体含义,在Select Case语句中根据不同的错误代码返回给用户不同的错误描述信息,并且根据错误的种类弹出不同类型的提示框(如确定、重试、取消等),这个是由MsgBox常数所决定的,该常数分为很多种类,可以弹出各种不同类型的提示框,读者可以自己查阅Office帮助文档。如果需要,我们可以随时在Select Case语句中补充更多的内容来定制内容更丰富的错误处理方法,而只需要确认何种错误代码代表何种具体的错误信息即可,这个错误信息我们也可以通过Err.Description属性来获取,尽管这个描述信息通常都并不那么精确。最后ErrorsHandle函数会返回三种不同的结果(当然如果需要你可以让这个函数返回更多的值),用以表示调用它的过程或方法如何继续处理,是终止程序运行,还是尝试再次运行,或者忽略错误继续运行下面的代码等。下面是调用的代码。
复制代码
Public  Enum DebugMode
    Release 
=   0
    Debugger 
=   1
End  Enum

Public  Mode  As  DebugMode

Private   Sub  CommandButton1_Click()  
    Mode 
=  DebugMode.Release  ' Change the Mode value to Debugger or Release
     If  Mode  =  Release  Then
        
On   Error   GoTo  Error_Handle
    
End   If
  
  
'  TODO Something

  
Exit   Sub
    
Error_Handle:
    errNum 
=  ErrorsHandle
    
If  errNum  =   0   Then
        
Resume
    
ElseIf  errNum  =   1   Then
        
Resume   Next
    
Else
        
Exit   Sub
    
End   If
End Sub
复制代码

    我省略了过程中的具体实现,实际上你可以在这个过程中实现任何功能,只要程序出错,ErrorsHandle方法就会被调用,并且按照事先定义好的错误处理方法告知用户错误产生的具体原因并询问用户如何进行下一步操作。Resume Next语句会跳过错误行继续运行下面的代码,Resume语句则会尝试再次运行出错的代码,其次则是直接退出过程结束程序。为了方便代码的调试,我在程序的最开始设置了一个开关,该开关是一个枚举变量,拥有两个值Release和Debugger,值为Release时设置错误陷阱,值为Debugger时不设置错误陷阱,这个时候VBA会自动定位到出错的代码行并要求用户调试代码(事实上用户根本就不会调试任何代码,这个一般都是留给开发人员来用的)。这样,每次我只需要修改这个枚举变量的值就可以在调试模式和非调试模式之间切换,而不需要每次都注释掉很多代码,毕竟在程序开发过程中调试是非常重要的,我们往往都需要知道程序究竟发生了什么。

    这种错误处理的方式我在VBA应用中经常会用到,唯一不方便的就是我们需要在每一个可能出错的过程或方法中设置错误陷阱并调用错误处理函数,可能还要做一些额外的操作,例如上面讲到的设置调试模式的开关、判断错误处理函数的返回值并进行相应的操作等。

    其实,On Error语句除了在VBA中被用来进行错误处理外,还有一些特殊的用途,下面是一个例子。

复制代码
' Check whether the key in the collection of
Public   Function  KeyExists(col  As  Collection, Key)  As   Boolean
    
On   Error   Resume   Next
    
Dim  x  As  Variant
    x 
=  col.Item(Key)
    KeyExists 
=   Not  (Err.Number  =   5 )
    
On   Error   GoTo   0
        
End Function
复制代码

    VBA支持集合类型的对象,如Dim country As New Collection,我们可以往集合对象中添加项或移除项,以及查找特定的项。但是VBA中的集合对象功能很有限,它居然没有提供判断集合中的Key(关键字)是否存在的方法。对于集合来说,这个方法非常重要,当你往集合中添加项时,如果Key重复,VBA是会抛出异常的,因此我们需要自己编写一个用来检测集合中的Key是否存在的方法。借助于On Error和Resume Next语句可以实现这个功能,我们可以反复查找集合中的项,如果要查找的项不存在则会抛出异常,这时利用Resume Next语句继续执行下一条语句继续进行查找,直到找到要查找的项。On Error GoTo 0用来关闭错误陷阱。

    类似于这样的应用还有很多,我们可以自己控制当程序出错时如何进行下一步操作,从而更方便的管理我们自己的应用程序。

    另外,VBA的编辑器也提供了一些辅助功能帮助我们调试代码,如常用的在代码中设置断点、添加和切换书签,以及运行时的对象监视等,读者可以自己去体会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 Range(单元格)对象 10 技巧1 单元格的引用方法 10 1-1 使用Range属性 10 1-2 使用Cells属性 11 1-3 使用快捷记号 11 1-4 使用Offset属性 12 1-5 使用Resize属性 12 1-6 使用Union方法 12 1-7 使用UsedRange属性 12 1-8 使用CurrentRegion属性 12 技巧2 选定单元格区域的方法 12 2-1 使用Select方法 12 2-2 使用Activate方法 12 2-3 使用Goto方法 12 技巧3 获得指定行、列的最后一个非空单元格 12 技巧4 定位单元格 12 技巧5 查找单元格 12 5-1 使用Find方法 12 5-2 使用Like运算符 12 技巧6 替换单元格内字符串 12 技巧7 复制单元格区域 12 技巧8 仅复制数值到另一区域 12 8-1 使用选择性粘贴 12 8-2 直接赋值的方法 12 技巧9 单元格自动进入编辑状态 12 技巧10 禁用单元格拖放功能 12 技巧11 单元格格式操作 12 11-1 单元格字体格式设置 12 11-2 设置单元格内部格式 12 11-3 为单元格区域添加边框 12 11-4 灵活设置单元格的行高列宽 12 技巧12 单元格的数据有效性 12 12-1 在单元格建立数据有效性 12 12-2 判断单元格是否存在数据有效性 12 12-3 动态的数据有效性 12 12-4 自动展开数据有效性下拉列表 12 技巧13 单元格的公式 12 13-1 在单元格写入公式 12 13-2 检查单元格是否含有公式 12 13-3 判断单元格公式是否存在错误 12 13-4 取得单元格公式的引用单元格 12 13-5 将单元格的公式转换为数值 12 技巧14 单元格的批注 12 14-1 判断单元格是否存在批注 12 14-2 为单元格添加批注 12 14-3 删除单元格的批注 12 技巧15 合并单元格操作 12 15-1 判断单元格区域是否存在合并单元格 12 15-2 合并单元格时连接每个单元格的文本 12 15-3 合并内容相同的连续单元格 12 15-4 取消合并单元格时在每个单元格保留内容 12 技巧16 高亮显示单元格区域 12 技巧17 双击被保护单元格时不显示提示消息框 12 技巧18 重新计算工作表指定区域 12 技巧19 录入数据后单元格自动保护 12 技巧20 工作表事件Target参数的使用方法 12 20-1 使用单元格的Address 属性 12 20-2 使用Column属性和Row属性 12 20-3 使用Intersect方法 12 第2章 Worksheet(工作表)对象 12 技巧21 引用工作表的方式 12 21-1 使用工作表的名称 12 21-2 使用工作表的索引号 12 21-3 使用工作表的代码名称 12 21-4 使用ActiveSheet属性引用活动工作表 12 技巧22 选择工作表的方法 12 技巧23 遍历工作表的方法 12 23-1 使用For...Next 语句 12 23-2 使用For Each...Next 语句 12 技巧24 在工作表上下翻页 12 技巧25 工作表的添加与删除 12 技巧26 禁止删除指定工作表 12 技巧27 自动建立工作表目录 12 技巧28 工作表的深度隐藏 12 技巧29 防止更改工作表的名称 12 技巧30 工作表一次插入多行 12 技巧31 删除工作表的空行 12 技巧32 删除工作表的重复行 12 技巧33 定位删除特定内容所在的行 12 技巧34 判断是否选整行 12 技巧35 限制工作表的滚动区域 12 技巧36 复制自动筛选后的数据区域 12 技巧37 使用高级筛选获得不重复记录 12 技巧38 工作表的保护与解除保护 12 技巧39 奇偶页打印 12 第3章 Wordbook(工作簿)对象 12 技巧40 工作簿的引用方法 12 40-1 使用工作簿的名称 12 40-2 使用工作簿的索引号 12 40-3 使用ThisWorkbook 12 40-4 使用ActiveWorkbook 12 技巧41 新建工作簿文件 12 技巧42 打开指定的工作簿 12 技巧43 判断指定工作簿是否打开 12 43-1 遍历Workbooks集合方法 12 43-2 错误处理方法 12 技巧44 禁用宏则关闭工作簿 12 技巧45 关闭工作簿不显示保存对话框 12 45-1 使用Close方法关闭工作簿 12 45-2 单击工作簿关闭按钮关闭工作簿 12 技巧46 禁用工作簿的关闭按钮 12 技巧47 保存工作簿的方法 12 47-1 使用Save方法 12 47-2 直接保存为另一文件名 12 47-3 保存工作簿副本 12 技巧48 保存指定工作表为工作簿文件 12 技巧49 打印预览时不触发事件 12 技巧50 设置工作簿文档属性信息 12 技巧51 不打开工作簿取得其他工作簿数据 12 51-1 使用公式 12 51-2 使用GetObject函数 12 51-3 隐藏Application对象 12 51-4 使用ExecuteExcel4Macro方法 12 51-5 使用SQL连接 12 技巧52 返回窗口的可视区域地址 12 第4章 Shape(图形)、Chart(图表)对象 12 技巧53 在工作表添加图形 12 技巧54 导出工作表的图片 12 技巧55 在工作表添加艺术字 12 技巧56 遍历工作表的图形 12 技巧57 移动、旋转图片 12 技巧58 工作表自动插入图片 12 技巧59 固定工作表图形的位置 12 技巧60 使用VBA自动生成图表 12 技巧61 使用独立窗口显示图表 12 技巧62 导出工作表的图表 12 技巧63 多图表制作 12 第5章 Application对象 12 技巧64 取得Excel版本信息 12 技巧65 取得当前用户名称 12 技巧66 Excel的“定时器” 12 技巧67 设置活动打印机的名称 12 技巧68 屏蔽、改变组合键的功能 12 技巧69 设置Excel窗口标题栏 12 技巧70 自定义Excel状态栏 12 技巧71 灵活退出Excel 12 技巧72 隐藏Excel主窗口 12 72-1 设置Application对象的Visible属性 12 72-2 将窗口移出屏幕 12 72-3 设置工作簿作为加载宏运行 12 第6章 使用对话框 12 技巧73 使用Msgbox函数 12 73-1 显示简单的提示信息 12 73-2 定制个性化的消息框 12 73-3 获得消息框的返回值 12 73-4 在消息框排版 12 73-5 对齐消息框显示的信息 12 技巧74 自动关闭的消息框 12 74-1 使用WshShell.Popup方法显示消息框 12 74-2 使用API函数显示消息框 12 技巧75 使用InputBox函数 12 75-1 简单的数据输入 12 75-2 使用对话框输入密码 12 技巧76 使用InputBox方法 12 76-1 输入指定类型的数据 12 76-2 获得单元格区域地址 12 技巧77 内置对话框 12 77-1 调用内置的对话框 12 77-2 获取选定文件的文件名 12 77-3 使用“另存为”对话框 12 技巧78 调用操作系统“关于”对话框 12 第7章 菜单和工具栏 12 技巧79 在菜单添加菜单项 12 技巧80 在菜单栏指定位置添加菜单 12 技巧81 屏蔽和删除工作表菜单 12 技巧82 改变系统菜单的操作 12 技巧83 定制自己的系统菜单 12 技巧84 改变菜单按钮图标 12 技巧85 右键快捷菜单增加菜单项 12 技巧86 自定义右键快捷菜单 12 技巧87 使用右键菜单制作数据有效性 12 技巧88 禁用工作表右键菜单 12 技巧89 创建自定义工具栏 12 技巧90 自定义工具栏按钮图标 12 技巧91 自定义工作簿图标 12 技巧92 移除工作表的最小最大化和关闭按钮 12 技巧93 在工具栏上添加下拉列表框 12 技巧94 屏蔽工作表的复制功能 12 技巧95 禁用工具栏的自定义 12 技巧96 屏蔽所有的命令栏 12 技巧97 恢复Excel的命令栏 12 第8章 控件与用户窗体 12 技巧98 限制文本框的输入 12 技巧99 文本框添加右键快捷菜单 12 技巧100 文本框回车自动输入 12 技巧101 自动选择文本框内容 12 技巧102 设置文本框数据格式 12 技巧103 限制文本框的输入长度 12 技巧104 将光标返回文本框 12 技巧105 文本框的自动换行 12 技巧106 多个文本框数据相加 12 技巧107 控件跟随活动单元格 12 技巧108 高亮显示按钮 12 技巧109 组合框和列表框添加列表项的方法 12 109-1 使用RowSource属性添加列表项 12 109-2 使用List属性添加列表项 12 109-3 使用AddItem方法添加列表项 12 技巧110 去除列表框数据源的重复值和空格 12 技巧111 移动列表框条目 12 技巧112 允许多项选择的列表框 12 技巧113 多列组合框和列表框的设置 12 113-1 多列组合框和列表框添加列表项 12 113-2 多列列表框写入工作表 12 技巧114 输入时逐步提示信息 12 技巧115 二级组合框 12 技巧116 使用DTP控件输入日期 12 技巧117 使用RefEdit控件选择区域 12 技巧118 如何注册控件 12 技巧119 遍历控件的方法 12 119-1 使用名称的变量遍历控件 12 119-2 使用对象类型遍历控件 12 119-3 使用程序标识符遍历控件 12 119-4 使用名称的变量遍历图形 12 119-5 使用FormControlType属性遍历图形 12 技巧120 使微调框最小变动量小于1 12 技巧121 不打印工作表的控件 12 121-1 设置控件格式 12 121-2 设置控件的printobjcet属性 12 技巧122 在框架使用滚动条 12 技巧123 使用多页控件 12 技巧124 标签文字垂直居对齐 12 技巧125 使用TabStrip控件 12 技巧126 显示GIF动画图片 12 技巧127 播放Flash文件 12 技巧128 在工作表添加窗体控件 12 128-1 使用AddFormControl方法 12 128-2 使用Add方法 12 技巧129 在工作表添加ActiveX控件 12 129-1 使用Add方法 12 129-2 使用AddOLEObject方法 12 技巧130 使用spreadsheet控件 12 技巧131 使用Listview控件 12 131-1 使用Listview控件显示数据列表 12 131-2 在Listview控件使用复选框 12 131-3 调整Listview控件的行距 12 131-4 在Listview控件排序 12 131-5 Listview控件的图标设置 12 技巧132 调用非模式窗体 12 技巧133 进度条的制作 12 133-1 使用进度条控件 12 133-2 使用标签控件 12 技巧134 使用TreeView控件显示层次 12 技巧135 用户窗体添加图标 12 技巧136 用户窗体添加最大最小化按纽 12 技巧137 禁用窗体标题栏的关闭按钮 12 技巧138 屏蔽窗体标题栏的关闭按钮 12 技巧139 无标题栏和边框的窗体 12 技巧140 制作年月选择窗体 12 技巧141 自定义窗体的鼠标指针类型 12 技巧142 调整窗体的显示位置 12 技巧143 由鼠标确定窗体显示位置 12 技巧144 用户窗体的打印 12 技巧145 使用自定义颜色设置窗体颜色 12 技巧146 在窗体显示图表 12 146-1 使用Export方法 12 146-2 使用API函数 12 技巧147 窗体运行时调整控件大小 12 技巧148 在用户窗体上添加菜单 12 技巧149 在用户窗体上添加工具栏 12 技巧150 使用代码添加窗体及控件 12 技巧151 用户窗体的全屏显示 12 151-1 设置用户窗体为应用程序的大小 12 151-2 根据屏幕分辨率进行设置 12 技巧152 在用户窗体上添加状态栏 12 第9章 函数的使用 12 技巧153 调用工作表函数求和 12 技巧154 查找最大、最小值 12 技巧155 不重复值的录入 12 技巧156 获得当月的最后一天 12 技巧157 四舍五入运算 12 157-1 极小值修正法 12 157-2 调用工作表函数法 12 技巧158 使用字符串函数 12 技巧159 使用日期函数 12 技巧160 判断是否为数值 12 技巧161 格式化数值、日期和时间 12 技巧162 个人所得税自定义函数 12 技巧163 人民币大写函数 12 技巧164 列号转换为列标 12 技巧165 判断工作表是否为空表 12 技巧166 查找指定工作表 12 技巧167 查找指定工作簿是否打开 12 技巧168 取得应用程序的安装路径 12 技巧169 数组的使用 12 169-1 代码运行时创建数组 12 169-2 文本转换为数组 12 169-3 使用动态数组去除重复值 12 第10章 文件操作 12 技巧170 导入文本文件 12 170-1 使用查询表导入 12 170-2 使用Open 语句导入 12 170-3 使用OpenText方法 12 技巧171 将数据写入文本文件 12 171-1 使用Print # 语句 12 171-2 另存为文本文件 12 技巧172 文件修改的日期和时间 12 技巧173 查找文件或文件夹 12 技巧174 获得当前文件夹的名称 12 技巧175 创建和删除文件夹 12 技巧176 重命名文件或文件夹 12 技巧177 复制指定的文件 12 技巧178 删除指定的文件 12 技巧179 搜索特定的文件 12 技巧180 使用WSH处理文件 12 180-1 获取文件信息 12 180-2 查找文件 12 180-3 移动文件 12 180-4 复制文件 12 180-5 删除文件 12 180-6 创建文件夹 12 180-7 复制文件夹 12 180-8 移动文件夹 12 180-9 删除文件夹 12 180-10 导入文本文件 12 180-11 创建文本文件 12 第11章 其他应用 12 技巧181 取得电脑名称 12 技巧182 取得逻辑盘序列号 12 技巧183 使用API取得硬盘信息 12 技巧184 使用数字签名 12 技巧185 暂停代码的运行 12 技巧186 定时关机 12 技巧187 打开指定的网页 12 技巧188 VBE的操作 12 188-1 添加模块和过程 12 188-2 建立事件过程 12 188-3 模块的导入与导出 12 188-4 删除宏代码 12 技巧189 保护VBA代码 12 189-1 设置工程密码 12 189-2 设置“工程不可查看” 12 技巧190 优化代码 12 190-1 关闭屏幕刷新 12 190-2 使用工作表函数 12 190-3 使用更快的单元格操作方法 12 190-4 使用With语句引用对象 12 190-5 少用激活或选择语句 12 技巧191 取得文件的基本名称 12 技巧192 防止用户断代码运行 12 技巧193 加班费计算表 12 技巧194 制作发放条 12 技巧195 费用统计表 12 技巧196 职工花名册 12 技巧197 收据系统 12 技巧198 职工考勤系统 12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值