学习资源:《Excel VBA从入门到进阶》第61集 by兰色幻想
一、日期控件
- 日期选择器DTPicker
- 添加DTPicker控件
在工具箱-附加控件,找到Microsoft Date and Time Picker Control,version 6.0,点击“确认”就能添加到工具箱里。
如果没找到的话,需要安装对应系统位数的微软通用控件MSCOMCT2.OCX(具体操作可自行百度)。
- 常用的颜色设置如下:
① CalendarBackColor 日历背景色
② CalendarForeColor 日历字体颜色
③ CalendarTitleBackColor 日历标题背景色
⑤ CalendarTitleForeColor 日历背景色
⑥ CalendarTrailingForeColor 非本月的日期字体颜色
- 常用日期格式设置:
① 在属性窗口CustomFormat设置,用字符YMD表示年月日来填写格式,比如yyyy-MM-dd,yyyy/MM/DD等等
但注意,表示月份的M,必须使用大写,否则显示不出来。
② 或者直接在属性的自定义中设置,以上的颜色和格式,还有没有提及的图片都可以在属性页设置。其他功能自己看啦,不太常用就不说了。
- 输出选取值
Private Sub CommandButton1_Click()
Range("a1") = Me.DTPicker1.Value
End Sub
2. 日历控件
- 添加日历控件
在工具箱-附加控件,找到日历控件,点击“确认”就能添加到工具箱里。
如果找不到就下载安装MSCAL.OCX(操作方法自行百度哈)
- 属性调整(不多说了,和DTPicker差不多)
二、进度条
当一个VBA要运行很久才能结束,我们就有必要设置一个进度条来表示进度,以便使用者了解程序运行进展。
常用的方法有两种,第一种是label控件+textbook控件组合使用;第二种方法是使用ProgressBar控件,专业的进度条控件。
在学习前,有一个很重要的点要先说,进度要能计算出来百分比,就必要计算出总任务量,那才能分解任务。
- label控件+textbook控件
textbook控件作为框架,固定不动,然后通过调整label控件的宽度,来展示运行进度,可以再加一个label控件展示进度百分比。
例:假设总任务量为4000。
Private Sub UserForm_Initialize()
Label1.Width = 0'初始label值为0
End Sub
Private Sub CommandButton1_Click()
Dim x, w, k, n
w = TextBox1.Width '最后填充的宽度和文字框一致就表明100%
n = 4000 '循环次数,总任务量
For x = 1 To n
k = k + w / n 'k是每次运行后的宽度
Label1.Width = k '每次运行的宽度
Label2.Caption = Format(x / n, "0.00%") '再加一个label控件来显示进度百分比
DoEvents ' 把程序控制权交还给系统
Next x
End Sub
代码讲解:
DoEvents:交出执行控制权,以便操作系统能够处理其他事件。如果不写这句的话,程序就不会显示过程,只显示最后到4000次的时候的结果(计算在后台进行),如果把系统控制权交出去,那就相当于当前进程暂停,程序重新运行。
不过这个语句是有风险的,只要将控制权临时交给事件过程中的处理器,就请确保在第一个调用返回之前,不会从代码的其他部分重新执行过程;这可能会导致出现意外结果。
运行演示:
2. ProgressBar控件
附加控件Microsoft ProgressBar Control 6.0(SP6);如果找不到,需要先去下载安装MSCOMCTL.OCX。
例:假设总任务量为4000。
Private Sub CommandButton1_Click()
Dim x, w, k, n
n = 4000 '循环次数
ProgressBar1.Max = n '最大值=循环次数
ProgressBar1.Min = 0 '最小值=零
ProgressBar1.Scrolling = ccScrollingSmooth '进度条的显示方式,或在属性处设置Scrolling属性
For x = 1 To n
ProgressBar1.Value = x '一次运行的值
Next x
End Sub
代码讲解:
① ProgressBar1.Max:ProgressBar控件的最大值,一般是总任务量。
② ProgressBar1.Min:ProgressBar控件的最小值,一般是0。
③ ProgressBar1.Scrolling:ProgressBar控件的显示方式,有两种,ccScrollingStandard和ccScrollingSmooth。
④ 用ProgressBar控件不需要写DoEvents语句。
运行演示:
三、进度条实例
例:条件值可以填写,把表格A1:N5000中符合条件的值填充为红色。
代码分析:
① 计算总工作量:总共有14*5000个格子要判断,所以总工作量是14*5000=70000.
② 从上面两种方法看, ProgressBar比较方便而且专业,所以我们使用ProgressBar控件。
代码:
Private Sub CommandButton1_Click()
Dim rg As Range, k As Long
Cells.Interior.ColorIndex = xlNone '清空单元格格式
ProgressBar1.Max = 70000 '设置进度条的最大值为5000行*14列
ProgressBar1.Min = 0
ProgressBar1.Scrolling = 1
For Each rg In Range("a1:n5000")
k = k + 1
'判断是否符合条件
If rg.Value < Val(TextBox1.Value) And rg.Value <> "" Then
rg.Interior.ColorIndex = 3
End If
ProgressBar1.Value = k
Next rg
MsgBox "设置完成"
End Sub
运行演示: