如何调试Excel VBA代码

Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试。

1.编译错误
常见的编译错误有:
错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色。
错误的语法结构,比如if和end if没有对应上:代码运行前会给出编译错误提示。
类型不匹配:函数输入的参数与定义时的参数类型不同时会出现该类错误。
变量未定义:指使用了没有申明的变量类型(当Option Explicit时)

建议:
格式规范化,严格缩进。VBA插件Smart Indent是一个很好的辅助工具。这样做让源代码更具备可读性,从而更快检测源代码格式和语法结果错误,。
勾选上「工具——选项——编译器——要求变量声明」,或者在每个代码模块最前面手工加上 Option Explicit 。在代码编辑中,很多错误只是因为手误,这个选项会让编译器强制检查变量申明,从而在编译时便发现错误。

2.运行中出错或者运行结果错误
当程序编译没有问题,但运行中出错或者运行的结果与想象中不符,就需要用到VBA的调试功能。下面是VBA提供的几个重要的调试功能,这些功能能让程序停在某些特定的位置上等待检查:
F9:设置程序断点,在代码左侧栏点击有相同效果。重新按F9即取消断点。
F8:单步跟踪,当调用子函数会跟踪到子函数内部
Shift+F8:单步跟踪,但不会进入子函数内部
Ctrl+Shift+F8:跳出正在跟踪的函数,直接返回上一层函数。
F5:运行程序,直到出现错误、程序结束或程序断点为止
Ctrl+F8:运行程序,直到出现错误、程序结束、程序断点或当前光标所在行为止
debug.print var:在立即窗口中显示var的值
debug.assert var:当var==false时程序自动停止

以上命令也可在菜单和命令栏中获取。
在调试过程中,可通过下面几种方法查看各个变量的值,当变量和预期不一样时,也就找到了程序出错的原因,便能对照修改:

立即窗口(快捷键Ctrl+G):在该窗口里会显示debut.print的结果值,以及随时计算和运行代码。在代码前面添加「?」,可以在立即窗口中显示运行结果。
监视窗口:可以将变量以及表达式添加到监视窗口,可以实时查看变量和表达式的值。支持将代码窗口里的变量和表达式拖入到见识窗口
本地窗口:本地窗口里可以查看目前的local变量和global变量的变量值。
编辑窗口:将鼠标停在编辑窗口的变量上可显示该变量的值。
有一些方法可减少程序错误以及降低调试的难度:
添加重要的代码注释。
源代码格式规范化,增加代码可读性。VBA插件Smart Indent是一个很好的辅助工具。
尽可能声明变量类型,少用Variant变量。
注意函数的参数传递方式,默认为传引用,子函数会修改变量的值。
尽量将功能函数化,不同的功能分开写。
避免在VBA中引用绝对地址,如Range("A1")。可先在Excel中定义名称"abc=$A$1",然后引用Range("abc")。
避免使用ActiveSheet, ActiveWorkbook等可变变量,用Sheet1,ThisWorkbook这种绝对变量。绝对变量不受外界操作影响。

出处:http://www.elsyy.com/s/article/view-2473-11703

========================================================================

VBA测试与错误处理

1.测试

测试代码,检查它是否正确。为确保代码能够正常作用,必须尽力模拟代码运行的不同环境,并检查其正确性。

程序中的错误一般分为如下几类:

(1)语法错误(如输入时关键字或标点符号拼写错误) 。

(2)编译错误(如使用对象的方法时,该对象并不支持这个方法) 。

(3)运行期间错误(如除0、打开或关闭并不存在的文档、关闭未打开的文档等) 。

(4)逻辑错误(逻辑锗误是最难查找的错误类型,它们是由程序中使用的逻辑引起的。

2.调试

要确保代码中的变量和表达式按照预想的方式运行,可以使用VBA中的各种调试工具跟踪它们。VBE有以下调试工具。

(1) 中断模式

①进入中断模式方法:在过程的开始位置按下F8键(“逐语句”执行)。使用“切断断点“(F9键或者单击当前空白指示器栏)。使用Stop语句。当过程运行时,按下Ctrl+Break键。使用运行期间错误MsgBox对话框。

②退出中断模式方法:从运行菜单中选择“运行子过程/用户窗体)”;或者按下F5键,或者单击“调试”工具栏上的“运行子过程/用户窗体”按钮。从“运行”菜单中选择“重新设置”选项,或者单击“调试”工具栏上的“重新设置”按钮。

(2) 单步执行过程

① 单步执行过程:从“调试”菜申中选择“逐过程”选项,或者按下Shift+F8键。

②跳出过程(跳过程剩余部份):从“调试”菜单中选择“跳出”选项,或者按下Ctrl十shift十F8键。

③运行到光标处(跳过一组语句):从“调试”菜单中选择“运行到光标处”或按下Ctrl+F8键。

④设置下一条语句为光标所指语句(要警惕会忽略不执行中间的语句):从“调试”菜单中选择“设置下一条语句”或者按下Ctrl十F9键。

⑤“显示下一条语句”选项指明下一个将要执行的语句是什么。当需要在程序窗口中监视很多过程、却丢失了跟踪时,就可使用这个调试功能。

(3) 监视过程

①“本地”窗口(显示当前过程中使用所有变量及其值,还会显示当前加载窗体和控件的属性。):从“视图”菜单中选“本地窗口”选项。

②“调用堆栈”对话框(查看所有活动的过程调用):从“视图”菜单中选“调用堆栈”或按下Ctrl+L键。

③“立即窗口”(可查询并设置变量值,创建或撤销对象,执行单行命令)。从“视图”菜单中选择“立即窗口”或按下Ctrl+G键。

④“监视窗口”(是一个调试工具,在中断模式下可使用它更改变量和表达式的值,以查看不同的值如何影响代码)。从“视图”菜单中选择。

3.预防错误

(1)注释 。

(2)缩进代码:Tab键或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Auto Indent(自动缩进)。

(3)使代码模块化。

(4)显式声明变量:使用Option Explicit语句,或启用工具菜单选“选项”编辑器选项卡中的“需要变量声明”复选框。

(5)避免使用变体Variant(当某变量可能包含NULL值时就只能惟一指定Variant类型了)。

(6)打开语法检查:启用工具菜单选“选项”编辑器选项卡中“自动语法检测”。

(7)谨防Dim陷阱:Dim str1, str2 As String   ‘并未声明str1变量。

4.错误处理

调试只能够发现可以预测的错误,要处理不可预测的和不可避免的错误时,就必须使用错误处理。通过启用错误处理,捕获并提示错误处理,可以使程序更健壮。就可以使应用程序更稳定、更健壮。如果应用程序中包含了好几个过程,那么可以考虑采用集中式错误处理程序。

(1) 捕获错误:On Error Goto line (On Error Goto 0会在当前过程禁用错误处理程序) 在这个语法中,line指定了发生运行期间错误时控制将跳转到的代码行。

(2) 编写错误处理程序:给用户显示错误信息;提示补救方法;允许继续或取消操作。使用Err对象:


属性


说明


Number


存储最后一个错误的数字ID。这是默认属性


Description


存储说明错误的有关信息


Source


包含发生了错误的对象名或应用程序名


HelpFile


包含帮助文件的名字


HelpContextID


包含错误号对应的帮助上下文ID


LastDLLError


包含最后一次调用DLL的系统错误代码

Raise方法可以让用户自定义错误处理信息,还可把错误处理信息传回调用过程: Err.Raise number[, source, description, helpFile, helpContext]

Clear方法清除Err对象的所有属性值:Err.Clear (当调用On Error, Exit Sub, Exit Function, Exit Property, Resume 等语句时,会自动调用Err.Clear方法。)

(3) 退出错误处理程序:

①0n error Resume:当错误处理程序已经修复错误后,可以用它来返回控制给引起错误的语句。但注意如果错误还在的话,会引起无限循环。

②0n error Resume Next:忽略错误语句,继续下一句。

③Resume [LineLabel]: 把控制传递给行标号(必须和Resume语句处在同一个过程中)所在点的语句。

④也可使用Exit Sub或者Exit Function甚至End语句退出已产生错误的过程,但这些语句应放在错误处理程序之前,这样当未产生错误时就不会执行错误处理程序。

出处:http://blog.163.com/xing_aixin/blog/static/372355052008377252250/

时间: 2024-10-16 06:39:43

如何调试Excel VBA代码的相关文章

Excel VBA代码无法保存

这些天接了一个需求,就是用EXCEL处理大量的数据,记录有8万多条,这样用手动的办法会累死,所以我就开始学一些VBA来处理问题. 我的电脑发现有一个故障,就是VBA的模块代码就是保存不了,你点保存时也不出错,但是在打开XLSM的文件时就会说打开遇到问题,EXCEL会尝试修复,然后我就从网上找半天,各种说法都有,害得我都把EXCEL 2016重新安装了一遍,最后我发现一个有趣的现象,如果我新建模块时用英文命名就不会出错,只要我是用默认的模块1名称,就是带中文,就出错.真是见了鬼了.如查有相同问题的

Excel VBA 数组下标越界出错

今天调试一段EXCEL VBA代码,在使用数组时总出现下标越界的报错,害得我查了半天,后来我把vba的本地窗口打开了,一下子就发现问题了. 其实代码很简单,就不写注释了. 当然,我能看出这个问题来,就是通过本地窗口, 注意这个红箭头,Count为0,所以这个数组就出错啦.解决问题很简单了,正则表达式写错了,呵呵,少了一个点. 呵呵,问题解决啦. 原文地址:https://blog.51cto.com/shadingyu/2460076

用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(二)

--将EXCEL VBA代码移植到VB.NET .NET是微软公司在2002年推出的全新编程框架,支持多种语言应用程序开发.使用Visual Basic在Microsoft .NET Framework上编程,这就是Visual Basic.NET,简称VB.NET. VB.NET是Microsoft Visual Studio .NET组件中的重要组成部分,是VB6.0的后续版本,VB.NET仍使用VB的基本语法,二者几乎在90%以上保持相似或相同,虽然Excel VBA代码不能完全像移植到V

[No0000C1]Excel 删除空白行和空白列VBA代码

在exce中删除空行和空列的方法有很多,相对而言删除空行较为简单,只需进行筛选,将空白行筛选出来,删除即可,但要删除空列比较困难.因为你不能按列进行筛选删除.Excel中没有这个功能.当然你可以用另外一种方法,就是按列进行排序将空白列排序在一起,然后删除,但这种方法面临着列的顺序被打乱的问题,吃力不讨好.本文将利用Excel中强大VBA功能来完成. 假设要删除如下图中的空白行或空白列: 文件->选项->自定义功能区->主选项卡->开发工具 插入按钮 表单控件或者ActiveX控件都

Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET

在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据. 我这里总结一下如何从VBA 代码中操作单元格的数据. 在VBA 代码中操作单元格需要用到Range 对象,Range 是Excel 库(即Excel.exe文件)提供的一个类,封装了对表单中单元格的所有操作.Range 对象可以是一个单元格,一行单元格,一列单元格,或者四方的连续的单元格范围,甚至是几个单元格范围组合在一起.至于一个具体的Range 对象到底代表什么,就看我们怎么构造它了.(注,Range 类不支持N

【Excel&VBA】VBA中常用代码

1:Excel表中数据的行列数 Sheets(1).UsedRange.Rows.Count Sheets(1).UsedRange.Columns.Count 或者, Sheets(1).Range("A65536").End(xlUp).Row Sheets(1).Range("A65536").End(xlUp).Column 需要说明的一点是,之前在给朋友Mac(苹果系统)上的Excel VBA编程时,用上面的代码会报错,只能采用下面那种写法: 2:拷贝 行

Excel VBA(宏):添加宏

写在前面: 1.编写宏,打开VBA,双击ThisWorkbook对当前工作薄进行编写宏:双击Sheet1,对整个sheet编写宏: 或者创建模块,在模块里,编写.调试代码. 打开VBA的方法见第一讲,结合常用窗口进行编写.调试. 2.部分对象有提示,如Dim a As,敲击空格后有提示. 3.所有宏要运行,必须启动宏.(2007版启动宏,点击表格左上角 "excel选项" "信任中心" "信任中心设置" "启用宏") 4.&q

别怕excel vba其实很简单(第2版)pdf

下载地址:网盘下载 内容简介  · · · · · · 对于大部分没有编程基础的职场人士来说,在学习VBA时往往会有很大的畏难情绪.本书正是针对这样的人群,用浅显易懂的语言和生动形象的比喻,并配合大量插画,对Excel中看似复杂的概念和代码,从简单的宏录制.VBA编程环境和基础语法的介绍,到常用对象的操作与控制.执行程序的自动开关-对象的事件.设计自定义的操作界面.调试与优化编写的代码,都进行了形象的介绍. 本书适合那些希望提高工作效率的职场人士,特别是经常需要处理和分析大量数据的用户,也适合财

excel vba 数据分析

(Visual Basic Application) VBA(Visual Basic for Application)是Microsoft Office系列软件的内置编程语言,其语法结构与Visual Basic编程语言互相兼容,采用的是面向对象的编程机制和可视化的编程环境. 第一节 标识符 一.定义 标识符是一种标识变量.常量.过程.函数.类等语言构成单位的符号,利用它可以完成对变量.常量.过程.函数.类等的引用. 二.命名规则 1)  字母打头,由字母.数字和下划线组成,如 A987b_2