当前位置:首页 > 技术 > 正文内容

深入掌握 Excel Worksheet 对象的编程操作

访客 技术 2026年7月20日 3

获取工作表的父级对象

在 VBA 中,每个 Worksheet 对象都隶属于一个 Workbook。通过 Parent 属性可以访问其所属的工作簿对象。

Sub ShowParentWorkbook()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 输出父对象(即工作簿)名称
    Debug.Print "当前工作表所属工作簿: " & ws.Parent.Name
    
    Set ws = Nothing
End Sub

区分工作表的显示名称与代码名称

Excel 工作表有两个关键名称:一个是用户可见的标签名(Name),另一个是在 VBE 编辑器中设置的代码名称(CodeName)。后者在运行时不可更改,适合用于稳定引用。

Dim wsConfig As Worksheet

Sub PrintNames()
    On Error Resume Next
    Debug.Print "标签名称为: " & wsConfig.Name
    Debug.Print "代码名称为: " & wsConfig.CodeName
End Sub

安全检查工作表是否存在

在操作工作表前应先验证其存在性,避免因名称错误导致运行时异常。

Function SheetExists(wb As Workbook, sheetName As String) As Boolean
    Dim tempSheet As Object
    On Error GoTo NotExist
    Set tempSheet = wb.Sheets(sheetName)
    SheetExists = True
    Exit Function
NotExist:
    SheetExists = False
End Function

若需根据代码名称判断工作表是否存在,可遍历所有工作表进行比对:

Function SheetByCodeExists(wb As Workbook, codeName As String) As Boolean
    Dim ws As Worksheet
    For Each ws In wb.Worksheets
        If StrComp(ws.CodeName, codeName, vbTextCompare) = 0 Then
            SheetByCodeExists = True
            Exit For
        End If
    Next ws
    Set ws = Nothing
End Function

控制工作表的可见状态

可通过设置 Visible 属性实现隐藏或彻底隐藏(仅代码可访问)工作表。

Sub HideSheet(sName As String, isDeepHide As Boolean)
    If SheetExists(ThisWorkbook, sName) Then
        With ThisWorkbook.Sheets(sName)
            .Visible = IIf(isDeepHide, xlSheetVeryHidden, xlSheetHidden)
        End With
    End If
End Sub

Sub UnhideSheet(sName As String)
    If SheetExists(ThisWorkbook, sName) Then
        ThisWorkbook.Sheets(sName).Visible = xlSheetVisible
    End If
End Sub

批量解除所有工作表的隐藏状态:

Sub RevealAllSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next ws
    Set ws = Nothing
End Sub

保护与解除工作表内容

使用 Protect 方法防止用户修改单元格内容,提升数据安全性。

Function LockSheet(targetSheet As Worksheet, pwd As String) As Boolean
    On Error GoTo Fail
    If Not targetSheet.ProtectContents Then
        targetSheet.Protect Password:=pwd, _
                           DrawingObjects:=True, _
                           Contents:=True, _
                           Scenarios:=True
    End If
    LockSheet = True
    Exit Function
Fail:
    LockSheet = False
End Function

对应地,使用 Unprotect 方法移除保护:

Function UnlockSheet(targetSheet As Worksheet, pwd As String) As Boolean
    On Error GoTo Err
    If targetSheet.ProtectContents Then
        targetSheet.Unprotect Password:=pwd
    End If
    UnlockSheet = True
    Exit Function
Err:
    UnlockSheet = False
End Function

管理工作表的增删操作

动态添加新工作表,并指定插入位置和数量:

' 添加两个新工作表,位于第二张表之前
ThisWorkbook.Worksheets.Add Before:=ThisWorkbook.Worksheets(2), Count:=2

删除工作表时需确保至少保留一张可见工作表,并可临时关闭提示警告:

Function RemoveSheet(sheetToDelete As Worksheet, silentMode As Boolean) As Boolean
    Dim alertState As Boolean
    Dim success As Boolean
    success = False
    
    If CountVisibleInBook(sheetToDelete.Parent) <= 1 Then
        RemoveSheet = False
        Exit Function
    End If

    On Error GoTo CleanUp
    alertState = Application.DisplayAlerts
    If silentMode Then Application.DisplayAlerts = False

    success = sheetToDelete.Delete

CleanUp:
    Application.DisplayAlerts = True  ' 恢复警告
    RemoveSheet = success
End Function

Function CountVisibleInBook(book As Workbook) As Integer
    Dim i As Integer, count As Integer
    For i = 1 To book.Sheets.Count
        If book.Sheets(i).Visible = xlSheetVisible Then
            count = count + 1
        End If
    Next i
    CountVisibleInBook = count
End Function

移动与复制工作表

支持将工作表移动或复制到指定位置,或生成新的工作簿副本。

Sub ManageSheetLayout()
    ' 复制第三个工作表至新工作簿
    ThisWorkbook.Worksheets(3).Copy
    
    ' 将其复制到第二个工作表之前
    ThisWorkbook.Worksheets(3).Copy Before:=ThisWorkbook.Worksheets(2)
    
    ' 移动第二张表至末尾
    ThisWorkbook.Worksheets(2).Move After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
End Sub

按名称字母顺序对工作表排序:

Sub SortSheetsAlphabetically(workbook As Workbook)
    Dim sorted As Boolean
    Dim passCount As Integer
    Dim total As Integer
    total = workbook.Worksheets.Count
    Do While Not sorted
        sorted = True
        passCount = passCount + 1
        Dim i As Integer
        For i = 1 To total - passCount
            If StrComp(workbook.Worksheets(i).Name, workbook.Worksheets(i + 1).Name, vbTextCompare) > 0 Then
                workbook.Worksheets(i + 1).Move Before:=workbook.Worksheets(i)
                sorted = False
            End If
        Next i
    Loop
End Sub

响应工作表事件

利用内置事件过程监控用户操作。例如,当 B1 或 B2 单元格值改变时,自动调整行列尺寸。

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
        Case "$B$1"
            AdjustColumnWidth Target.Value
        Case "$B$2"
            AdjustRowHeight Target.Value
    End Select
End Sub

Sub AdjustColumnWidth(widthInput As Variant)
    If IsNumeric(widthInput) Then
        With Me.Columns
            If widthInput > 0 And widthInput < 100 Then
                .ColumnWidth = widthInput
            ElseIf widthInput = 0 Then
                .ColumnWidth = Me.StandardWidth
            End If
        End With
    End If
End Sub

Sub AdjustRowHeight(heightInput As Variant)
    If IsNumeric(heightInput) Then
        With Me.Rows
            If heightInput > 0 And heightInput < 100 Then
                .RowHeight = heightInput
            ElseIf heightInput = 0 Then
                .RowHeight = Me.StandardHeight
            End If
        End With
    End If
End Sub

注意:Me 关键字在此上下文中代表触发事件的当前工作表对象。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。