• 10 探索其他Excel对象


    10.1 产生一个好的第一印象

    10.1.1 为我们的世界着色

    rgb(red:=[0,225],green:=[0,225],blue:=[0,225])

    此函数生成一个表示颜色的整数。VBA预定义了一些少量的颜色值,如vbBlack, vbRed等。

    代码清单10.1:颜色的乐趣

    Sub ColorWorksheet()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim lColumn As Long
        Dim lColor As Long
        
        Set ws = ThisWorkbook.Worksheets(1)
        lRow = 1
        lColumn = 1
        
        Application.ScreenUpdating = False
        Application.StatusBar = "On column " & lColumn
        
        '256 * 256 * 256 - 1
        For lColor = 0 To 256 * 256 * 256 - 1
            'record color
            ws.Cells(lRow, lColumn).Interior.Color = lColor
            
            'move to next cell
            lRow = lRow + 1
            
            'worksheet has 65,536 rows
            If lRow = 65537 Then
                lRow = 1
                lColumn = lColumn + 1
                Application.StatusBar = "On column " & lColumn
            End If
        Next
        
        Set ws = Nothing
        Application.ScreenUpdating = True
        Application.StatusBar = False
    End Sub

    能够显示一个颜色的对象都有一个ColorIndex属性。属性ColorIndex的值相当于颜色面板的一个索引。颜色面板是每个工作薄专有的。

    10.1.2 字体的细微之处

    Font对象表示字体。常用属性有Bold, Color, Italic, Name, Size, Underline等。关于Font对象的详细信息,参见:http://msdn.microsoft.com/en-us/library/ff840959(v=office.15).aspx

    代码清单10.2:Font对象—一个简单、直观的对象

    Sub DemonstrateFontObject()
        Dim nColumn As Long
        Dim nRow As Long
        Dim avFonts As Variant
        
        Dim avColors As Variant
        
        For nColumn = 1 To 5
            With ThisWorkbook.Worksheets(1).Columns(nColumn).Font
                .Size = nColumn + 10
                If nColumn Mod 2 = 0 Then
                    .Bold = True
                    .Italic = False
                Else
                    .Bold = False
                    .Italic = True
                End If
            End With
        Next
           
        avFonts = Array("Tahoma", "Arial", "MS Sans Serif", "Verdana", "Georgia")
        avColors = Array(vbRed, vbBlue, vbBlack, vbGreen, vbYellow)
        For nRow = 1 To 5
            With ThisWorkbook.Worksheets(1).Rows(nRow).Font
                .Color = avColors(nRow - 1)
                .Name = avFonts(nRow - 1)
                
                If nRow Mod 2 = 0 Then
                    .Underline = True
                Else
                    .Underline = False
                End If
            End With
        Next
    End Sub

    10.1.3 内部布置

    Interior对象代表一个范围或者其他对象的背景。参见:http://msdn.microsoft.com/en-us/library/ff196598(v=office.15).aspx

    代码清单10.3:使用Interior对象改变一个范围的背景

    Sub InteriorExample()
        Dim rg As Range
        
        'create examples of each pattern
        Set rg = ThisWorkbook.Worksheets("Interior").Range("ListStart").Offset(1, 0)
        
        Do Until IsEmpty(rg)
            rg.Offset(0, 2).Interior.Pattern = rg.Offset(0, 1).Value
            rg.Offset(0, 3).Interior.Pattern = rg.Offset(0, 1).Value
            rg.Offset(0, 3).Interior.PatternColor = vbRed
            Set rg = rg.Offset(1, 0)
        Loop
        
        'create example of each vb defined color constant
        Set rg = ThisWorkbook.Worksheets("Interior").Range("ColorListStart").Offset(1, 0)
        Do Until IsEmpty(rg)
            rg.Offset(0, 2).Interior.Color = rg.Offset(0, 1).Value
            Set rg = rg.Offset(1, 0)
        Loop
        Set rg = Nothing
        
    End Sub

     以上例子应该从帮助文件中复制常数名称和对应值粘贴到名称(第一列)与值(第二列)列。

    代码清单10.4:漫步通过颜色面板

    Sub ViewWorkbookColors()
        Dim rg As Range
        Dim nIndex As Long
        
        Set rg = ThisWorkbook.Worksheets("Interior").Range("ColorIndexListStart").Offset(1, 0)
        
        For nIndex = 1 To 56
            rg.Value = nIndex
            rg.Offset(0, 1).Interior.ColorIndex = nIndex
            rg.Offset(0, 2).Value = rg.Offset(0, 1).Interior.Color
            
            Set rg = rg.Offset(1, 0)
        Next
        Set rg = Nothing
    End Sub

    工作薄的颜色面板保存了56个颜色,颜色索引的范围是1到56。

    10.1.4 这些边界不需要签证

    Range对象有一个Borders属性和BordersAround方法。它们被用来操作Range的边框。Borders属性返回Border对象的集合。

    Range.Borders属性,参见:http://msdn.microsoft.com/en-us/library/ff822605(v=office.15).aspx

    Borders对象,参见:http://msdn.microsoft.com/en-us/library/ff837809(v=office.15).aspx

    Border对象,参见:http://msdn.microsoft.com/en-us/library/ff838428(v=office.15).aspx

    代码清单10.5:与Border对象相关联的各种属性

    Sub BorderLineStyles()
        Dim rg As Range
        Set rg = ThisWorkbook.Worksheets("Borders").Range("LineStyleListStart").Offset(1, 0)
        
        Do Until IsEmpty(rg)
            rg.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = rg.Offset(0, 1).Value
            Set rg = rg.Offset(1, 0)
        Loop
        
        Set rg = Nothing    
    End Sub

    代码清单10.6:代码清单10.5的一个替代方法

    Sub BorderLineStyles2()
        Dim rg As Range
        Set rg = ThisWorkbook.Worksheets("Borders").Range("LineStyleListStart")
        
        rg.Offset(1, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous
        rg.Offset(2, 2).Borders(xlEdgeBottom).LineStyle = xlDash
        rg.Offset(3, 2).Borders(xlEdgeBottom).LineStyle = xlDashDot
        rg.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDashDotDot
        rg.Offset(5, 2).Borders(xlEdgeBottom).LineStyle = xlDot
        rg.Offset(6, 2).Borders(xlEdgeBottom).LineStyle = xlDouble
        rg.Offset(7, 2).Borders(xlEdgeBottom).LineStyle = xlLineStyleNone
        rg.Offset(8, 2).Borders(xlEdgeBottom).LineStyle = xlSlantDashDot
        
        Set rg = Nothing
    End Sub

    expression.BorderAround(LineStyle, Weight, ColorIndex, Color, ThemeColor)

    用于围绕范围创建一个边界。参见:http://msdn.microsoft.com/en-us/library/ff197210(v=office.15).aspx

    10.1.5 格式化数字

    NumberFormat属性是一个描述范围值如何输出的字符串。

    在Excel帮助中搜索:创建或删除自定义数字格式,可以查看关于格式字符串的详细解释。

    代码清单10.7:试验格式代码

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = Me.Range("FormatCode").Address Then
            ApplyFormatCode
        End If
    End Sub
    Private Sub ApplyFormatCode() 'if we attempt to apply an invalid 'number format code an error will 'occur - we need to catch it On Error GoTo ErrHandler 'clear any prior invalid code message Me.Range("FormatCode").Offset(0, 1).Value = "" 'attempt to apply the format code Me.Range("TestFormatCode").NumberFormat = Me.Range("formatcode").Value Exit Sub ErrHandler: 'OOPS-invalid format code 'set the format to general Me.Range("TestFormatCode").NumberFormat = "General" 'let the user know what happened Me.Range("FormatCode").Offset(0, 1).Value = "Invalid Format Code!" End Sub

    10.1.6 缩放工作表时节省大量时间

    下面演示通过修改NumberFormat来缩放数值的显示。

    代码清单10.8:为报表提供动态缩放

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = Me.Range("ScaleFactor").Address Then
            ScaleData
        End If    
    End Sub
    
    Private Sub ScaleData()
        If Me.Range("ScaleFactor").Value = "Normal" Then
            Me.Range("ScaleRange").NumberFormat = "#,##0"
        Else
            Me.Range("scaleRange").NumberFormat = "#,"
        End If
    End Sub

    10.2 图表操作

    10.2.1 从头创建图表

    代码清单10.9:使用ChartWizard方法创建一个新图表

    'creates a chart using the ChartWizard Method
    Sub CreateExampleChartVersionI()
        Dim ws As Worksheet
        Dim rgChartData As Range
        Dim chrt As Chart
        
        Set ws = ThisWorkbook.Worksheets("Basic Chart")
        Set rgChartData = ws.Range("B1").CurrentRegion
        
        'create a new empty chart
        Set chrt = Charts.Add
        
        'embed chart in worksheet - this creates a new object
        Set chrt = chrt.Location(xlLocationAsObject, ws.Name)
        
        'use chart wizard to populate/format empty chart
        chrt.ChartWizard _
             Source:=rgChartData, _
             Gallery:=xlColumn, _
             Format:=1, _
             PlotBy:=xlColumns, _
             categorylabels:=1, _
             serieslabels:=1, _
             HasLegend:=True, _
             Title:="Gross Domestric Product Version I", _
             Categorytitle:="year", _
             valuetitle:="GDP in billions of $"
             
        Set chrt = Nothing
        Set rgChartData = Nothing
        Set ws = Nothing
    End Sub


    代码清单10.10:使用Chart对象创建一个图表

    'creates a chart using basic chart properties and Methods
    Sub CreateExampleChartVersionII()
        Dim ws As Worksheet
        Dim rgChartData As Range
        Dim chrt As Chart
        
        Set ws = ThisWorkbook.Worksheets("Basic Chart")
        Set rgChartData = ws.Range("B1").CurrentRegion
        
        'create a new empty chart
        Set chrt = Charts.Add
        
        'embed chart in worksheet - this creates a new object
        Set chrt = chrt.Location(xlLocationAsObject, ws.Name)
        
        With chrt
            .SetSourceData rgChartData, xlColumns
            .HasTitle = True
            .ChartTitle.Caption = "Gross Domestric Product Version II"
            .ChartType = xlConeColClustered
            
            With .Axes(xlCategory)
                .HasTitle = True
                .AxisTitle.Caption = "Year"
            End With
            
            With .Axes(xlValue)
                .HasTitle = True
                .AxisTitle.Caption = "GDP in billions of $"
            End With
        End With
             
        Set chrt = Nothing
        Set rgChartData = Nothing
        Set ws = Nothing    
    End Sub

    10.2.2 图表搜索

    可以像工作表一样引用图表页 

        Dim chrt1 As Chart 
        Dim chrt2 As Chart 
        
        'set a reference to the chart sheet named Chart4 
        Set chrt1 = ThisWorkbook.Charts("Chart4") 
            
        'set a reference to the 2nd chart sheet in this workbook 
        Set chrt2 = ThisWorkbook.Charts(2)

    如果图表嵌入在一个工作表中,我们需要使用ChartObjects集合。

        Dim ws As Worksheet 
        
        Dim chrt1 As Chart 
        Dim chrt2 As Chart 
        
        Set ws = ThisWorkbook.Worksheets(1) 
        
        'set a reference to the embedded chart named Chart4 
        Set chrt1 = ws.ChartObjects("Chart4").Chart 
            
        'set a reference to the 2nd embedded chart 
        Set chrt2 = ws.ChartObjects(2).Chart

    代码清单10.11:使用图表标题查寻图表

    'searches charts on a worksheet by chart title
    Function GetChartByCaption(ws As Worksheet, sCaption As String) As Chart
        Dim cht As Chart
        Dim chtObj As ChartObject
        Dim sTitle As String
        
        Set cht = Nothing
        
        'loop through all chart objects on the ws
        For Each chtObj In ws.ChartObjects
            'make sure current chart object chart has a title
            If chtObj.Chart.HasTitle Then
                sTitle = chtObj.Chart.ChartTitle.Caption
                'is this title a match?
                If StrComp(sTitle, sCaption, vbTextCompare) = 0 Then
                    ' bingo
                    Set cht = chtObj.Chart
                    Exit For
                End If
            End If
        Next    
    
        Set GetChartByCaption = cht
    
        Set chtObj = Nothing
        Set cht = Nothing
    End Function
    
    Sub TestGetChartByCaption()
        Dim ws As Worksheet
        Dim cht As Chart
    
        Set ws = ThisWorkbook.Worksheets("Basic Chart")
        Set cht = GetChartByCaption(ws, "I am the Chart Title")
        
        If Not cht Is Nothing Then
            MsgBox "Found chart"
        Else
            MsgBox "Sorry, Can not Found chart"    
        End If
        
        Set cht = Nothing
        Set ws = Nothing
    End Sub

    代码清单10.12:格式化一个基本图表

    Sub FormattingCharts()
        Dim ws As Worksheet
        Dim cht As Chart
        Dim ax As Axis
        
        Set ws = ThisWorkbook.Worksheets("Basic Chart")
        Set cht = GetChartByCaption(ws, "GDP")
        
        If Not cht Is Nothing Then
            'Format category axis
            Set ax = cht.Axes(xlCategory)
            With ax
                .AxisTitle.Font.Size = 12
                .AxisTitle.Font.Color = vbRed
            End With
            
            'Format value axis
            Set ax = cht.Axes(xlValue)
            With ax
                .HasMinorGridlines = True
                .MinorGridlines.Border.LineStyle = xlDashDot
            End With
            
            'format plot area
            With cht.PlotArea
                .Border.LineStyle = xlDash
                .Border.Color = vbRed
                .Interior.Color = vbWhite
                .Width = cht.PlotArea.Width + 10
                .Height = cht.PlotArea.Height + 10            
            End With
            
            'format misc other
            cht.ChartArea.Interior.Color = vbWhite
            cht.Legend.Position = xlLegendPositionBottom
        End If
        
        Set ax = Nothing
        Set cht = Nothing
        Set ws = Nothing
    End Sub
  • 相关阅读:
    python 4 days
    python 3 days
    python 2 days
    Git学习1-- 简介、命令使用、添加远程仓库方法
    Week2-列表、字符串方法示例
    Week2-购物车程序
    Week2-模块初识和数据类型
    Week1-作业:用户登陆程序
    Week1-Python入门教程(后续完善中)
    Intellij IDEA(eclipse设置)常用快捷键
  • 原文地址:https://www.cnblogs.com/cuishengli/p/3573014.html
Copyright © 2020-2023  润新知