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