学习笔记 解决方案

5.Application对象——《VBA常用技巧代码解析》

Application对象是Excel VBA中最顶层的对象,代表整个Excel程序,它是所有其他Excel对象的父对象,通过它可以访问和控制Excel的各种功能和属性.

作为VBA编程的起点,Application对象允许你控制Excel的行为,访问工作簿、工作表、单元格等,以及执行各种Excel操作。

大多数情况下,可以省略Application前缀,直接使用其属性或方法

Sub CompareActiveCell()
    ' 使用Application前缀
    Dim cell1 As Range
    Set cell1 = Application.ActiveCell
    
    ' 不使用Application前缀
    Dim cell2 As Range
    Set cell2 = ActiveCell
    
    ' 两种方式效果相同
    MsgBox "cell1地址: " & cell1.Address & vbNewLine & _
           "cell2地址: " & cell2.Address
End Sub

使用With语句可以简化代码,提高效率

Sub UsingWithStatement()
    With Application
        ' 关闭屏幕刷新和自动计算
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        
        ' 在这里执行你的代码
        ' ...
        
        ' 恢复屏幕刷新和自动计算
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

1.常用属性

ActiveCell返回当前活动单元格(选中单元格的第一个)

即使选中多个单元格,也是返回这些单元格中的第一个

Sub ShowActiveCell()
    ' 声明一个Range对象变量
    Dim activeCell As Range
    ' 将当前活动单元格赋值给变量
    Set activeCell = Application.ActiveCell
    ' 显示活动单元格的地址
    MsgBox "当前活动单元格是: " & activeCell.Address
End Sub

ActiveWorkbook返回当前活动工作簿

Sub ShowActiveWorkbook()
    ' 声明一个Workbook对象变量
    Dim activeWB As Workbook
    ' 将当前活动工作簿赋值给变量
    Set activeWB = Application.ActiveWorkbook
    ' 显示活动工作簿的名称
    MsgBox "当前活动工作簿是: " & activeWB.Name
End Sub

Calculation属性设置或返回计算模式

Sub ToggleCalculation()
    ' 检查当前计算模式
    If Application.Calculation = xlCalculationAutomatic Then
        ' 如果是自动计算,则改为手动计算
        Application.Calculation = xlCalculationManual
        MsgBox "计算模式已更改为手动"
    Else
        ' 如果是手动计算,则改为自动计算
        Application.Calculation = xlCalculationAutomatic
        MsgBox "计算模式已更改为自动"
    End If
End Sub

ScreenUpdating属性控制屏幕刷新

Sub FastProcessing()
    ' 关闭屏幕刷新以加快处理速度
    Application.ScreenUpdating = False
    
    ' 这里放置你的代码逻辑
    ' ...
    
    ' 完成后重新开启屏幕刷新
    Application.ScreenUpdating = True
End Sub

InputBox方法 线束输入框并获取用户输入

Sub GetUserInput()
    ' 声明变量存储用户输入
    Dim userInput As String
    ' 使用InputBox方法获取用户输入
    userInput = Application.InputBox("请输入你的名字:", "用户输入")
    ' 显示用户输入的内容
    MsgBox "你好, " & userInput & "!"
End Sub

2.取得Excel版本信息(以及年份)

Application对象的Version属性可以返回Excel的版本号,通过版本号也可以得到Excel的年代版本

Sub GetDetailedExcelInfo()
    ' 声明变量
    Dim excelVersion As String
    Dim excelYear As String
    Dim excelBuild As Long
    Dim excelName As String
    Dim excelPath As String
    Dim excelBitness As String
    
    ' 获取Excel版本信息
    excelVersion = Application.Version
    excelBuild = Application.Build
    excelName = Application.Name
    excelPath = Application.Path
    
    ' 确定Excel的位数
    If InStr(1, Application.OperatingSystem, "x64") > 0 Then
        excelBitness = "64位"
    Else
        excelBitness = "32位"
    End If
    
    ' 根据版本号判断Excel年份
    Select Case Left(excelVersion, 2)
        Case "8."
            excelYear = "97"
        Case "9."
            excelYear = "2000"
        Case "10"
            excelYear = "2002 (XP)"
        Case "11"
            excelYear = "2003"
        Case "12"
            excelYear = "2007"
        Case "14"
            excelYear = "2010"
        Case "15"
            excelYear = "2013"
        Case "16"
            excelYear = "2016/2019/365"
        Case Else
            excelYear = "未知版本"
    End Select
    
    ' 创建详细的信息字符串
    Dim detailedInfo As String
    detailedInfo = "Excel详细信息:" & vbNewLine & _
                   "版本号: " & excelVersion & vbNewLine & _
                   "对应年份: Excel " & excelYear & vbNewLine & _
                   "构建号: " & excelBuild & vbNewLine & _
                   "应用程序名称: " & excelName & vbNewLine & _
                   "应用程序路径: " & excelPath & vbNewLine & _
                   "位数: " & excelBitness
    
    ' 显示消息框
    MsgBox detailedInfo, vbInformation, "Excel版本信息"
    
    ' 在即时窗口中也输出这些信息
    Debug.Print detailedInfo
End Sub

3.取得当前的Excel用户名称

Sub ShowUserName()
    ' 显示当前Excel用户名
    MsgBox "当前Excel用户名是: " & Application.UserName, vbInformation, "用户名信息"
    
    ' 在即时窗口中也输出这个信息
    Debug.Print "当前Excel用户名是: " & Application.UserName
End Sub

4.在Excel中的“定时器”

ExcelVBA并没有提供定时器控件,但是可以通过Application对象的OnTime方法实现简单的定时器功能

Application.OnTime方法的基本语法:

Application.OnTime EarliestTime, Procedure, [LatestTime], [Schedule]

EarliestTime: 指定过程运行的时间(日期和时间)。

Procedure: 要运行的过程名称(字符串)。

LatestTime: 可选参数,指定过程最晚运行时间。

Schedule: 可选参数,布尔值,True 表示安排过程运行,False 表示取消已安排的过程。

(下面的代码运行报错)

Sub StartTimer()
    Sheet1.Cells(1, 2) = Sheet1.Cells(1, 2) + 1	'指定单元格的数值+1
    Application.OnTime Now + TimeValue("00:00:01"), "StartTimer"	'每隔一秒调用过程本身
End Sub

5.设置活动打印机的名称

Application对象的ActivePrinter属性可以设置活动打印机的名称

Application.ActivePrinter = "打印机名称"

更具体的例子

Sub 设置活动打印机()
    ' 声明一个变量来存储打印机名称
    Dim printerName As String
    
    ' 设置打印机名称
    printerName = "HP LaserJet Pro MFP M126nw"
    
    ' 使用On Error语句来处理可能的错误
    On Error Resume Next
    
    ' 设置活动打印机
    Application.ActivePrinter = printerName
    
    ' 检查是否有错误发生
    If Err.Number <> 0 Then
        MsgBox "设置打印机失败。错误信息: " & Err.Description, vbExclamation, "错误"
    Else
        MsgBox "成功设置打印机为: " & printerName, vbInformation, "成功"
    End If
    
    ' 关闭错误处理
    On Error GoTo 0
End Sub

6.屏蔽、更改组合键的功能

使用Application对象的OnKey方法可以屏蔽或改变组合键的默认操作

基本语法:

Application.OnKey(Key, [Procedure])

Key: 要定义的键或键组合(字符串)

Procedure: 可选参数,指定按下键时要运行的过程(如果省略,则恢复键的正常功能)

键的表示方法:

^ 表示Ctrl键

表示Shift键

% 表示Alt键

{F1}、{F2}等表示功能键

当您使用OnKey方法禁用或重新映射快捷键时,这些更改只在当前的Excel会话中有效。当您关闭Excel后,所有的快捷键都会恢复到默认设置。

如果您想要在每次打开Excel时自动应用这些更改,可以将这些代码放在工作簿的Open事件中:

Private Sub Workbook_Open()
    Call 禁用多个快捷键
End Sub
Sub 禁用新建工作簿快捷键()
    ' 禁用Ctrl+N组合键
    Application.OnKey "^n", ""
End Sub

Sub 恢复新建工作簿快捷键()
    ' 恢复Ctrl+N组合键的默认功能
    Application.OnKey "^n"
End Sub
Sub 禁用多个快捷键()
    ' 禁用Ctrl+N (新建工作簿)
    Application.OnKey "^n", ""
    
    ' 禁用Ctrl+P (打印)
    Application.OnKey "^p", ""
    
    ' 禁用Ctrl+S (保存)
    Application.OnKey "^s", ""
    
    MsgBox "已禁用Ctrl+N, Ctrl+P, Ctrl+S快捷键", vbInformation, "快捷键已禁用"
End Sub

Sub 恢复多个快捷键()
    ' 恢复Ctrl+N
    Application.OnKey "^n"
    
    ' 恢复Ctrl+P
    Application.OnKey "^p"
    
    ' 恢复Ctrl+S
    Application.OnKey "^s"
    
    MsgBox "已恢复Ctrl+N, Ctrl+P, Ctrl+S快捷键的默认功能", vbInformation, "快捷键已恢复"
End Sub
Sub 重映射F1键()
    ' 将F1键映射到自定义过程
    Application.OnKey "{F1}", "自定义帮助"
End Sub

Sub 自定义帮助()
    ' 这是F1键将会执行的自定义过程
    MsgBox "这是自定义帮助信息", vbInformation, "自定义帮助"
End Sub

Sub 恢复F1键()
    ' 恢复F1键的默认功能
    Application.OnKey "{F1}"
End Sub

7.自定义Excel状态栏

Excel左下角的状态栏显示应用程序的当前状态(如就绪、输入等)或上下文提示信息,通过设置Application对象的Statusbar属性可以修改状态栏,以显示用户自定义的信息

Sub 修改状态栏()
    ' 设置状态栏文本
    Application.StatusBar = "这是一条自定义状态栏消息"
End Sub
Sub 显示当前时间()
    ' 设置状态栏显示当前时间
    Application.StatusBar = "当前时间: " & Format(Now, "yyyy-mm-dd hh:mm:ss")
End Sub

8.隐藏Excel主窗口

如果希望在程序启动时或运行过程中隐藏Excel主窗口,有以下几种方法实现

设置Application对象的Visible属性

Application.Visible=False

将屏幕移出窗口

设置Application对象的Left属性(从屏幕左边界至Excel窗口左边界的距离)和/或Top属性,将Application对象移出屏幕外

Sub 将Excel窗口移出屏幕()
    Dim originalLeft As Long
    Dim originalTop As Long
    
    ' 保存原始位置
    originalLeft = Application.Left
    originalTop = Application.Top
    
    ' 将Excel窗口移到屏幕外
    Application.Left = -20000
    Application.Top = -20000
    
    ' 执行一些操作
    ' ...
    
    ' 将Excel窗口移回原位
    Application.Left = originalLeft
    Application.Top = originalTop
End Sub

设置工作簿为加载宏运行

利用加载宏不显示工作簿窗口的特点,设置工作簿作为加载宏运行来隐藏工作簿窗口

Private Sub Workbook_Open()
  ThisWorkbook.IsAdin=True
  UserForm1.Show
End Sub

Private Sub Workbook_Open()

这是工作簿的Open事件过程。每次工作簿被打开时,这个过程都会自动运行。

ThisWorkbook.IsAddin = True

这行代码将当前工作簿的IsAddin属性设置为True,effectively把工作簿转换为加载项模式。

在加载项模式下,工作簿的行为会有所不同,比如默认情况下不显示工作表。

UserForm1.Show

这行代码显示名为UserForm1的用户窗体。

这允许您在加载项启动时立即与用户交互。

1 thought on “5.Application对象——《VBA常用技巧代码解析》”

发表回复