Excel 自动目录,真好用!我们不一样!上源码和详细注释

yumo6661个月前 (03-24)技术文章18

非同一般的"Excel 自动目录":

我这个不同于网上其它那些不够自动化的、不够标准化的"Excel 自动目录"。

Excel工作簿内有太多工作表时,Excel自带的工作表目录,一屏显示不完

本文VBA程序自动生成的目录如下图:

优点:

  • 自动化:只要进入Index工作表,程序即可自动创建或更新工作簿索引目录。
  • 简单化:无需任何其它设置:无需创建按钮或公式等等,统统都不需要
  • 标准化:每次生成的目录都有统一标准格式
  • 系统化:带超链接(蓝色下划线),点击工作表名称,就跳转到工作表
  • 智能化:默认不显示隐藏工作表,但通过筛选显示出来;自动设置字体格式、保护目录
  • 及时化:运行快速,瞬间完成;随时更新,自动更新

VBA源码和详细注释:

' Thisworkbook.cls
Option Explicit

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Index" Then
        Call updateIndex   ' Excel VBA 持续超越  by Jeffrey JC Li
    End If
End Sub

Private Sub updateIndex _
                                        (Optional wbk As Workbook)  ' Excel VBA 持续超越  by Jeffrey JC Li
    Application.ScreenUpdating = False
    Debug.Print Now, "Start:  updateIndex()."
    Dim rtv
    Dim wst As Worksheet
    Dim lRow1 As Long
    Dim lCol1 As Long
    Dim lRowMax As Long
    Dim lColMax   As Long
    Dim lColLink As Long
    Dim ll As Long
    Dim tm0 As Date
    Dim tm1 As Date
    tm0 = Timer
    If wbk Is Nothing Then Set wbk = ActiveWorkbook
    If Not SheetExists("Index", wbk.Name) Then
        wbk.Sheets.Add.Name = "Index"
    End If
    wbk.Sheets("Index").Move Before:=Sheets(1)
    Set wst = wbk.Sheets("Index")
    lRow1 = 3      ' 目录内容第一行所在行号=3
    lCol1 = 1        ' 目录最左边列号
    lRowMax = wbk.Sheets.Count + lRow1 - 1       ' 目录最后一行的行号
    lColLink = 2   ' 目录链接所在列号
    lColMax = lColLink + 1  ' 目录最右边列号
    ' 目录共3列:编号,名称链接,和名称文本
    Call clearIndex    ' 先清除目录 '
    With wst
        ' 取消保护
        If .ProtectionMode = True Then
            Call unprotectSheet(wst)   ' 
        End If
        ' 填写表头
        .Cells(1, 1).Value = "Index"
        .Cells(1, 1).Value = wbk.Name
        .Cells(2, 1) = "No. 编号"
        .Cells(2, 2).Value = "Sheet 工作表"
        .Cells(2, 3).Value = "Visible 是否可见"
        .Cells(2, 4).Value = "Remark 备注"
        '生成目录超链接和文本
        For ll = 1 To wbk.Sheets.Count
            '填写工作表序号
            .Cells(ll + lRow1 - 1, lCol1).Value = ll
            '填写每个工作表名称,并生成超链接
            .Hyperlinks.Add _
                    Anchor:=.Cells(ll + lRow1 - 1, lCol1 + 1), _
                    Address:="", _
                    SubAddress:="'" & Sheets(ll).Name & "'!A1", _
                    TextToDisplay:="'" & Sheets(ll).Name
            '''备注每个工作表是否为可见(非隐藏.Visible = xlSheetVisible )
                If Sheets(ll).Visible = True Then
                    .Cells(ll + lRow1 - 1, lCol1 + 2).Value = "Yes"
                Else
                    .Cells(ll + lRow1 - 1, lCol1 + 2).Value = "No"
                End If
        Next
        '设置单元格格式 区域: A1" & ":D" & lRowMax
        .Range("A1" & ":D" & lRowMax).Select
        ' 设置表格边框线格式
        Call setBorderStyleAsMyCustom   ' 
        Call setFontArialColorBlackSize10   ' 
        Call setRangeAlignmentCenter   ' 
        '修改B列 上左对齐
        .Range("B" & lRow1 & ":B" & lRowMax).Select
        Call setRangeAlignmentLeftTop   ' 
        Call setFontArialColorBlueSize10
        '设置B列 下划线
        Call setUnderline
        '删除所有条件格式
        .Cells.FormatConditions.Delete
        ' 新增条件格式(C列含有No的单元格,显示为红色)
        With .Columns("C:C")
            .FormatConditions.Add _
                Type:=xlTextString, _
                String:="No", _
                TextOperator:=xlContains
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Font
                .Color = -16776961
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
        End With
        ' 增加公式型条件格式,将所有隐藏工作表行的背景色设置为灰色
        With .Range("A3:D" & lRowMax)
            .FormatConditions.Add _
                Type:=xlExpression, _
                Formula1:="=$C3=""No"""     ' 条件:如果C列任意单元格是No
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorDark1     ' 则设置为主题颜色灰色
                .TintAndShade = -0.05                         ' -1~1   ' -1暗 1亮
            End With
            .FormatConditions(1).StopIfTrue = False
        End With
        ' 自动筛选:仅显示C列为Yes的行(即:隐藏的工作表不显示)
        If .AutoFilterMode Or .FilterMode Then
            .Rows("2:2").AutoFilter
            .Rows("2:2").AutoFilter
        Else
            .Rows("2:2").AutoFilter
        End If
        .Rows("2:2").AutoFilter Field:=3, Criteria1:="Yes"
        ' 设置列宽: 自适应
        '.Columns("A:A").ColumnWidth = 10   ' A: 10     B: 50   C: 25   D: 30
        .Columns("A:C").EntireColumn.AutoFit
        .Columns("D:D").ColumnWidth = 30
        ' 设置行高: 自适应
        .Cells.EntireRow.AutoFit
        ' 冻结窗格
        .Range("B3").Select
        ActiveWindow.FreezePanes = True
        ' 隐藏网格线
        ActiveWindow.DisplayGridlines = False
        ' 选择单元格
        .Cells(lRow1, "E").Select
        ' 保护工作表 密码为空        'Call ProtectSheet(wst)
        .Protect
    End With
    tm1 = Timer
    Debug.Print Now, "Done updateIndex(). Time elapsed: " & Round(tm1 - tm0, 0) & " s."
    Application.ScreenUpdating = True
    MsgBox "完成:更新目录!Complete updating index of workbook. " & vbCrLf & vbCrLf & _
                "用时:Time elapsed: " & Round(tm1 - tm0, 3) & " s.", _
                vbOKOnly + vbDefaultButton1 + vbInformation + vbApplicationModal, _
                "Excel VBA 持续超越  by Jeffrey JC Li"
    Set wst = Nothing
    Set wbk = Nothing
End Sub

后记

感谢欣赏、关注、点赞、收藏与转发。

如果有任何问题,欢迎评论或者私信。

下期见~

#文章首发挑战赛#

#头条首发大赛#

#头条创作挑战赛#

#长文创作激励计划#

#excel##vba##Excel##VBA#

相关文章

我的VBA理财工作簿之账号篇,含完整公式+VBA源码

效果图:账号默认界面:功能和优点简单好用:一看就会,方便快捷信息量大:在一张工作表内存储账号属性和交易记录多视图:可切换:每次进入账号工作表,程序自动弹窗提示选择视图1) 账号属性完整模式,用于查看和...

马上跨年,我用十款不同的表白代码帮室友顺利脱单「内附源码」

希望大家拥有爱情一、故事背景这周过完就2022年了,为了帮助我的室友在年末顺利脱单,22年有个完美的爱情,特地找了10款不同的表白代码帮助她脱单,废话不多说,直接看效果。(文末有源码获取方式)故事的开...

(17) 如何给两条或三条均线围成的区域涂颜色?

(大家好,我是稳健投资人。如果您对这里的话题感兴趣的话,请点击上方的“关注”,以方便下次快速找到我。)朋友好们!在第15讲,我们学习了M A C D指标顶、底背离的在主图上的显示,有朋友就提要求,能不...

元宇宙的3D虚拟与现实的效果附源码

项目介绍:最近元宇宙非常火热,我也不是很懂这个到底代表了什么意义。应该跟之前的3D效果和VR效果的效果差不多搭建要想按照nodejs才能使用# Install dependencies (only t...

火爆全网:后台管理系统源码分享(项目部署+前后端手册+运维)

这是一款基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue 的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数...