学习笔记 解决方案

3.Workbook对象——《VBA常用技巧代码解析》

1.工作簿的引用方法

在不同的工作簿之间转换需要指定引用的工作簿,通常有下面几种方法:

使用工作簿名称

使用工作簿的索引号

使用ThisWorkbook

使用ActiveWorkbook

使用工作簿名称

要注意工作簿必须已经打开

dim wb As Workbook
Set wb=Workbooks("工作簿.xlsx")

使用工作簿的索引号

这种方法适用于需要遍历所有打开的工作簿时

Sub 通过索引号使用工作簿()
Dim i As Integer
Dim totalWorkbooks As Integer

'获取打开的工作簿总数
totalWorkbooks = Workbooks.count

'遍历所有打开的工作簿
For i = 1 To totalWorkbooks.count
  '激活每一个工作簿
  Workbooks(i).Activate

  '输出当前工作簿名称
  MsgBox "当前工作簿:" & ActiveWorkbook.Name

  '其他对当前工作簿的操作
Next i
End Sub

使用ThisWorkbook

ThisWorkbook时钟只想包含当前正在运行的VBA代码的工作簿(代表当前宏代码所在的工作簿)

Sub 使用ThisWorkbook()
    ' 直接使用ThisWorkbook
    ThisWorkbook.Activate
    
    ' 在ThisWorkbook中进行操作
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value = "这是当前运行代码的工作簿"
    
    ' 输出信息
    MsgBox "当前工作簿名称: " & ThisWorkbook.Name
End Sub

使用ActiveWorkbook

ActiveWorkbook指向当前激活的工作簿,它可能会随着用户的操作而改变

Sub 使用ActiveWorkbook()
    ' 声明变量
    Dim currentName As String
    
    ' 获取当前激活的工作簿名称
    currentName = ActiveWorkbook.Name
    
    ' 在ActiveWorkbook中进行操作
    ActiveWorkbook.Sheets("Sheet1").Range("A1").Value = "这是当前激活的工作簿"
    
    ' 输出信息
    MsgBox "当前激活的工作簿: " & currentName
End Sub

2.新建工作簿文件

使用Add方法新建工作簿

Sub 新建工作簿()
    ' 声明一个工作簿变量
    Dim newWorkbook As Workbook
    
    ' 使用Add方法创建新的工作簿,并将其赋值给newWorkbook变量
    Set newWorkbook = Workbooks.Add
    
    ' 给新工作簿命名(可选)
    newWorkbook.SaveAs Filename:="C:\Users\YourName\Desktop\新工作簿.xlsx"
    
    ' 激活新创建的工作簿
    newWorkbook.Activate
    
    ' 在新工作簿的第一个工作表的A1单元格写入文本
    newWorkbook.Sheets(1).Range("A1").Value = "这是一个新的工作簿!"
    
    ' 显示消息框,通知用户新工作簿已创建
    MsgBox "新的工作簿已创建并保存在桌面上!", vbInformation, "操作成功"
End Sub

3.打开指定的工作簿

可以通过Open方法打开一个工作簿

Sub 打开指定工作簿()
    ' 声明变量
    Dim wb As Workbook
    Dim filePath As String
    
    ' 指定要打开的文件路径
    filePath = "C:\Users\YourName\Desktop\要打开的文件.xlsx"
    
    ' 使用Open方法打开工作簿
    Set wb = Workbooks.Open(Filename:=filePath)
    
    ' 激活刚刚打开的工作簿
    wb.Activate
    
    ' 在A1单元格写入文本
    wb.Sheets(1).Range("A1").Value = "这个工作簿已经被VBA打开了!"
    
    ' 显示消息框
    MsgBox "工作簿 '" & wb.Name & "' 已成功打开!", vbInformation, "操作成功"
End Sub

Open方法的所有参数

完整语法:

Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)

参数解释:

FileName

类型:String

描述:要打开的文件的完整路径和文件名。

示例:”C:\Users\YourName\Desktop\example.xlsx”

UpdateLinks

类型:Variant

描述:指定是否更新文件中的链接。

可选值:0 = 不更新, 1 = 更新外部链接, 2 = 更新远程链接, 3 = 更新全部链接

示例:UpdateLinks:=0

ReadOnly

类型:Variant

描述:是否以只读模式打开文件。

可选值:True 或 False

示例:ReadOnly:=True

Format

如果Excel正在打开一个文本文件,则该参数用于指定分隔符,如果省略本参数,则是用当前的分隔符

类型:Variant

描述:指定文件格式(主要用于非Excel文件)。

示例:Format:=6 (6 表示 CSV 格式)

Password

类型:String

描述:打开受密码保护的工作簿时使用的密码。

示例:Password:=”MyPassword123″

WriteResPassword

类型:String

描述:用于写保护的密码。

示例:WriteResPassword:=”WritePassword123″

IgnoreReadOnlyRecommended

类型:Variant

描述:是否忽略”建议以只读方式打开”的提示。

可选值:True 或 False

示例:IgnoreReadOnlyRecommended:=True

Origin

类型:Variant

描述:指定文本文件的来源。

示例:Origin:=xlMSDOS

Delimiter

类型:Variant

描述:指定文本文件的分隔符。

示例:Delimiter:=”,”

Editable

类型:Variant

描述:指定是否可以编辑查询表。

可选值:True 或 False

示例:Editable:=True

Notify

类型:Variant

描述:如果为True,在文件被其他用户修改时通知用户。

可选值:True 或 False

示例:Notify:=True

Converter

类型:Variant

描述:指定要使用的文件转换器的索引。

示例:Converter:=1

AddToMru

类型:Variant

描述:是否将文件添加到最近使用的文件列表中。

可选值:True 或 False

示例:AddToMru:=True

Local

类型:Variant

描述:对于HTML文件,指定是否将文件保存在本地文件系统中。

可选值:True 或 False

示例:Local:=True

CorruptLoad

类型:Variant

描述:指定如何打开损坏的工作簿。

可选值:xlNormalLoad, xlRepairFile, xlExtractData

示例:CorruptLoad:=xlRepairFile

4.判断指定工作簿是否已打开

推荐使用遍历的方法,遍历所有已打开的工作簿,检查是否有匹配的文件名

Function 工作簿是否打开(文件路径 As String) As Boolean
    Dim wb As Workbook
    Dim 文件名 As String
    
    文件名 = Dir(文件路径)  ' 获取文件名
    
    For Each wb In Workbooks
        If wb.Name = 文件名 Then
            工作簿是否打开 = True
            Exit Function
        End If
    Next wb
    
    工作簿是否打开 = False
End Function

Sub 测试工作簿是否打开()
    Dim 文件路径 As String
    文件路径 = "C:\Users\YourName\Desktop\测试文件.xlsx"
    
    If 工作簿是否打开(文件路径) Then
        MsgBox "工作簿已经打开!", vbInformation, "提示"
    Else
        MsgBox "工作簿未打开。", vbInformation, "提示"
    End If
End Sub

5.保存工作簿的方法

使用Workbook对象的Save方法保存工作簿的更改,如果是新创建的尚未保存的工作簿,它会调出“另存为”对话框。

ThisWorkbook.Save

直接保存为另一文件名

如果需要将工作簿另存为一个文件名,可以使用Workbook对象的SaveAs方法:

Sub 另存为新文件()
    Dim 新文件路径 As String
    新文件路径 = "C:\Users\YourName\Desktop\新工作簿.xlsx"
    
    ThisWorkbook.SaveAs Filename:=新文件路径, FileFormat:=xlOpenXMLWorkbook
    MsgBox "工作簿已另存为: " & 新文件路径, vbInformation, "另存为成功"
End Sub

6.保存指定工作表为工作簿文件

如果要将工作簿中的工作表单独保存为一个工作簿文件,可以使用Worksheet对象的copy方法,将指定的工作表复制到一个新建的工作簿

Sub 保存指定工作表为新工作簿()
    Dim 源工作簿 As Workbook
    Dim 新工作簿 As Workbook
    Dim 源工作表 As Worksheet
    Dim 新文件路径 As String
    
    ' 设置源工作簿和工作表
    Set 源工作簿 = ThisWorkbook
    Set 源工作表 = 源工作簿.Worksheets("Sheet1")  ' 替换为您想要保存的工作表名称
    
    ' 创建新工作簿
    Set 新工作簿 = Workbooks.Add
    
    ' 复制工作表到新工作簿
    源工作表.Copy Before:=新工作簿.Sheets(1)
    
    ' 删除新工作簿中的默认工作表
    Application.DisplayAlerts = False  ' 禁用删除工作表的警告
    新工作簿.Sheets(新工作簿.Sheets.Count).Delete
    Application.DisplayAlerts = True   ' 重新启用警告
    
    ' 设置新文件路径并保存
    新文件路径 = "C:\Users\YourName\Desktop\新工作簿.xlsx"
    新工作簿.SaveAs 新文件路径
    
    ' 关闭新工作簿(可选)
    新工作簿.Close
    
    MsgBox "工作表已保存为新工作簿:" & 新文件路径, vbInformation, "保存成功"
End Sub

7.设置工作簿文档属性信息

使用DocumentProperties集合对象的builtinDocumentProperties属性可以设置文档的属性信息

Sub 设置内置文档属性()
    With ThisWorkbook
        ' 设置标题
        .BuiltinDocumentProperties("Title").Value = "年度财务报告"
        
        ' 设置主题
        .BuiltinDocumentProperties("Subject").Value = "2023财年概览"
        
        ' 设置作者
        .BuiltinDocumentProperties("Author").Value = "张三"
        
        ' 设置公司
        .BuiltinDocumentProperties("Company").Value = "ABC有限公司"
        
        ' 设置备注
        .BuiltinDocumentProperties("Comments").Value = "本报告包含敏感信息,请勿外传"
        
        ' 设置关键词
        .BuiltinDocumentProperties("Keywords").Value = "财务, 年报, 2023"
    End With
    
    MsgBox "文档属性已更新", vbInformation, "设置成功"
End Sub

8.返回窗口的可视区域地址

VBA中使用VisibleRange属性返回当前窗口的可视区域(Excel窗口中当前可见的单元格范围)

Public 上次可视区域 As String

Sub 开始监控可视区域()
    ' 存储初始可视区域
    上次可视区域 = ActiveWindow.VisibleRange.Address
    
    ' 设置定时器,每秒检查一次
    Application.OnTime Now + TimeValue("00:00:01"), "检查可视区域变化"
End Sub

Sub 检查可视区域变化()
    Dim 当前可视区域 As String
    当前可视区域 = ActiveWindow.VisibleRange.Address
    
    If 当前可视区域 <> 上次可视区域 Then
        MsgBox "可视区域已更改!" & vbNewLine & _
               "从: " & 上次可视区域 & vbNewLine & _
               "到: " & 当前可视区域, vbInformation
        上次可视区域 = 当前可视区域
    End If
    
    ' 继续监控
    Application.OnTime Now + TimeValue("00:00:01"), "检查可视区域变化"
End Sub

Sub 停止监控可视区域()
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "检查可视区域变化", , False
    On Error GoTo 0
End Sub

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

发表回复