暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ListObject对象的TableStyleElement

VBA语言専攻 2022-11-12
117
分享成果,随喜正能量】你若好到毫无保留,对方就敢坏到肆无忌惮。人需要保持一颗善心是没有错,但不是对谁都好都没有底线,你没有底线,他们就没有原则。。
《VBA高级应用30例》(10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,今日内容是第3个专题“在Excel中的ListObject对象”,今日讲解:ListObject对象的TableStyleElement

应用在Excel中的ListObject对象

   在VBA中,表(Tables)的应用还是较普遍的,它们被称为ListObjects,这是Excel 2003引入的一个集合。但是对象模型的这一部分有很大的变化,我在这个专题简单给大家讲解一下应用,包括创建及一些格式操作。

提取表内单元格的格式元素

或许有的学员会问,如果需要表格中某个单元格的ThemeColor,为什么不简单地用cell.Interior.ThemeColor呢?这是因为我们要提取的单元格格式完全由表格的设置和选定的表格样式所规定的。为此,我们必须要获取表中单元格的格式元素,为了完成这个工作,我们需要:
1)找出单元格在表格中的位置(在标题行、第一列、表格的大部分)
2)确定表格设置:是否启用了行分条,是否有特殊格式的第一列
基于这些信息,我们可以从表样式中提取适当的TableStyleElement并读取其属性。我们在下面给出一个函数,这个函数返回名为oLo的表对象内的单元格oCell的TableStyleElement:
Function GetStyleElementFromTableCell(oCell As Range, oLo As ListObject) As TableStyleElement
    Dim lRow As Long
    Dim lCol As Long
    '确定我们在表中的哪一行
    lRow = oCell.Row - oLo.DataBodyRange.Cells(1, 1).Row
    lCol = oCell.Column - oLo.DataBodyRange.Cells(1, 1).Column
   
    With oLo
        If lRow < 0 And .ShowHeaders Then
            '位于第一行,并具有标题
            Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlHeaderRow)
        ElseIf .ShowTableStyleFirstColumn And lCol = 0 Then
            '在第一列上,并具有第一列样式
            Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlFirstColumn)
        ElseIf .ShowTableStyleLastColumn And lCol = oLo.Range.Columns.Count - 1 Then
            '在最后一列上,具有最后一列样式
            Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlLastColumn)
        ElseIf lRow = .DataBodyRange.Rows.Count And .ShowTotals Then
            '位于最后一行,并具有总计行
            Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlTotalRow)
        Else
            If .ShowTableStyleColumnStripes And Not .ShowTableStyleRowStripes Then
                '在表中,有列条纹
                If lCol Mod 2 = 0 Then
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlColumnStripe1)
                Else
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlWholeTable)
                End If
            ElseIf .ShowTableStyleRowStripes And Not .ShowTableStyleColumnStripes Then
                '在表中,有列条纹
                If lRow Mod 2 = 0 Then
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlRowStripe1)
                Else
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlWholeTable)
                End If
            ElseIf .ShowTableStyleColumnStripes And .ShowTableStyleRowStripes Then
                If lRow Mod 2 = 0 And lCol Mod 2 = 0 Then
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlRowStripe1)
                ElseIf lRow Mod 2 <> 0 And lCol Mod 2 = 0 Then
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlColumnStripe1)
                ElseIf lRow Mod 2 = 0 And lCol Mod 2 <> 0 Then
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlRowStripe1)
                Else
                    Set GetStyleElementFromTableCell = oLo.TableStyle.TableStyleElements(xlWholeTable)
                End If
            End If
        End If
    End With
End Function

代码的部分截图:
代码的讲解:
1)ListObject.DataBodyRange 属性:这个属性返回一 个Range 对象,该对象代表表格中除标题行之外的值范围。 此为只读属性。
2)ListObject.TableStyle 属性:获取或设置指定的 ListObject 对象的表样式。 读/写 Variant。
3)TableStyleElements 对象:代表表格样式元素。他的枚举值如下:
名称
说明
xlBlankRow
19
空白行
xlColumnStripe1
7
列条纹 1
xlColumnStripe2
8
列条纹 2
xlColumnSubheading1
20
列副标题 1
xlColumnSubheading2
21
列副标题 2
xlColumnSubheading3
22
列副标题 3
xlFirstColumn
3
第一列
xlFirstHeaderCell
9
第一个标题单元格
xlFirstTotalCell
11
第一个汇总单元格
xlGrandTotalColumn
4
总计列
xlGrandTotalRow
2
总计行
xlHeaderRow
1
标题行
xlLastColumn
4
最后一列
xlLastHeaderCell
10
最后一个标题单元格
xlLastTotalCell
12
最后一个总计单元格
xlPageFieldLabels
26
页面字段标签
xlPageFieldValues
27
页面字段值
xlRowStripe1
5
行条纹 1
xlRowStripe2
6
行条纹 2
xlRowSubheading1
23
行副标题 1
xlRowSubheading2
24
行副标题 2
xlRowSubheading3
25
行副标题 3
xlSlicerHoveredSelectedItemWithData
33
用户悬停在上面且包含数据的选定项。
xlSlicerHoveredSelectedItemWithNoData
35
用户悬停在上面且不包含数据的选定项。
xlSlicerHoveredUnselectedItemWithData
32
用户悬停在上面,未选定且包含数据的项。
xlSlicerHoveredUnselectedItemWithNoData
34
用户悬停在上面,未选定且不包含数据的项。
xlSlicerSelectedItemWithData
30
包含数据的选定项。
xlSlicerSelectedItemWithNoData
31
不包含数据的选定项。
xlSlicerUnselectedItemWithData
28
未选定且包含数据的项。
xlSlicerUnselectedItemWithNoData
29
未选定且不包含数据的项。
xlSubtotalColumn1
13
分类汇总列 1
xlSubtotalColumn2
14
分类汇总列 2
xlSubtotalColumn3
15
分类汇总列 3
xlSubtotalRow1
16
分类汇总行 1
xlSubtotalRow2
17
分类汇总行 2
xlSubtotalRow3
18
分类汇总行 3
xlTimelinePeriodLabels1
38
时间线时间段标签
xlTimelinePeriodLabels2
39
其他时间线时间段标签
xlTimelineSelectedTimeBlock
40
选定的时间线时间块
xlTimelineSelectedTimeBlockSpace
42
选定的时间线时间块空间
xlTimelineSelectionLabel
36
时间线选择标签
xlTimelineTimeLevel
37
时间线级别
xlTimelineUnselectedTimeBlock
41
未选择时间线时间块
xlTotalRow
2
汇总行
xlWholeTable
0
整个表

我们可以利用下面的主程序代码应用上面的函数:

Sub mynzGetStyle()
    Dim oLo As ListObject
    Dim oTSt As TableStyleElement
    Set oLo = ActiveSheet.ListObjects(1)
    R0 = ActiveCell.Row
    C0 = ActiveCell.Column
   
    R1 = oLo.DataBodyRange.Cells(1, 1).Row
    If oLo.ShowHeaders Then R1 = R1 - 1
    C1 = oLo.DataBodyRange.Cells(1, 1).Column
   
    R2 = oLo.DataBodyRange.Cells(oLo.ListRows.Count, oLo.ListColumns.Count).Row
    C2 = oLo.DataBodyRange.Cells(oLo.ListRows.Count, oLo.ListColumns.Count).Column
   
    If R0 > R2 Or C0 > C2 Or R0 < R1 Or C0 < C1 Then
      MsgBox "活动单元格在表的范围之外": End
    End If
    'MsgBox oLo.Name
    Set oTSt = GetStyleElementFromTableCell(ActiveCell, oLo)
    With ActiveCell.Offset(, 10)
        If oTSt.Interior.ThemeColor Then .Interior.ThemeColor = oTSt.Interior.ThemeColor
        If oTSt.Interior.TintAndShade Then .Interior.TintAndShade = oTSt.Interior.TintAndShade
    End With
End Sub

代码截图:

代码的讲解:
1)Interior.ThemeColor 属性:返回或设置一 个 Variant 值,其中包含一个代表颜色的 XlThemeColor 常量。 读/写 Variant。
XlThemeColor 枚举值如下:
名称
说明
xlThemeColorAccent1
5
Accent1
xlThemeColorAccent2
6
Accent2
xlThemeColorAccent3
7
Accent3
xlThemeColorAccent4
8
Accent4
xlThemeColorAccent5
9
Accent5
xlThemeColorAccent6
10
Accent6
xlThemeColorDark1
1
Dark1
xlThemeColorDark2
3
Dark2
xlThemeColorFollowedHyperlink
12
已访问的超链接
xlThemeColorHyperlink
11
Hyperlink
xlThemeColorLight1
2
Light1
xlThemeColorLight2
4
Light2

2)Interior.TintAndShade 属性:返回或设置一个 Single,使颜色变深或变浅。

l对于 TintAndShade 属性,你可以输入一个从 -1 (最深) 到 1 (最亮) 一个数字。 零 (0) 中性值。
l试图将此属性设置为小于 -1 或大于 1 的值会导致运行时错误:"指定的值在范围外。" 此属性用于主题颜色和非主题颜色。

3)上面的代码首先会判断活动单元格是否在表的范围之内;如果在则提取活动单元格的格式元素:ThemeColor和TintAndShade属性。

代码的运行结果测试:

结论: 在这个应用中,给大家详细讲解了listObject对象的一些基本概念及操作,侧重讲了一些格式元素。对于VBA中表的应用本讲只是粗略的给大家以展示,在后续的应用中有机会将侧重应用方面分享给大家。

今日内容回向:
   1  如何将范围转变为表?
   2  表如何实现按照颜色及数值的排序?
3  表的格式元素有哪些?  
Ø本讲内容参考程序文件:高级应用03.xlsm


我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

 分享成果,随喜正能量】 当善良失去原则的时候,就助长了恶。有智慧的善良才是真善良,没有锋芒、没有棱角的人,是很难在这个世界走得更远。这股锋芒就是智慧和原则。。

文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论