分析 "End" "Unload Me" "Exit Sub" 之间的区别与联系

本文详细解析了VBA中End、Unload Me、EndSub及ExitSub等关键字的区别与用法,帮助读者理解如何正确地结束程序流程或窗体,以及如何在过程中进行灵活的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

              之前就想过这个问题,这么熟悉的几个东西居然对他们分析的不是很透彻、 “End”  跟  “Unload  Me”  在敲程序的时候经常敲到,“exit  sub”  更是熟悉,下面,解析:

 

 

         End  跟 Unload me

        

         End是强制结束整个程序,而Unload Me是卸载当前窗体,当程序中最后一个窗体被卸载后,整个程序将自动结束,如果当前窗体不是程序中的最后一个窗体,程序是不会结束的

 

         简单的就是end 是全部结束、 unload me针对当前窗口

 

         相对来说,End是强制关闭,不会发生Form_Unload和Form_Terminate事件而Unload Me关闭前会发生上面2个事件。可以在上面的事件中加入退出处理代码最后加一点adodc 控件的使用说明可以增加,修改,显示 等...

 

 

          End sub  跟  Exit sub

 

          对于每个过程,End Sub必须有且必须只有一个,而 Exit Sub 可以有也可以没有,可以有一个,也可以有很多个、

 

          End Sub  表示过程代码的结束, 这个必须有Exit Sub 表示退出过程,若被执行,则其下的属于该过程的代码不会被执行,通常用于中间判断例如满足某些条件时,直接退出过程而不执行其下代码、

 

 

           另外呢,有一个很有趣的说法:

 

                                  Exit Sub = 逃兵 或 中途跳伞

                                  End Sub = 结束战斗

 

 

            最后:

 

                           及其简单的说:

 

                            Unload me  卸载自己 也就是卸载当前窗体

 

                            Exit sub   结束过程 / 跳出这个过程 

 
                            End      结束全部

 

 

         

 

 

``` Option Explicit Private Sub btnStart_Click() Dim diameterA As Double Dim diameterB As Double ' 获取输入的直径 On Error Resume Next diameterA = CDbl(txtDiameterA.Text) diameterB = CDbl(txtDiameterB.Text) On Error GoTo 0 If diameterA <= 0 Or diameterB <= 0 Then MsgBox "请输入有效的直径数值!", vbExclamation, "错误" Exit Sub End If Dim acadApp As Object Dim acadDoc As Object Dim selSet As Object Dim filterType(0) As Integer Dim filterData(0) As Variant Dim obj As Object Dim circ As Object Dim newCirc As Object Dim centerPoint As Variant Dim newCenter(0 To 2) As Double Dim radius As Double Dim newRadius As Double ' 获取AutoCAD应用程序对象 Set acadApp = ThisDrawing.Application Set acadDoc = acadApp.ActiveDocument ' 允许用户选择对象 On Error Resume Next filterType(0) = 0 ' 过滤对象类型 filterData(0) = "CIRCLE" acadDoc.Utility.Prompt "请框选查找6.4mm圆的区域..." Set selSet = acadDoc.SelectionSets.Add("MySelectionSet") selSet.SelectOnScreen filterType, filterData ' 遍历选定对象 If selSet.count > 0 Then For Each obj In selSet If TypeOf obj Is AcadCircle Then Set circ = obj radius = circ.radius ' 检查是否是直径6.4mm的圆 If Abs(radius * 2 - diameterA) < 0.001 Then centerPoint = circ.center newRadius = diameterB ' 新圆的半径为1mm的一半 ' 计算新圆心,使新圆位置 newCenter(0) = centerPoint(0) + radius '+ newRadius newCenter(1) = centerPoint(1) newCenter(2) = centerPoint(2) ' 创建新圆 Set newCirc = acadDoc.modelSpace.AddCircle(newCenter, newRadius) newCirc.color = 1 ' 设为红色以便区分 End If End If Next Else acadDoc.Utility.Prompt "未找到符合条件的圆!" End If ' 清理选择集 selSet.Delete End Sub Private Sub btnExit_Click() Unload Me End Sub```这是AutoCAD的vba代码,运行没有报错,但是也不能有效执行命令,检查一下错误
03-09
Option Explicit ' 声明Windows API函数 Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long) Private WithEvents Timer1 As MSForms.Timer Private wsh As Object Private objWnd As Object Private LastSwitchTime As Date ' 记录上次切换时间 Private Sub Form_Load() On Error Resume Next Set wsh = CreateObject("WScript.Shell") ' 创建提示窗口 Set objWnd = wsh.Exec("mshta.exe ""about:<title>运行中</title><body bgcolor=white><center><h1>运行中</h1><p>自动打开网页并切换标签页<br>每分钟自动切换标签页<br>关闭此窗口停止程序</p></center><script>window.resizeTo(800,400);window.moveTo((screen.width-800)/2,(screen.height-400)/2);</script>""") If Err.Number <> 0 Then MsgBox "提示窗口创建失败: " & Err.Description Exit Sub End If ' 初始化定时器 Set Timer1 = New MSForms.Timer Timer1.Interval = 1000 ' 1秒检测一次 Timer1.Enabled = True ' 打开浏览器窗口 OpenBrowserUrls End Sub Private Sub OpenBrowserUrls() Dim browserPath As String Dim urls(1 To 4) As String ' 4个URL browserPath = GetEdgePath() ' 动态获取Edge路径 ' 简化的URL(实际使用时替换为完整URL) urls(1) = "http://192.168.10.81/decision/view/form?viewlet=..." ' 当日出勤 urls(2) = "http://192.168.154.11:4000/gridWebAndon/revoAssembly_Allparts" ' #12线装配安东 urls(3) = "http://192.168.10.81/decision/view/form?viewlet=..." ' 人员管理板 urls(4) = "http://192.168.154.11:5000/gridWebAndon/revoAllparts" ' #12线加工安东 Dim i As Integer For i = 1 To 4 ' 打开浏览器窗口 wsh.Run Chr(34) & browserPath & Chr(34) & " " & Chr(34) & urls(i) & Chr(34) DoEvents ' 等待页面加载 Sleep 2000 ' 确保窗口激活后再发送F11 ActivateEdgeWindow Sleep 500 ' 短暂延迟确保激活完成 wsh.SendKeys "{F11}" Next i ' 额外确保最后一个窗口全屏 ActivateEdgeWindow Sleep 500 wsh.SendKeys "{F11}" LastSwitchTime = Now ' 初始化切换时间 End Sub ' 动态获取Edge浏览器路径 Private Function GetEdgePath() As String On Error Resume Next ' 尝试从注册表获取Edge路径 GetEdgePath = wsh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe\") If Err.Number <> 0 Or GetEdgePath = "" Then ' 如果注册表获取失败,尝试备用路径 GetEdgePath = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" End If End Function ' 激活Edge窗口 Private Sub ActivateEdgeWindow() Dim maxAttempts As Integer maxAttempts = 5 Do While maxAttempts > 0 On Error Resume Next wsh.AppActivate "Microsoft Edge" If Err.Number = 0 Then Exit Do Sleep 1000 maxAttempts = maxAttempts - 1 Loop End Sub Private Sub Timer1_Timer() ' 每1分钟切换一次标签页 If DateDiff("s", LastSwitchTime, Now) >= 60 Then ActivateEdgeWindow Sleep 500 ' 确保窗口激活 wsh.SendKeys "^{TAB}" ' Ctrl+Tab切换标签页 LastSwitchTime = Now End If End Sub ' 自定义Sleep函数(毫秒) Private Sub Sleep(ms As Long) Dim endTime As Date endTime = DateAdd("s", ms / 1000, Now) Do While Now < endTime DoEvents Loop End Sub ' 窗体卸载时清理资源 Private Sub Form_Unload(Cancel As Integer) If Not objWnd Is Nothing Then If objWnd.Status = 0 Then objWnd.Terminate End If Set Timer1 = Nothing Set wsh = Nothing End Sub 语句未结束
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值