首页 > 其他分享 >VBA调试技巧

VBA调试技巧

时间:2024-03-09 22:25:03浏览次数:23  
标签:VBA End 技巧 代码 arr lastRow 调试 Sub

我们写VBA代码的时候,很少会一次性就能通过,往往执行报错,然后找BUG

这里我们就说说一些常用的VBA代码调试技巧

一,代码书写上的误区

1,喜欢嵌套写代码

因为公式写的比较多,我们往往喜欢嵌套来书写代码

比如,下面案例

Sub test()
  Dim arr
  arr = Range("a1:b" & Cells(Rows.Count, 1).End(3).Row).Value

End Sub

上面代码我们把得到最大单元格写到一行里,但是如果我们的最大单元格按C列判断的时候,上面代码就出问题了,但是我们调试的时候,是看不出Cells(Rows.Count, 1).End(3).Row这句代码值是多少?

造成我们找半天才发现,最大行有问题(还有很多嵌套用的情况,这个案例可能不明显)

比较好调试的写法

Sub test()
  Dim arr, lastRow
  lastRow = Cells(Rows.Count, 1).End(3).Row
  arr = Range("a1:b" & lastRow).Value

End Sub

拆分成2行来书写,每一步都能看到返回值

2,不开启强制变量声明

位置在工具,选项里

这个要勾选

不强制,你定不定义变量都可以,但是,我们如果写一个比较复杂的程序的时候,变量比较多

比如我们定义了个dic,但是写的过程中变成了fic,没声明不会报错,我们程序会错,还检查不出来,这是调试中比较难发现的错误

我们强制定义勾选了,这种写错,没定义的,执行时就会报错了,一下就看出来了

二,调试的技巧

1,调出调试和注释菜单

如上图,在空白菜单鼠标右键,勾选编辑和调试

2,代码单步执行

如上图位置,点击可以单步执行,快捷键是F8

3,过程调试

如上图位置,点击可以直接执行整个SUB或者FUNCTION,不需要跳进去单步执行,快捷键Shist+F8

Sub test()
  Dim arr, lastRow
  lastRow = GetLastRow(ActiveSheet, 1) '我已经知道这个函数肯定没问题,就直接过程执行得到结果就好了
  arr = Range("a1:b" & lastRow).Value

End Sub

Function GetLastRow(sht As Worksheet, col)
  GetLastRow = sht.Cells(sht.Rows.Count, col).End(3).Row
End Function
  • lastRow = GetLastRow(ActiveSheet, 1) 这里就可以直接快捷键Shist+F8跳过就好了

4)跳出执行

如上图位置,快捷键Ctrl+Shift+F8

这个是什么意思呢?

就比如调试的时候,我们执行到另外一个程序里了,这个程序没问题,我们点击这个就一口气执行完这个程序,回到主函数里

三,辅助查看

1,本地窗口

当我们调试的时候,本地窗口就能看到我们定义的变量值,方便我们查看那些变量出了问题

2,监视窗口

当我们一些变量希望能单独查看,不要在这么多变量一起

我们可以点击变量,鼠标右键,添加监视

这个窗口我们比较常用的是字典查看item的值的是,因为本地窗口是看不到字典的item的

添加监视的时候,我们自己写dic.items就好,就能查看了

3,立即窗口

这个窗口就用处非常多了,可以这么说,可以没有本地窗口和监视窗口,但是如果没立即窗口,调试效率直接少一半

我们常用立即窗口打印变量值

  1. Debug.Print 语句打印
Sub test()
  Dim arr, lastRow
  lastRow = GetLastRow(ActiveSheet, 1)
  Debug.Print lastRow
  arr = Range("a1:b" & lastRow).Value

End Sub

上面代码我们通过Debug.Print 语句打印变量lastRow值到立即窗口

  1. 前面加问号直接查看

上面代码,我们单步执行的时候,想看前面lastRow变量的值,直接立即窗口输入?lastRow回车,就直接可以查看变量值,也可以这样执行一个function函数,直接查看函数的值

执行语句或者程序

执行某个语句

比如我们调试的过程,关闭了屏幕刷新,这个时候看不到Excel界面显示的,需要临时打开屏幕刷新

我们就可以直接在立即窗口执行语句application.ScreenUpdating=True,就打开屏幕刷新

执行某个程序

直接立即窗口,输入程序名字,回车就可以了

四,断点

什么是断点?

我们想让程序执行过程中在某处停止,就可以在那行代码上打一个断点

如何打断点?

  • 左侧边栏,需要停止位置点击鼠标右键就可以了

    • 鼠标放到要断点代码位置,点击上图位置,或者快捷键F9

上面2种方法都可以

不打断点可不可以直接执行到某行?

可以的,我们在单步调试的过程中,鼠标当到要执行的位置,鼠标右键,点运行到光标处

还有没有其他方法,让代码某处停止?

还是有的,stop语句

Sub test()
  Dim arr, lastRow
  lastRow = GetLastRow(ActiveSheet, 1)
  Debug.Print lastRow
  arr = Range("a1:b" & lastRow).Value
  Stop
End Sub

上面代码直接运行,就会在stop处停止

stop语句在什么时候用?

一些复杂的需要停止的时候,比如我们希望最后一行如果不是9的时候才停止,否则不停止

Sub test()
  Dim arr, lastRow
  lastRow = GetLastRow(ActiveSheet, 1)
  
  If lastRow <> 9 Then Stop
  Debug.Print lastRow
  arr = Range("a1:b" & lastRow).Value
End Sub

上面代码就做个了一个判断,满足条件才停止,这个在我们代码调试过程中是经常用的技巧

标签:VBA,End,技巧,代码,arr,lastRow,调试,Sub
From: https://www.cnblogs.com/lyfegf/p/18063483

相关文章

  • cnpack支持调试状态查看TDataSet对象
    在Debug状态下,cnpack支持查看TDataSet对象了!具体用法:在Debug状态下运行项目,如下图:把鼠标放到q对象上,q是一个基于TDataSet继承来的TkbmMWClientQuery对象,也就是他是一个TDataSet,这时候会弹出一个窗口,也就是一个hint。注意左上角的放大镜,下移鼠标,让鼠标进入hint区域,点击放大镜......
  • 9个提高代码运行效率的小技巧你知道几个?
    我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中,我们必须考虑代码使用的方式,以及影响它的关键因素。通常,我们必须在程序的简洁性与它的运行速度之间做出权衡。今天我们就来聊一聊如何优化程序的......
  • 使用 Visual Studio 2022 直接调试 WebAPI
    参考资料https://learn.microsoft.com/zh-cn/aspnet/core/test/http-files?view=aspnetcore-8.0在没有Postman等专门软件环境下,有没有轻量的调试http方法呢?尤其是每天都要打开宇宙第一IDE的环境,其实VS本身就带了一种方式,就是创建一个http文件来完成这个工作.VisualStud......
  • LLM 加速技巧:Muti Query Attention
    前言 MQA是19年提出的一种新的Attention机制,其能够在保证模型效果的同时加快decoder生成token的速度。在大语言模型时代被广泛使用,很多LLM都采用了MQA,如Falcon、PaLM、StarCoder等。本文转载自DeephubImba作者:FlorianJune仅用于学术分享,若侵权请联系删除欢迎关注......
  • Advanced .Net Debugging 3:基本调试任务(对象检查:内存、值类型、引用类型、数组和异常
    一、介绍这是我的《Advanced.NetDebugging》这个系列的第四篇文章。今天这篇文章的标题虽然叫做“基本调试任务”,但是这章的内容还是挺多的。由于内容太多,故原书的第三章内容我分两篇文章来写。上一篇我们了解了一些调试技巧,比如:单步调试、下断点、过程调试等,这篇文章主......
  • Python魔法:20个让你编程事半功倍的奇淫技巧(建议收藏)
    Python作为一门灵活、充满技巧的语言,有着很多奇技淫巧,今天小编就跟大家分享一下在平时工作中所积累的技巧,这里面既有语法上的技巧,也有库函数的应用,可以帮助大家在平时的工作中提升效率,规避某些错误,一起来看看吧。列表推导式字典推导式使用zip进行并行迭代使用enumerate获......
  • Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
    Java用户输入(Scanner)简介Scanner类用于获取用户输入,它位于java.util包中。使用Scanner类要使用Scanner类,请执行以下步骤:导入java.util.Scanner包。创建一个Scanner对象,并将其初始化为System.in。使用Scanner对象的方法读取用户输入。示例importjava.ut......
  • 接口调试工具
    Apifox将数据库备注导入apifox常用参数SELECTdistinctCOLUMN_NAME,table_name,DATA_TYPE,COLUMN_COMMENT,CONCAT(COLUMN_NAME,',',COLUMN_COMMENT)as'apifox常用参数'FROMinformation_schema.COLUMNSWHEREtable_schema......
  • Vue调试神器vue-devtools配置 / 解决提示 Download the Vue Devtools extension for a
    访问Vue页面,控制台提示:    ......
  • postman 调试pigx
    1.Postman(1)Posthttp://localhost:5635/admin/timeLineData/setTimeLine(2)HeadersContent-Typeapplication/json(3)BodyRawJSON{"receiveBillId":"1","billId":"2","createTime":"......