016 高亮显示单元格区域
如果希望以某种方式突出显示活动单元格或者指定的单元格区域,从而一目了然地获得某些信息,那么可以高亮显示活动单元格区域,如下面的代码所示。
Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)
Cells.Interior.ColorIndex= xlColorIndexNone
Target.Interior.ColorIndex= 8
End Sub 代码解析:
设置工作表当前选定区域单元格的内部填充颜色,以高亮显示选定区域。
第2行代码将工作表中所有的单元格的内部填充颜色设置为xlColorIndexNone,即取消单元格的内部填充颜色。
第3行代码将工作表中选定单元格的内部填充颜色设置为8。
应用于Interior对象的ColorIndex属性返回或设置边框内部的颜色。该颜色可指定为当前调色板中颜色的编号或为 XlColorIndex 常量之一:
xlColorIndexAutomatic(指定对图形对象自动填充)、xlColorIndexNone(用于指定无内部填充)。
还可以高亮显示指定区域内的行列,如下面的代码所示。
Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)
Dimrng As Range
Cells.Interior.ColorIndex= xlNone
Setrng = Application.Union(Target.EntireColumn,Target.EntireRow)
rng.Interior.ColorIndex= 24
End Sub 代码解析:
设置工作表当前选定区域单元格内部填充颜色,高亮显示活动单元格所在的行列。
第4行代码使用Union方法将所选单元格所在的行、列连接起来成为一个区域,关于Union方法请参阅▲1-6。
注意使用此方法时,工作表中所有设置的单元格内部填充颜色将会被清除。(不包括通过条件格式设置的单元格内部填充颜色),同时无法在工作表中实现复制粘贴功能。 ▲017 双击被保护单元格时不显示提示消息框
当用户使用鼠标左键双击被保护工作表中锁定的单元格区域时,系统将显示消息框。
如果不希望显示该消息框,可以在工作表Worksheet_BeforeDoubleClick事件中进行设置,如下面的代码所示。
Private Sub Worksheet_BeforeDoubleClick(ByValTarget As Range,Cancel As Boolean)
If Target.Locked= True Then
MsgBox 此单元格已保护,不能编辑!
Cancel = True
EndIf
End Sub 代码解析:
当用户使用鼠标左键双击工作表单元格时,触发Worksheet_BeforeDoubleClick事件。该事件中的Target参数代表用户双击鼠标左键的单元格区域。
参数Cancel设置是否取消该操作。如果将参数Cancel设置为True,将不进行默认的双击操作。
第2行代码中判断用户双击鼠标左键的单元格区域是否已锁定(Range对象的Locked属性返回或设置Range对象是否锁定),如果单元格区域已锁定,则设置参数Cancel设置为True,不进行默认的双击操作,因而不再显示上图所示的提示的消息框,只显示一个自定义的提示信息, ▲018 重新计算工作表指定区域
如果在工作表中含有大量公式,那么在对工作表执行重新计算操作时,可能需要较长的时间。在实际工作中,有时希望仅对指定的区域进行重新计算,以提高计算效率,那么可以使用下面的代码。
Sub CalculationSpecialRange()
DimOldCalculation As XlCalculation
OldCalculation= Application.Calculation
Application.Calculation= xlCalculationManual
ActiveSheet.Range(A1:D10).Calculate
Application.Calculation= OldCalculation
End Sub 代码解析:
CalculationSpecialRange过程对单元格A1到B10区域进行重新计算。
第3行代码保存当前应用程序的Calculation属性设置。应用于Application对象的Calculation属性返回或设置当前应用程序的计算模式,可为表格所示的XlCalculation常量之一。
第4行代码将计算模式设置为手动重算。
第5行代码重新计算活动工作表指定的单元格区域B3:D7。(指定区域之外的公式将不重新计算,但包含易失性函数的公式除外)
第6行代码恢复当前应用程序的Calculation属性设置。 ▲019 单元格录入数据后自动保护
下面的代码可以使用户在单元格录入数据后自动对已录入数据单元格进行保护,防止修改数据
Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)
On ErrorResume Next
Sheet1.UnprotectPassword:=12345
If Target.Value ““ Then
Target.Locked = True
Sheet1.Protect Password:=12345
EndIf
End Sub 代码解析:
工作表的SelectionChange事件,在单元格录入数据后自动对已录入数据单元格进行保护。
第3行代码使用Unprotect方法取消工作表的保护。应用于Worksheet 对象的Unprotect方法取消工作表的保护,如果工作表不是受保护的,则此方法不起作用,语法如下:
expression.Unprotect(Password)
参数expression是必需的,该表达式返回一个Worksheet对象。
参数Password是可选的,指定用于解除工作表的保护的密码,此密码是区分大小写的。
第4、5行代码单元格录入数据后将Locked属性设置为True。Locked属性应用于Range对象时,如果Range对象被锁定,则该值为True,当工作表有保护时Range对象不可被修改。
第6行代码使用Protect方法保护工作表。应用于Worksheet对象的Protect方法保护工作表使其不至被修改,语法如下:
expression.Protect(Password,DrawingObjects,Contents,Scenarios,UserInterfaceOnly,AllowFormattingCells,AllowFormattingColumns,AllowFormattingRows,AllowInsertingColumns,AllowInsertingRows,AllowInsertingHyperlinks,AllowDeletingColumns,AllowDeletingRows,AllowSorting,AllowFiltering,AllowUsingPivotTables)
其中参数expression是必需的,该表达式返回一个Worksheet对象。
参数Password是可选的,为一个字符串,该字符串为工作表指定区分大小写的密码。其他参数都是可选参数,其功能等同于工作表保护对话框中的各项选项。 ▲020 工作表事件Target参数的使用方法
在工作表的SelectionChange事件中,参数Target代表新选定的区域,在工作表的Change事件中参数Target代表更改的区域。在实际应用中可以使用Target参数将触发工作表事件的区域限制在一定的范围内,有以下几种方法: 020-1 使用Address 属性
使用Address属性可以将触发条件限制在某一个单元格中,如下面的代码所示。
Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)
If Target.Address(0,0) = A1 Then
MsgBox 你选择了A1单元格
EndIf
End Sub 代码解析:
当选择工作表A1单元格时显示一个消息框。
第2行代码使用Address属性返回所选单元格的区域引用,当返回的区域引用是“A1”时触发SelectionChange事件,显示一个消息框。此方法只适用于单个单元格或者加上OR运算符可以适用于几个单元格,多则不方便。 020-2 使用Column属性和Row属性
使用单元格的Column属性和Row属性可以将触发条件限制在某一区域内,如下面的代码所示。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column= 1 And Target.Row 11 Then
Target.Offset(,1) = Val(Target) * 3
EndIf
End Sub 代码解析:
当改变工作表的A1到A10单元格时,如果输入的是数值则将在对应的B列单元格写入乘以3的数值。
第2行代码使用Column属性将触发条件限制在第1列,使用Row属性将触发条件限制在第10行以内,也就是A1到A10的区域范围内。 20-3 使用Intersect方法
使用Intersect方法可以很方便的指定一个或多个区域范围,如下面的代码所示。
Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)
If NotApplication.Intersect(Target,Union(Range(A1:A10),Range(C1:C10))) Is Nothing Then
MsgBox 你选择了 Target.Address(0,0) 单元格
EndIf
End Sub 代码解析:
当选择工作表A1到A10,C1到C10单元格时将所选的单元格地址显示在消息框中。
第2行代码使用Intersect方法判断所选单元格是否与A1到A10,C1到C10单元格重叠,如果重叠说明所选单元格在A1到A10,C1到C10单元格区域内。Intersect方法返回一个Range对象,此对象代表两个或多个范围重叠的矩形区域,语法如下:
expression.Intersect(Arg1,Arg2,...)
参数expression是可选的,返回一个Application对象。
参数Arg1,Arg2,...是必需的,重叠的区域。必须指定至少两个 Range对象。 第2部分Worksheet(工作表)对象 ▲021 引用工作表的方式
VBA中,在不同的工作表之间转换或者对不同工作表中的单元格区域进行操作时,需要指定引用的工作表,通常有下面几种方法: 021-1 使用工作表的名称
工作表名称是指显示在工作表标签中的文本,工作表名称可以使用WorkSheets集合和Sheets集合两种引用方式,如下面的代码所示。
Sub ShActivate()
Worksheets(索引号).Activate
'Sheets(索引号).Activate
End Sub第3、4行代码都激活工作簿中名称为“索引号”的工作表,激活后“索引号”工作表将成为活动工作表。
WorkSheets集合包含所有的工作表,而Sheets集合不仅包含工作表集合WorkSheets,还包含图表集合Charts、宏表集合Excel4MacroSheets与MS Excel 5.0对话框集合DialogSheets等。
任何时刻工作簿中只有一个工作表是活动工作表。 021-2 使用工作表的索引号
工作表索引号是指工作表在工作簿中的位置,Excel根据工作表在工作表标签中的位置以1开始从左向右进行编号。下面的代码选中并激活当前工作簿中第1个工作表:
Sub ShIndex()
Worksheets(1).Select
End Sub单个WorkSheet对象的Select方法与Activate方法的主要区别在于Select方法要求工作表可视。
注意当工作簿包括工作表、宏表、图表等时,使用索引号引用工作表如Sheets(1)与WorkSheets(1)引用的可能不是同一个表。 021-3 使用工作表的代码名称
使用Worksheet对象的CodeName属性可以返回工作表的代码名称,如下面的代码所示。
Sub ShCodeName()
MsgBoxSheets(1).CodeName
End Sub工作表的代码名称显示在VBE工程资源管理器窗口中,在属性窗口中能够修改工作表代码名称。在VBA中能够直接使用工作表的代码名称引用工作表,即使工作表的名称被修改,代码仍然能够正常运行。 021-4 使用ActiveSheet属性引用活动工作表
使用ActiveSheet属性可以返回活动工作表,如下面的代码所示。
Sub ShActive()
MsgBoxActiveSheet.Name
End Sub
ActiveSheet属性应用于AppActivate对象、Window对象和Workbook对象时,如果未给出对象识别符,返回活动工作簿中的活动工作表。