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

 

 

 

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
 

 


 

 

 

 

9 application.onkey 

谈到宏,很多人想到的是宏病毒,其实如果有正版杀毒软件,打开了实时防护,设置好宏安全性,可以利用宏来完成许多办公自动化功能。   打开word软件,从文件主菜单中“工具”->“宏”->“安全性”,设置安全性为中,这样就可以选择执行宏。安装office的时候,应该定制安装,在“office 工具”里选上“Visual Basic帮助”,这样就能获得非常完善的关于VBA编程环境、VBA语言参考、VBA对象等的帮助文档。从“工具”->“宏”->“Visual Basic 编辑器”可以打开VBA编程环境——“Microsoft Visual Basic”。在编程环境中打开“帮助”->“Microsoft Visual Basic帮助”,就可以看到帮助了。   很多人觉得学习Visual Basic没有用,事实上,Visual Basic系列的编程语言包括VB、VBA、VBScript等,可以写网页、办公自动化编程、应用编程。在一些其他公司的应用软件中也是可以用VBA的,例如Corel Draw。这里举几个例子来说明VBA的使用。   如果有数十个文档需要合并为一个文档,逐个打开、拷贝是件麻烦事,可以用宏来完成。 例一:合并文档。新建一个窗体,窗体上放一个按钮。工具箱可以从“视图”->“工具箱”打开。 '按钮事件 Private Sub CommandButton1_Click() Dim sPath As String 'sPath用来保存路径 Dim tem As String '中间变量 Set newDoc = Documents.Add '用Documents.Add增加一个新文档 With newDoc .SaveAs FileName:="D:/txtal.doc" '新文档保存的完整路径 End With ActiveDocument.close '关闭新建的文档 With Dialogs(wdDialogFileFind) '设置文本查找对话框 .SortBy = 2 '文件按名称排列 .SearchName = "*.txt" '只列出文本文件 .Update '更新 End With If Dialogs(wdDialogFileFind).Show = -1 Then '如果按下打开,就执行 sPath = Dialogs(wdDialogFileFind).SearchPath '将查找对话框打开的路径附值给SPath Dialogs(wdDialogFileFind).Execute Else Exit Sub '如果取消或者关闭,就退出 End If With Application.FileSearch '设置应用程序的查找 .NewSearch '新查找 .LookIn = sPath '将新查找的路径设置为文件对话框的路径(sPath) .SearchSubFolders = True '查找子目录 .FileType = msoFileTypeAllFiles '查找所有文件类型,这里可以设置其他类型,具体见FileSearch对象的FileType属性 .FileName = "*.txt" '查找后缀为txt的文件 .Execute '执行文件查找 Documents.Open ("D:/txtal.doc") '打开"D:/txtal.doc" Set Range2 = ActiveDocument.Content '设置Range2对象为活动文档的内容 For i = 1 To .FoundFiles.Count '把找到的文件打开,拷贝文件内容,加到新建的D:/txtal.doc文件中 Documents.Open (.FoundFiles(i)) '打开第i个找到的文件 ActiveDocument.Content.Select '全选活动文件的内容 Selection.Copy '拷贝选中的内容 ActiveDocument.Close '关闭活动文档 Range2.Collapse Direction:=wdColla
HBase是一个分布式、可扩展、面向列的NoSQL数据库系统,它可以在Hadoop集群上运行,并且被广泛应用于大数据处理领域。在HBase中,命名空间(Namespace)是用于组织和管理表的一种机制。在命名空间中,可以创建多个表,并且这些表可以具有相同或不同的列族。 要在HBase的命名空间中创建表,首先需要使用HBase的客户端工具连接到HBase集群。然后,可以使用HBase shell或HBase API来执行相应的操作。 在HBase shell中,可以使用以下命令来创建命名空间和表: 1. 创建命名空间: create_namespace 'namespace_name' 2. 创建表: create 'namespace_name:table_name', 'column_family1', 'column_family2', ... 其中,'namespace_name'是要创建的命名空间的名称,'table_name'是要创建的表的名称,'column_family1', 'column_family2'等是表的列族。 在HBase API中,可以使用Java编程语言来创建命名空间和表。以下是一个简单的示例代码: ``` java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; public class HBaseNamespaceExample { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin(); // 创建命名空间 NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor .create("namespace_name") .build(); admin.createNamespace(namespaceDescriptor); // 创建表 TableDescriptor tableDescriptor = TableDescriptorBuilder .newBuilder(TableName.valueOf("namespace_name", "table_name")) .addColumnFamily(ColumnFamilyDescriptorBuilder.of("column_family1")) .addColumnFamily(ColumnFamilyDescriptorBuilder.of("column_family2")) .build(); admin.createTable(tableDescriptor); admin.close(); connection.close(); } } ``` 通过以上的命令或代码,就可以在HBase的命名空间中成功创建表。在表创建完成后,可以继续使用HBase的相关功能进行数据的读取、写入和查询等操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值