1 Application 对象的常见属性
1.0对象管理器里可以查看application的所有属性,方法
- Dim i As cell 错误,没有这种类型定义
- 只能
- dim i as range
- dim sh as sheet
- dim wb as workbook
1.1 Application的常见属性
- Application.screenupdating = False
- Application.EnableEvents = False
- Application.DisplayAlerts = False
- Application.DisplayFullScreen = True ‘设置EXCEL为全屏模式
- Application.Visible = False ‘隐藏excel应用
- Application.Interactive = False '禁止用户干预宏代码的执行(禁止所有的输入和鼠标操作)
- 键盘输入??
1.2 Application的常见方法
- Application.Undo '注意和workbook_sheetchange() 事件配合时要慎用
- Application.getopenfilename
- applicaiton.wait
- applicaiton.Wait (Now + TimeValue("00:00:02"))
- application.ontime()
2 Application的属性虽然多数是过程级的,但sub结尾需要重置回来
2.1 Application.screenupdating = False 只能过程sub 或函数中
2.1.1 只能写在sub过程中,是过程级的变化
- Application.screenupdating = False 只能过程sub 或函数中
- 我感觉这是过程级的,过程结束就释放,重置了吧
2.1.2 sub过程结尾还是要把 application属性重置回来
- sub结束,这个Application.ScreenUpdating = False 生命周期自然失效,所以感觉不需要=true,好像是无所谓的
- 但是有下面这个例子
- Application.EnableEvents = True '结尾如果没这句话,会反复触发,导致EXCEL不刷新了
3 Application.screenupdating = False
3.1 作用
- 关闭 “过程中运行时” 屏幕即时刷新,sub 执行完毕后再刷新(sub结束后,此语句设置失效,必然会刷新)
- 代码1:第1行数字赋值会马上刷新,而第2行会等待几秒
- 代码2:第1行数字和第2行数字,会等待几秒后一起刷新出来(也就是sub结束时)
Sub test601()
Range("a5:g5") = 101
Debug.Print "a5: g5已修改"
Application.Wait (Now + TimeValue("00:00:05"))
Range("a6:g6") = 102
Debug.Print "a6: g6已修改"
End Sub
Sub test602()
Application.ScreenUpdating = False
Range("a5:g5") = 101
Debug.Print "a5: g5已修改"
Application.Wait (Now + TimeValue("00:00:05"))
Range("a6:g6") = 102
Debug.Print "a6: g6已修改"
Application.ScreenUpdating = True
End Sub
4 Application.EnableEvents = False
4.1 Application.EnableEvents=false 非常重要
- 这个非常重要,避免死循环,避免其他事件打断造成影响
- 因为 application.undos是吧用户修改继续重置,但是又触发了 workbook_sheetchange()
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
MsgBox "本工作簿不允许修改"
Application.Undo
Application.EnableEvents = True
End Sub
4.2 Application.EnableEvents = True
结尾如果没这句话,会导致EXCEL不刷新了
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
MsgBox "本工作簿不允许修改"
Application.Undo
'Application.EnableEvents = True '结尾如果没这句话,会反复触发,导致EXCEL不刷新了
End Sub
5 Application.DisplayAlerts = False
5.1 基本语法
- Application.DisplayAlerts 属性 ,显示各种 displayalerts 窗口
- 注意语法 复数 displayAlerts
- 如果宏运行时 Microsoft Excel 显示特定的警告和消息,则该属性值为 True。Boolean 类型,可读写。
- 语法
- 表达式.DisplayAlerts
- 表达式 一个代表 Application 对象的变量。
- 默认值为 True。将此属性设置为 False 可在宏运行时禁止显示提示和警告消息;当出现需要用户应答的消息时,Microsoft Excel 将选择默认应答。
- 如果将该属性设置为 False,则在代码运行结束后,Microsoft Excel 会将该属性设置为 True,除非运行的是跨进程代码。
5.2 代码改进
正确1, 不用循环, worksheet变量名写死
Sub test_sh2()
Application.DisplayAlerts = False
For i = 1 To 3
Worksheets.Add
ActiveSheet.Name = i & "月"
Next
Worksheets("1月").Delete
Worksheets("2月").Delete
Worksheets("3月").Delete
'有没有worksheet 名称用变量合成的办法?
Application.DisplayAlerts = True
End Sub
- For i = 1 To Worksheets.Count '默认的是thisworkbook
- 有没有worksheet 名称用变量合成的办法?--变量名是可以合成的 Worksheets(i & "月").Delete
Sub test_sh2()
Application.DisplayAlerts = False
For i = 1 To 3
Worksheets.Add
ActiveSheet.Name = i & "月"
Next
'有没有worksheet 名称用变量合成的办法?--可以
For i = 1 To 3
Worksheets(i & "月").Delete
Next
Application.DisplayAlerts = True
End Sub
错误代码
- 为啥3个表都删了,还问我下标越界?因为循环写错了
Sub test_sh2()
Application.DisplayAlerts = False
For i = 1 To 3
Worksheets.Add
ActiveSheet.Name = i & "月"
Next
'为啥3个表都删了,还问我下标越界?--因为这是错误代码
For i = 1 To Worksheets.Count '默认的是thisworkbook
Worksheets("1月").Delete
Worksheets("2月").Delete
Worksheets("3月").Delete
'有没有worksheet 名称用变量合成的办法?
Next
Application.DisplayAlerts = True
End Sub
6 application.activecell() 却不能与 workbook worksheet连用。
- Window.ActiveCell 属性
- 返回一个 Range 对象,它代表活动窗口(最上方的窗口)或指定窗口中的活动单元格。如果窗口中没有显示工作表,此属性无效。只读。
- 语法
- 表达式.ActiveCell
- 表达式 一个代表 Window 对象的变量。
- 说明
- 如果不指定对象识别符,此属性返回活动窗口中的活动单元格。
- 请仔细区分活动单元格和选定区域。活动单元格为选定区域内部的一个单元格。而选定区域可以包含多个单元格,但只有一个单元格为活动单元格。
- 下列表达式都是返回活动单元格,并且都是等效的。
- Visual Basic for Applications
- ActiveCell
- Application.ActiveCell
- ActiveWindow.ActiveCell
- Application.ActiveWindow.ActiveCell
Sub test_sh2()
Debug.Print "activecell只能单独使用,不要和sh wb混用连用"
Application.ActiveCell.Value = 22
ActiveCell = 11
ActiveWindow.ActiveCell = 55
Application.ActiveWindow.ActiveCell = 66
'而以下全部都是错误的,不知道为啥
'Application.ThisWorkbook.ActiveSheet.ActiveCell.Value = 33
'ThisWorkbook.ActiveSheet.ActiveCell.Value = 33
'ActiveSheet.ActiveCell.Value = 33
'Worksheets("sheet3").ActiveCell = 777
Debug.Print "结合sh,wb使用cell,好像只能用cells() range() 不能用activecell()"
Worksheets("sheet3").Cells(14, 2) = 555
End Sub
7 application.wait 等待时间后执行
Sub tt5()
Debug.Print Time
Debug.Print Format(Now, "yyyy/mm/dd")
Debug.Print Format(Now, "yy/m/d") '可以试试写成"yy/m/d"
Debug.Print Format(Now, "y/m/d") '可以试试写成"y/m/d"
Debug.Print Format(Now, "hh/mm/ss")
Debug.Print Format(Now, "h/m/s")
t1 = Time
Application.Wait (Now + TimeValue("00:00:05"))
Debug.Print Format(Time - t1, "hh/mm/ss")
End Sub
8 application.ontime 定时执行
8.1 application.ontime 语法
- 安排一个过程在将来的特定时间运行(既可以是具体指定的某个时间,也可以是指定的一段时间之后)。
- 语法
- 表达式.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
- 表达式 一个代表 Application 对象的变量。
- 参数
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
EarliestTime | 必选 | Variant | 希望此过程运行的时间。 |
Procedure | 必选 | String | 要运行的过程名。 |
LatestTime | 可选 | Variant | 过程开始运行的最晚时间。例如,如果 LatestTime 参数设置为 EarliestTime + 30,且当到达EarliestTime 时间时,由于其他过程处于运行状态而导致 Microsoft Excel 不能处于“就绪”、“复制”、“剪切”或“查找”模式,则 Microsoft Excel 将等待 30 秒让第一个过程先完成。如果 Microsoft Excel 不能在 30 秒内回到“就绪”模式,则不运行此过程。如果省略该参数,Microsoft Excel 将一直等待到可以运行该过程为止。 |
Schedule | 可选 | Variant | 如果为 True,则预定一个新的 OnTime 过程。如果为 False,则清除先前设置的过程。默认值为True。 |
1 Application.OnTime 使用时的局限性
- Application.OnTime
- 局限性1 不再一个模块内的 过程/函数 不能被找到
- 局限性2 一个神奇BUG,如果 过程/函数名字带数字,直接双引号会报找不到宏,需要里面再加一层单引号 如"'t7'"
- 问题3,函数的调用好像比sub 快一些
8.1 延后执行
2 application.ontime 调用其他sub /function 时,显示无法执行宏的解决办法,需要里面再加一层单引号 如"'t7'"
- 下面这2种写法,正常都是正确,但都会报错
- Application.OnTime Now + TimeValue("00:00:02"), procedure:="t7"
- Application.OnTime Now + TimeValue("00:00:02"), procedure:="t7()"
- 需要里面再加一层单引号 如"'t7'" 就可以找到对应 sub /function 不会报错
Sub t6()
Debug.Print "开始调用"
Application.OnTime Now + TimeValue("00:00:02"), procedure:="'t7'"
Application.OnTime Now + TimeValue("00:00:02"), "'t8'"
Debug.Print "继续往下执行,不等待外部调用"
End Sub
Public Sub t7()
Debug.Print "hello world1"
End Sub
Function t8()
Debug.Print "hello world2"
End Function
VBA 中,不接收参数的子例程或函数不需要圆括号。否则,在声明中需要圆括号。
在VBA编辑器的模块中运行如下代码
Sub showTime()
Application.Caption = Now()
Application.OnTime(Now() + TimeValue("00:00:01"), "showTime")
End Sub
会出现 编译错误 缺少:=
原因:
Application.OnTime(Now() + TimeValue("00:00:01"), "showTime")
不需要返回值,所以Application.OnTime函数不用加括号,去掉括号即可,改成如下代码
Sub showTime()
Application.Caption = Now()
Application.OnTime Now() + TimeValue("00:00:01"), "showTime"
End Sub
8.2 定时运行
Sub ta()
Debug.Print "ok"
Application.OnTime TimeValue("12:53:02"), procedure:="tb"
End Sub
Public Sub tb()
Debug.Print "hello world1 "
End Sub
局限性1 不再一个模块内的 过程/函数 不能被找到
问题3,函数的调用好像比sub 快一些
Debug.Print "开始倒计时 秒?"
Debug.Print "继续往下执行,不等待外部调用"
End Sub
'4个参数
https://blog.csdn.net/znyang/article/details/12201459
https://blog.csdn.net/huzhizhewudi/article/details/84497476
https://jingyan.baidu.com/article/fa4125aceabbf528ac709287.html
http://club.excelhome.net/thread-848141-1-1.html
http://club.excelhome.net/thread-1148787-1-1.html
https://zhidao.baidu.com/question/559892540.html
http://m.reader8.cn/show-2191445.html
http://club.excelhome.net/forum.php?mod=viewthread&tid=941375&highlight=
https://zhidao.baidu.com/question/447345258.html
http://club.excelhome.net/thread-784974-1-1.html
以下代码有问题,需要用变量传递时间?
http://club.excelhome.net/thread-986364-1-1.htm
VBA ontime 作用于application对象失败
Sub ta()
'On Error Resume Next
Debug.Print "准备调用"
Application.OnTime earliesttime:=Now + TimeValue("00:00:02"), procedure:="tb", schedule:=False
Debug.Print "继续执行"
'procedure:="tb", schedule:=False
'latesttime:=TimeValue("12:53:02") + TimeValue("00:00:59")
End Sub
Public Sub tb()
Debug.Print "hello world1 "
End Sub