VBA,Application对象的常用属性和方法

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 
  1. ActiveCell
  2. Application.ActiveCell
  3. ActiveWindow.ActiveCell
  4. 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(EarliestTimeProcedureLatestTimeSchedule)
  • 表达式   一个代表 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

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
 


 

9 application.onkey 

发布了416 篇原创文章 · 获赞 46 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/104131938