-
Excel VBA 中有关使用 UBound + CurrentRegion 提示类型不匹配的问题及解决方案
2020-06-09 16:42:04先来说一下解决方案:使用 CurrentRegion.Value 即可。 -------- 今天需要在 Excel 里放一个小程序,于是在网上边搜 VBA 边写程序。 其中一步要获取“单元格所在列的最后一行的...类型不匹配? 于是我想调一下监视.先来说一下解决方案:使用 CurrentRegion.Value 即可。
--------
今天需要在 Excel 里放一个小程序,于是在网上边搜 VBA 边写程序。
其中一步要获取“单元格所在列的最后一行的行数”,网上给了很多方法,其中一个是用求上限函数:Ubound(数组,位置)
按照文章的方法,我可以写:
rowMax = UBound(Worksheets(1).Range("b2").CurrentRegion, 1)
但是运行的时候系统提示:
类型不匹配?
于是我想调一下监视窗口,结果点了半天屏幕没反应……后来才发现是在窗口的最下面的那一小条,拉起来……(感觉好傻哈哈)
经过查询发现,如果只写到“CurrentRegion”,那么类型是variant/object/range,但是如果后面再写上".value"的话,类型则是variant/variant(1 to 40, 1 to 4),就解决了。仔细查了一下函数里的内容,发现竟然没有 value 属性,但是有 value2,而且在后面写“.value2”也是可以的。Hmm, interesting...
我用的版本是买电脑送的Office 2019 家庭学生版
-
执行VBA脚本代码提示“类型不匹配”
2010-10-15 14:53:15昨天领导开会,谈论关于运营支撑系统的报表... 会议期间领导提出可以使用VBA来实现,而领导对VBA也是了解不多,而Ricki则是一点具体的概念也没有,只听说过VB,呵呵!领导说了,这份功能由他来实现,而且必须当天...昨天领导开会,谈论关于运营支撑系统的报表数据处理的需求问题,也就是把一张excel表中的数据复制到另外一张excel表中,人工也可以操作,为了解放这份劳动力,运营支撑部门的领导要求用程序来实现这个功能。
会议期间领导提出可以使用VBA来实现,而领导对VBA也是了解不多,而Ricki则是一点具体的概念也没有,只听说过VB,呵呵!领导说了,这份功能由他来实现,而且必须当天内实现从一张表中取数据并复制到另外一张表中,并保存的。
说实在,听后压力蛮大,不过领导也把他所知道的如何在excel中录制宏、执行宏、生成启动宏的工作薄一一的告诉了Ricki,听后感觉也真如领导说的那样,“so easy”,呵呵,天底下的领导都是这样的!
话说了这么多,还是切入正题吧!
因为没有使用过VBA,录制过程中,虽然代码是自动产生的,但也要做相应的修改。如当前需要“广州”炫铃的信息费数据,那么到另外一张表中,必须去查找“广州”这个地市在哪行,并定位到该地市的信息费在哪行哪列。
由于有多个地市,所以必须遍历比较,使用了for和if。如:
For Row = 9 To 29 Step 1
If Range("B" + Row).Value = "广州" Then
Range("AH" + Row).Select
Exit For
End If
Next Row
执行的时候,在Range("B" + Row).Value报类型不匹配。后在网上查找,发现不能用+号(虽然帮助文档说+号是连接运算符),数字和字符串连接的话只能使用&,改后如下:
For Row = 9 To 29 Step 1
If Range("B" & Row).Value = "广州" Then
Range("AH" & Row).Select
Exit For
End If
Next Row
使用+号,会包“B”转为数字,然后相加。这跟Javascript不一样,如:
<script>
var i = 1;
var j = "AH";
document.write(j+i);
document.write("<br/>");
document.write(i+j);
</script>
结果:AH1
1AH
今天看到一篇很搞笑的文章,在此也跟大家分享一下《[url=http://hongfanshu.blogbus.com/logs/78875298.html]令人喷饭的程序注释[/url]》 -
如何调试Excel VBA代码
2019-06-03 03:08:50Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试。...类型不匹配:函数输入的参数与定义时的参数类型不同时会出现该类错误。 变量未定义:指使用了没有申明的变量类型(当Option Expli...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=AA1",然后引用Range(“abc”)。
避免使用ActiveSheet, ActiveWorkbook等可变变量,用Sheet1,ThisWorkbook这种绝对变量。绝对变量不受外界操作影响。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语句退出已产生错误的过程,但这些语句应放在错误处理程序之前,这样当未产生错误时就不会执行错误处理程序。 -
中文版Excel.2007高级VBA编程宝典 1/2
2012-04-06 16:00:16本书的作者是当之无愧的世界级Excel电子表格专家,他为读者倾心打造了这本专著,书中汇聚他15年来使用Excel的所有经验,涵盖Excel应用和VBA编程涉及的方方面面,是经典著作Excel 2003 Power Programming with VBA的... -
中文版Excel.2007高级VBA编程宝典 2/2
2012-04-06 16:41:38本书的作者是当之无愧的世界级Excel电子表格专家,他为读者倾心打造了这本专著,书中汇聚他15年来使用Excel的所有经验,涵盖Excel应用和VBA编程涉及的方方面面,是经典著作Excel 2003 Power Programming with VBA的... -
VBSCRIPT中文手册
2010-11-12 10:13:06InputBox 函数 在对话框中显示提示,等待用户输入文本或者单击按钮,并返回文本框的内容。 InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的... -
VBScript 语言参考中文手册CHM
2009-04-18 12:32:49InputBox 函数 在对话框中显示提示,等待用户输入文本或者单击按钮,并返回文本框的内容。 InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的... -
MYSQL中文手册
2013-03-11 21:21:342.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在... -
mysql官方中文参考手册
2009-04-11 11:59:1813.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 ... -
mysql5.1中文手册
2008-01-09 09:54:20选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除... -
MySQL 5.1官方简体中文参考手册
2010-07-02 09:10:242.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从... -
Excel百宝箱9.0无限制破解版
2012-02-03 19:05:29【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
Excel百宝箱
2012-10-27 17:09:21【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
vb Script参考文档
2009-07-28 22:13:02InputBox 函数 在对话框中显示提示,等待用户输入文本或者单击按钮,并返回文本框的内容。 InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的... -
VBSCRIP5 -ASP用法详解
2010-09-23 17:15:46InputBox 函数 在对话框中显示提示,等待用户输入文本或者单击按钮,并返回文本框的内容。 InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的... -
Excel百宝箱9.0无限制破解版.rar
2012-09-05 09:31:51【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行... -
VBScript 语言参考
2008-10-07 21:30:05InputBox 函数 在对话框中显示提示,等待用户输入文本或者单击按钮,并返回文本框的内容。 InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的... -
-
Exce百宝箱——2012版本.rar
2012-10-19 19:52:33【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
Excel百宝箱 9.0 破解版 批量导入图片等200种功能
2013-05-11 22:46:24动画嵌入工作表中,删除FLASH原文件不影响Excel中的效果 【提取选区不重复值】将选择区域的数据,置于当前列中,忽略重复值 【清除列中重复值】将选择中重复出现的数据删除(提供保留第一次出现还是最后一次出现的... -
excel 工具箱
2012-01-22 15:04:34【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
EXCEL百宝箱8.0终极版
2011-11-05 16:48:02【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
Excel百宝箱8.0
2011-06-07 21:32:17【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行... -
Access 2000数据库系统设计(PDF)---001
2006-02-23 15:31:041246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和... -
Access 2000数据库系统设计(PDF)---003
2006-02-23 15:31:041246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和... -
Access 2000数据库系统设计(PDF)---031
2006-02-23 15:31:041256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和排序 1326.5.4 添加一个多字段... -
Access 2000数据库系统设计(PDF)---016
2006-02-23 15:31:041256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和排序 1326.5.4 添加一个多字段... -
Access 2000数据库系统设计(PDF)---011
2006-02-23 15:31:041256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和排序 1326.5.4 添加一个多字段...