VBA制作进度条的方法

文章介绍了VBA在Excel中设计进度条以优化数据处理过程,强调了实时反馈、预期管理、提升效率和增强用户信任感的重要性。展示了两种进度条样式,并详细解释了代码实现,包括使用DoEvents确保界面响应性。
摘要由CSDN通过智能技术生成

目录

0.《VBA实用编程技巧》专栏总纲 

1.设置进度条的优势 

2. VBA设计进度条的方法

2.1 窗体设计部分

2.2 代码设计部分

2.2.1 代码

2.2.2 代码关键部分讲解

0.《VBA实用编程技巧》专栏总纲 

        本文作为专栏《VBA实用编程技巧》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link:  

VBA实用编程技巧目录总纲-CSDN博客     

1.设置进度条的优势 

         图1-1 优美的进度条示例

        如图1-1,为自己的程序设计一个优美的进度条,不光只有视觉上的美感,还是有非常多的好处的。 进度条的好处主要体现在以下几个方面,如图1-2:
        (1)提供实时反馈:进度条可以实时显示任务的完成情况,用户无需猜测或等待,能够直观地了解任务进度。这种实时反馈有助于减少用户的不确定性和焦虑感,提升用户体验。
        (2)预期管理:通过进度条,用户可以预测任务完成所需的时间。这有助于用户更好地规划自己的时间和活动,避免因等待时间过长而产生不满或焦虑。
        (3)增加互动性:进度条为用户提供了一个直观的界面元素,使任务执行过程更加生动和有趣。用户可以通过观察进度条的变化来感知任务的进展,增加了与应用程序或系统的互动性。
        (4)提升效率:当用户在执行长时间任务时,进度条可以让他们了解任务的大致完成时间,从而更高效地安排其他工作或活动。此外,一些进度条还会显示速度信息,这有助于用户调整操作以优化任务完成的速度。
        (5)增强信任感:进度条的存在可以让用户感觉到应用程序或系统在正常运行,并且是在处理他们的请求。这种信任感有助于增强用户对应用程序或系统的信心,提升整体的用户满意度。
        综上所述,进度条在提升用户体验、增强互动性、提高效率以及增强用户信任感等方面都具有显著的好处。因此,在设计应用程序或系统时,合理地使用进度条可以有效地提升用户的满意度和体验。

图1-2 设置进度条的好处 

2. VBA设计进度条的方法

        VBA是常用的数据处理的工具,有的时候处理数据几十上百万行,Excel像卡死一样,用户如果点击会出现未响应,点多了可能就卡死了。这个时候制作一个进度条是非常有必要的。制作进度条有下面3个好处:

        1.让用户实时了解当前的数据处理进度

        2.减少软件卡死的风险

        3.显得高端^-^

        虽然VBA设计出如图1-1类似的进度条有一定难度,但也是可以很轻易的设计一些常见的进度条样式的。那么分享一下我平常使用VBA制作进度条的方法,我常用的有2种样式:

图2-1.进度条样式1 

图2-2.进度条样式2 

下面介绍方法:

2.1 窗体设计部分

        窗体部分的设计如图3所示,相关描述见图3:

图2-3.窗体部分设计 

2.2 代码设计部分

2.2.1 代码

Option Explicit
Option Base 0
Sub ProcessBarStyle()
        '****************************************************************************************
        
        '函数功能:将Sheet1-Sheet3,A列到E列求和放在F列,并用进度条显示进度
        '开发者:村里大明白(@CSDN)
        '日期:2024/3/27        
        '****************************************************************************************
        
        Application.ScreenUpdating = False' 关闭屏幕更新
        
        Dim sht As Worksheet '定义工作表变量
        Dim shtRow As Long '工作表的行数
        Dim ProBar_lengthNow, ProBar_lengthMax As Long '进度条当前值和最大值
        Dim ProBar_lengthGap As Long '进度条变化间隔
        Dim ProBar_lengthTemp As Long '进度条变化临时值
        Dim i As Long '循环变量
        
        '进度条数据初始化
        ProBar_lengthNow = 0
        ProBar_lengthMax = 0
        ProBar_lengthTemp = 0
        
        '求进度条最大值
        For Each sht In ThisWorkbook.Worksheets
                shtRow = sht.UsedRange.Rows.Count '工作表行数
                ProBar_lengthMax = ProBar_lengthMax + (shtRow - 1)  '进度条最大值为所有工作表行数之和,(shtRow - 1)减1是因为第一行是表头
        Next sht
        '进度条变化间隔1%
        ProBar_lengthGap = ProBar_lengthMax * 0.01 '1%更新一次进度条显示
        
        '进度条样式1//
        
        For Each sht In ThisWorkbook.Worksheets
                shtRow = sht.UsedRange.Rows.Count '工作表总行数
                For i = 2 To shtRow Step 1
                        sht.Range("F" & i).Value = Application.WorksheetFunction.Sum(sht.Range("A" & i & ":" & "E" & i)) '求和
                        ProBar_lengthTemp = ProBar_lengthTemp + 1
                        ProBar_lengthNow = ProBar_lengthNow + 1

                        If ProBar_lengthTemp >= ProBar_lengthGap Then '每隔1%更新一次
                                With Form_ProcessBar01
                                        .Show 0 '进度条显示
                                        .Label1.Width = Int(500 * ProBar_lengthNow / ProBar_lengthMax) 'label1宽度增长
                                        .Frame1.Caption = CStr(Round(100 * ProBar_lengthNow / ProBar_lengthMax, 0)) & "%" '百分比显示
                                        .Caption = "正在处理" & sht.Name & "的数据....." '正在处理的内容显示在form的caption
                                        DoEvents '将控制权交还给操作系统,允许操作系统进行界面的更新,没有这句代码,进度条会不更新
                                End With
                                ProBar_lengthTemp = 0 '间隔临时值清零,每变化1%循环一次
                        End If
                Next i
        Next sht
       
        Unload Form_ProcessBar01 '进度条样式1卸载
        
        '/进度条样式2/
        '进度条数据初始化
        ProBar_lengthNow = 0
        ProBar_lengthTemp = 0
        
        For Each sht In ThisWorkbook.Worksheets
                shtRow = sht.UsedRange.Rows.Count
                For i = 2 To shtRow Step 1
                        sht.Range("F" & i).Value = Application.WorksheetFunction.Sum(sht.Range("A" & i & ":" & "E" & i)) '求和
                        ProBar_lengthTemp = ProBar_lengthTemp + 1
                        ProBar_lengthNow = ProBar_lengthNow + 1
                        
                        If ProBar_lengthTemp >= ProBar_lengthGap Then '每隔1%更新一次
                                With Form_ProcessBar02
                                        .Show 0 '进度条显示
                                        .Label1.Width = Int(500 * ProBar_lengthNow / ProBar_lengthMax)
                                        .Label2.Left = .Label1.Width + 1 '百分比显示在label2,通过设置label2左侧的距离保证label2始终在label1右侧
                                        .Label2.Caption = CStr(Round(100 * ProBar_lengthNow / ProBar_lengthMax, 0)) & "%"
                                        .Caption = "正在处理" & sht.Name & "的数据....."
                                        DoEvents
                                End With
                                ProBar_lengthTemp = 0
                        End If
                Next i
        Next sht
        '进度条样式1卸载
        Unload Form_ProcessBar02
        
        MsgBox "测试完成!"
    
    Application.ScreenUpdating = True' 屏幕更新开启
        
End Sub

2.2.2 代码关键部分讲解

        代码中注释已经加的很详细了,就不再赘述。下面讲一下DoEvents。

        在VBA中DoEvents是一个特殊的语句,用于在长时间运行的程序中暂时将控制权交还给操作系统,允许如用户界面更新等其他操作得以执行。当 VBA 代码在执行一个长时间的任务(如循环处理大量数据)时,如果没有使用DoEvents,Excel 可能会停止响应其他用户输入或停止更新用户界面,因为 VBA 正在全力执行代码。这可能导致用户觉得 Excel 应用程序已经崩溃或无响应。在代码中的适当位置插入DoEvents语句,你可以让 VBA 暂时暂停执行当前的任务,允许操作系统处理其他事件,比如用户界面的更新,这有助于保持应用程序的响应性,并给用户一种程序仍在正常运行的印象。

        然而,需要注意的是,过度使用DoEvents 可能会降低代码的执行效率,因为它会中断 VBA 代码的执行。因此我们应该只在确实需要保持应用程序响应性的情况下使用它,并且应该尽量减少其调用的频率。如果要处理的数据几十万行,每执行一次 DoEvents 就调用一次,将严重拖慢程序的处理速度。

        因此我们上述程序里有进度条每1%更新一次的设计。设置变量ProBar_lengthGap = ProBar_lengthMax * 0.01,临时变量ProBar_lengthTemp在进度条每更新1%就清零一次,重新循环计数。

程序文件已经上传资源,有需要的可以下载:https://download.csdn.net/download/weixin_42109443/89043338

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值