玖叶教程网

前端编程开发入门

VBA|使用工作表对象Worksheet操作和管理工作表

Worksheet对象表示Excel工作表,可通过Workbooks集合对象和Worksheet对象的属性、方法和事件对工作表进行操作和管理。

1 使用工作表集合对象Worksheets管理工作表

1.1 用Add方法新增工作表

Sub 新增工作表()

Dim str1 As String

On Error Resume Next

str1 = Application.InputBox(prompt:="请输入已有工作表名称," & vbNewLine & _

"新增的工作表将位于该工作表前面。", _

Title:="输入原工作表名称", Type:=2)

Worksheets.Add Before:=Worksheets(str1)

End Sub

1.2 用Delete方法删除工作表

Sub 删除工作表()

Dim str1 As String

On Error GoTo err1

str1 = Application.InputBox(prompt:="请输入要删除的工作表名称:", _

Title:="输入工作表名称", Type:=2)

If str1 = "False" Then Exit Sub

Application.DisplayAlerts = False '不显示警告信息

Worksheets(str1).Delete

Application.DisplayAlerts = True

Exit Sub

err1: '错误处理

MsgBox "不能删除工作表“" & str1 & "”!"

Application.DisplayAlerts = True

End Sub

1.3 用Count属性得到工作表数量

Sub 工作表数量()

Dim i As Long

i = Worksheets.Count

MsgBox "当前工作簿的工作表数为:" & i

End Sub

1.4 用Select方法选择工作表

Worksheets(1).Select

2 使用工作表对象Worksheet管理工作表

2.1 用copy方法复制工作表

Sub 复制工作表()

Dim ws1 As Worksheet

Set ws1 = ActiveSheet

MsgBox "复制当前工作到前面。"

ws1.Copy Before:=ws1

MsgBox "得制当前工作表到后面。"

ws1.Copy After:=ws1

End Sub

2.2 用Visible属性隐藏工作表

Sub 隐藏工作表()

Dim str1 As String, ws1 As Worksheet

str1 = Application.InputBox(prompt:="请输入需要隐藏的工作表:", _

Title:="隐藏工作表", Default:="Sheet1", Type:=2)

On Error GoTo err1

Set ws1 = Worksheets(str1)

ws1.Visible = xlSheetHidden

Exit Sub

err1:

MsgBox "输入的工作表不存在!"

End Sub

2.3 用Move方法移动工作表

ActiveSheet.Move Before:=Sheets(1)

2.4 用Activate方法激活工作表

Sub 逐个激活工作表()

Dim sh As Worksheet

For Each sh In Worksheets

sh.Activate

MsgBox "激活工作表名称为:" & sh.Name & vbNewLine & _

"单击【确定】按钮将激活下一工作表!"

Next

End Sub

2.5 用Previous、Next属性选取前后工作表

Sub 选择前工作表()

If ActiveSheet.Index <> 1 Then

ActiveSheet.Previous.Activate

Else

MsgBox "已到第一个工作表"

End If

End Sub

Sub 选择后工作表()

If ActiveSheet.Index <> Worksheets.Count Then

ActiveSheet.Next.Activate

Else

MsgBox "已到最后一个工作表"

End If

End Sub

2.6 用ProtectContents属性获取工作表保护状态

Sub 工作表保护状态()

If ActiveSheet.ProtectContents Then

MsgBox "当前工作表已保护!"

Else

MsgBox "当前工作表未保护!"

End If

End Sub

2.7 用Protect方法保护工作表

Sub 保护工作表()

On Error Resume Next

Dim ws1 As Worksheet

Dim str1 As String

str1 = Application.InputBox(prompt:="请输入保护工作表的密码:", _

Title:="输入密码", Type:=2)

For Each ws1 In Worksheets

ws1.Protect Password:=str1

Next

MsgBox "所有工作表保护完成!"

End Sub

2.8 用Unprotected方法撤销工作表的保护

Sub 撤消工作表保护()

On Error GoTo err1

Dim ws1 As Worksheet

Dim str1 As String

str1 = Application.InputBox(prompt:="请输入撤消保护工作表的密码:", _

Title:="输入密码", Type:=2)

For Each ws1 In Worksheets

ws1.Unprotect Password:=str1

Next

MsgBox "所有工作表的保护已被撤消!"

Exit Sub

err1:

MsgBox "输入的密码错误,不能取撤消对工作表的保护!"

End Sub

2.9 用HpageBreaks、VPageBreaks属性计算打印页数

Sub 计算页数()

Dim r As Long, c As Long, p As Long

Dim ws1 As Worksheet

Set ws1 = ActiveSheet

c = ws1.HPageBreaks.Count + 1

r = ws1.VPageBreaks.Count + 1

p = r * c

MsgBox "当前工作表共有" & p & "页。"

End Sub

2.10 用Shapes属性控制工作表中的图片

Sub 删除图片()

Dim p As Shape

For Each p In ActiveSheet.Shapes

If p.Type = msoPicture Then p.Delete

Next

End Sub

2.11 用Hyperlinks集合处理超链接

Sub 添加超链接()

Dim i As Integer

With ActiveSheet

For i = 1 To Worksheets.Count - 1

.Cells(i + 2, 2).Value = Worksheets(i + 1).Name

.Hyperlinks.Add anchor:=Cells(i + 2, 2), _

Address:="", SubAddress:=Cells(i + 2, 2).Value & "!a1", _

TextToDisplay:=Cells(i + 2, 2).Value

Next

End With

End Sub

Sub 删除超链接()

Dim h As Hyperlink, hs As Hyperlinks

Set hs = ActiveSheet.Hyperlinks

For Each h In hs

h.Delete

Next

End Sub

2.12 自定义函数判断工作表是否存在

Function WorksheetExists(ByVal SheetName As String) As Boolean

Dim sName As String

On Error GoTo err1

sName = Worksheets(SheetName).Name

WorksheetExists = True

Exit Function

err1:

WorksheetExists = False

End Function

3 响应用户操作

3.1 用SelectionChange事件禁止选中某个区域

例如,以下代码将禁止用户选择B1:F3单元格区域:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim r As Long, c As Long

r = Target.Row

c = Target.Column

If r <= 3 And c >= 2 And c <= 6 Then [B4].Select

End Sub

3.2 用ScrollArea属性设置滚动区域

例如,如下代码限制用户只能选择A-E列中的单元格

Private Sub Worksheet_Activate()

ActiveSheet.ScrollArea = "A1:E1048576"

End Sub

3.3 用countif函数禁止输入相同数据

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

If Target.Column = 2 Then

If Target.Value <> "" And WorksheetFunction.CountIf(Columns(2), Target.Value) > 1 Then

MsgBox "请不要输入相同的数据!"

Application.Undo

End If

End If

Application.EnableEvents = True

End Sub

3.4 用SelectionChange事件输入连续的数据

例如,以下代码就可以限制用户的选择只能是A列中有内容的单元格或其后一个单元格

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

i = ActiveSheet.Range("A65536").End(xlUp).Row

j = Target.Column

If Target.Row > i Then

Cells(i + 1, j).Select

End If

End Sub

3.5 用BeforeRightClick事件增加快捷菜单

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

For Each mnu1 In Application.CommandBars("cell").Controls

If mnu1.Tag = "MyMenu" Then mnu1.Delete

Next

If Not Application.Intersect(Target, Range("A1:C10")) Is Nothing Then

With Application.CommandBars("cell").Controls.Add _

(Type:=msoControlButton, before:=6, temporary:=True)

.Caption = "测试命令"

.OnAction = "显示测试信息"

.Tag = "MyMenu"

End With

End If

End Sub

在模块中保存以下过程

Sub 显示测试信息()

MsgBox "你选择了用户添加的快捷菜单!" & _

vbCrLf & "本例为测试代码,未编写具体的功能。"

End Sub

3.6 用Deactivate事件限制选择其他工作表

Private Sub Worksheet_Deactivate()

ActiveSheet.Activate

MsgBox "您无权操作其他工作表,只能在“Sheet1”工作表中进行操作!", _

vbCritical + vbOKOnly, "警告"

End Sub

3.7 用Activate事件隐藏工作表

Private Sub Worksheet_Activate()

Dim ws As Worksheet

For Each ws In Worksheets '循环隐藏每个工作表

If ws.Name <> "主界面" Then ws.Visible = False

Next

End Sub

Sub 显示工作表()

Dim ws As Worksheet

For Each ws In Worksheets

ws.Visible = xlSheetVisible

Next

End Sub

3.8 用Interior属性突出显示当前位置

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim i As Integer

On Error Resume Next

i = Target.Interior.ColorIndex

If i < 0 Then

i = 36

Else

i = i + 1

End If

If iColor = Target.Font.ColorIndex Then '避免字体颜色与突出色相同

i = i + 1

End If

Cells.Interior.ColorIndex = xlColorIndexNone

Rows(Target.Row).Interior.ColorIndex = i

Columns(Target.Column).Interior.ColorIndex = i

End Sub

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言