使用Redim动态数组即可。
|
声明数组
请参阅 特性
数组的声明方式和其它的变量是一样的,它可以使用 Dim、Static、Private 或 Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。
数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为 1,则数组索引从零开始。
声明固定大小的数组
下面这行代码声明了一个固定大小的数组,它是个 11 行乘以 11 列的 Integer 数组:
Dim MyArray(10, 10) As Integer
第一个参数代表的是行;而第二个参数代表的是列。
与其它变量的声明一样,除非指定一个数据类型给数组,否则声明数组中元素的数据类型为 Variant。数组中每个数组的数字型 Variant 元素占用 16 个字节。每个字符串型 Variant 元素占用 22 个字节。为了尽可能使写的代码简洁明了,则要明确声明的数组为某一种数据类型而非 Variant。下面的这几行代码比较了几个不同数组的大小:
'
22
11
* 2
ReDim MyIntegerArray(10) As Integer
'
88
11
* 8
ReDim MyDoubleArray(10) As Double
'
176
11
* 16
ReDim MyVariantArray(10)
'
100 * 100 * 2
20,000
ReDim MyIntegerArray (99, 99) As Integer
'
100 * 100 * 8
80,000
ReDim MyDoubleArray (99, 99) As Double
'
160,000
100 * 100 * 16
ReDim MyVariantArray(99, 99)
数组变量的最大值,是以的操作系统与有多少可用内存为基础。若使用的数组大小超过了系统中可用内存总数的话,则速度会变慢,因为必须从磁盘中读写回数据。
声明动态数组
若声明为动态数组,则可以在执行代码时去改变数组大小。可以利用 Static、Dim、Private 或 Public 语句来声明数组,并使括号内为为空,如下示例所示。
Dim sngArray() As Single
注意 可以在过程中使用 ReDim 语句来做隐含性的数组声明。当使用 ReDim 语句时要小心点,不要拼错数组的名称。否则即使在模块中有包含 Option Explicit 语句,仍然会因此而生成第二个数组。
对于过程中的数组范围,可以使用 ReDim 语句去改变它的维数,去定义元素的数目以及每个维数的底层绑定。每当需要时,可以使用 ReDim 语句去更改动态数组。然而当做这个动作时,数组中存在的值会丢失。若要保存数组中原先的值,则可以使用 ReDim Preserve 语句来扩充数组。例如,下列的语句将 varArray
数组扩充了10 个元素,而原本数组中的当前值并没有消失掉。
ReDim Preserve varArray(UBound(varArray) + 10)
注意 当对动态数组使用 Preserve 关键字时,只可以改变最后维数的上层绑定,而不能改变维数的数目。
新建工作簿:
1 Sub AddNew()
2 Set NewBook = Workbooks.Add
3 With NewBook
4 .Title = "All Sales"
5 .Subject = "Sales"
6 .SaveAs Filename:="Allsales.xls"
7 End With
8 End Sub
|
操作方法:引用多张工作表 |
可用 Array 函数标识一组工作表。以下示例选定了活动工作簿中的三张工作表。
1 Sub Several()
2 Worksheets(Array("Sheet1", "Sheet2", "Sheet4")).Select
3 End Sub
操作方法:通过索引号引用工作表 |
索引号是分配给工作表的连续数字,基于其工作表标签在同一类型的工作表之间的位置(按从左到右计数)。下面的过程使用 Worksheets 属性激活活动工作簿上的第一张工作表。
|
如果要处理所有类型的工作表(工作表、图表、模块和对话框编辑表),可使用 Sheets 属性。以下过程激活工作簿中的第四张工作表。
|
如果移动、添加或删除工作表,索引顺序可能会发生变化。 |
|
操作方法:通过名称引用工作表 |
使用 Worksheets 属性和 Charts 属性可通过名称来标识工作表。下述语句激活活动工作簿中的不同工作表。
|
|
使用 Sheets 属性可以返回工作表、图表、模块或对话框编辑表;Sheets 集合包含所有这些内容。本示例将激活活动工作簿中的名为“Chart1”的工作表。
|
嵌入到工作表中的图表是 ChartObjects 集合的成员,而那些位于单独的工作表上的图表则属于 Charts 集合。 |
|
打开工作簿 |
用 Open 方法打开一个工作簿时,该工作簿将成为 Workbooks
|
|
操作方法:引用工作表上的所有单元格 |
如果对工作表应用 Cells 属性时不指定索引号,该方法将返回代表工作表上所有单元格的 Range 对象。以下 Sub 过程清除活动工作簿中 Sheet1 上的所有单元格的内容。
|
操作方法:使用 A1 表示法引用单元格和区域 |
可使用 Range 属性引用 A1 引用样式中的单元格或单元格区域。下述子例程将单元格区域 A1:D5 的字体设置为加粗。
|
下表演示了使用 Range 属性的一些 A1 样式引用。
引用 | 含义 |
| 单元格 A1 |
| 从单元格 A1 到单元格 B5 的区域 |
| 多块选定区域 |
| A 列 |
| 第一行 |
| 从 A 列到 C 列的区域 |
| 从第一行到第五行的区域 |
| 第 1、3 和 8 行 |
| A 、C 和 F 列 |
|
操作方法:使用 Range 对象引用单元格 |
如果将对象变量设置为 Range 对象,即可用变量名轻松地操作单元格区域。
以下过程将创建对象变量 myRange
,然后将活动工作簿中 Sheet1 上的区域 A1:D5 赋予该变量。随后的语句用该变量名称代替 Range 对象,以修改该区域的属性。
|
操作方法:使用索引号引用单元格 |
通过使用行列索引号,可用 Cells 属性引用单个单元格。该属性返回代表单个单元格的 Range 对象。在下例中,Cells(6,1)
返回 Sheet1 上的单元格 A6,然后将 Value 属性设置为 10。
|
因为可用变量替代编号,所以 Cells 属性非常适合于在单元格区域中循环,如下例中所示。
|
如果要同时更改某个区域中所有单元格的属性(或将方法应用于该区域中的所有单元格),请使用 Range 属性。有关详细信息,请参阅使用 A1 表示法引用单元格和区域。 |
操作方法:使用快捷表示法引用单元格 |
可用方括号将 A1 引用样式或命名区域括起来,作为 Range 属性的快捷方式。这样就不必键入单词“Range”或使用引号了,如下例中所示。
|
Excel VBA教程:相对于其他单元格来引用单元格
处理相对于另一个单元格的某一单元格的常用方法是使用Offset属性。下例中,将位于活动工作表上活动单元格下一行和右边三列的单元格的内容设置为双下划线格式。
Sub Underline()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
注意 可录制使用 Offset属性(而不是绝对引用)的宏。在“工具”菜单上,指向“宏”,再单击“录制新宏”,然后单击“确定”,再单击录制宏工具栏上的“相对引用”按钮。
若要在单元格区域中循环,请在循环中将变量与 Cells属性一起使用。下例以 5 为步长,用 5 到 100 之间的值填充第三列的前 20 个单元格。变量counter
用作 Cells属性的行号。
Sub CycleThrough()
Dim counter As Integer
For counter = 1 To 20
Worksheets("Sheet1").Cells(counter, 3).Value = counter * 5
Next counter
End Sub
如下图:
代码如下:
1 Sub Random()
2 Dim myRange As Range
3 Set myRange = Worksheets("Sheet1").Range("A1:D5")
4 myRange.Formula = "=RAND()"
5 myRange.Font.Bold = True
6 Cells(4, 4).Select
7 ActiveCell.Offset(-1, -3).Font.Underline = xlDouble
8 End Sub
|
操作方法:引用多个区域 |
使用适当的方法可以很容易地同时引用多个单元格区域。可用 Range 和 Union 方法引用任意组合的单元格区域;用 Areas 属性可引用工作表上选定的一组单元格区域。
使用 Range 属性
通过在两个或多个引用之间插入逗号,可使用 Range 属性引用多个区域。以下示例清除了 Sheet1 上三个区域的内容。
|
命名区域使得用 Range 属性处理多个区域更加容易。以下示例可在所有这三个命名区域处于同一工作表时运行。
|
使用 Union 方法
使用 Union 方法可将多个区域组合到一个 Range 对象中。以下示例创建了名为 myMultipleRange
的 Range 对象,并将其定义为区域 A1:B2 和 C3:D4 的组合,然后将该组合区域的字体设置为加粗。
|
使用 Areas 属性
可用 Areas 属性引用选定的单元格区域或多块选定区域中的区域集合。下述过程计算选定区域中的块数目,如果有多个块,就显示一则警告消息。
|
1 工作表(Worksheet)基本操作应用示例
2 作者:fanjy | 来源:ExcelHomeBlog | 时间:2006-12-21 | 阅读权限:游客 | 会员币:0 | 【大 中 小】
3 在编写代码时,经常要引用工作表的名字、知道工作表在工作簿中的位置、增加工作表、删除工作表、复制工作表、移动工作表、重命名工作表,等等。下面介绍与此有关及相关的一些属性和方法示例。
4 [示例04-01]增加工作表(Add方法)
5 Sub AddWorksheet()
6 MsgBox "在当前工作簿中添加一个工作表"
7 Worksheets.Add
8 MsgBox "在当前工作簿中的工作表sheet2之前添加一个工作表"
9 Worksheets.Add before:=Worksheets("sheet2")
10 MsgBox "在当前工作簿中的工作表sheet2之后添加一个工作表"
11 Worksheets.Add after:=Worksheets("sheet2")
12 MsgBox "在当前工作簿中添加3个工作表"
13 Worksheets.Add Count:=3
14 End Sub
15 示例说明:Add方法带有4个可选的参数,其中参数Before和参数After指定所增加的工作表的位置,但两个参数只能选一;参数Count用来指定增加的工作表数目。
16 [示例04-02]复制工作表(Copy方法)
17 Sub CopyWorksheet()
18 MsgBox "在当前工作簿中复制工作表sheet1并将所复制的工作表放在工作表sheet2之前"
19 Worksheets("sheet1").Copy Before:=Worksheets("sheet2")
20 MsgBox "在当前工作簿中复制工作表sheet2并将所复制的工作表放在工作表sheet3之后"
21 Worksheets("sheet2").Copy After:=Worksheets("sheet3")
22 End Sub
23 示例说明:Copy方法带有2个可选的参数,即参数Before和参数After,在使用时两个参数只参选一。
24 [示例04-03]移动工作表(Move方法)
25 Sub MoveWorksheet()
26 MsgBox "在当前工作簿中将工作表sheet3移至工作表sheet2之前"
27 Worksheets("sheet3").Move Before:=Worksheets("sheet2")
28 MsgBox "在当前工作簿中将工作表sheet1移至最后"
29 Worksheets("sheet1").Move After:=Worksheets(Worksheets.Count)
30 End Sub
31 示例说明:Move方法与Copy方法的参数相同,作用也一样。
32 [示例04-04]隐藏和显示工作表(Visible属性)
33 [示例04-04-01]
34 Sub testHide()
35 MsgBox "第一次隐藏工作表sheet1"
36 Worksheets("sheet1").Visible = False
37 MsgBox "显示工作表sheet1"
38 Worksheets("sheet1").Visible = True
39 MsgBox "第二次隐藏工作表sheet1"
40 Worksheets("sheet1").Visible = xlSheetHidden
41 MsgBox "显示工作表sheet1"
42 Worksheets("sheet1").Visible = True
43 MsgBox "第三次隐藏工作表sheet1"
44 Worksheets("sheet1").Visible = xlSheetHidden
45 MsgBox "显示工作表sheet1"
46 Worksheets("sheet1").Visible = xlSheetVisible
47 MsgBox "第四隐藏工作表sheet1"
48 Worksheets("sheet1").Visible = xlSheetVeryHidden
49 MsgBox "显示工作表sheet1"
50 Worksheets("sheet1").Visible = True
51 MsgBox "第五隐藏工作表sheet1"
52 Worksheets("sheet1").Visible = xlSheetVeryHidden
53 MsgBox "显示工作表sheet1"
54 Worksheets("sheet1").Visible = xlSheetVisible
55 End Sub
56 示例说明:本示例演示了隐藏和显示工作表的各种情形。其中,使用xlSheetVeryHidden常量来隐藏工作表,将不能通过选择工作表菜单栏中的“格式”——“工作表”——“取消隐藏”命令来取消隐藏。
57 [示例04-04-02]
58 Sub ShowAllSheets()
59 MsgBox "使当前工作簿中的所有工作表都显示(即将隐藏的工作表也显示)"
60 Dim ws As Worksheet
61 For Each ws In Sheets
62 ws.Visible = True
63 Next ws
64 End Sub
65 [示例04-05]获取工作表数(Count属性)
66 [示例04-05-01]
67 Sub WorksheetNum()
68 Dim i As Long
69 i = Worksheets.Count
70 MsgBox "当前工作簿的工作表数为:" & Chr(10) & i
71 End Sub
72 [示例04-05-02]
73 Sub WorksheetNum()
74 Dim i As Long
75 i = Sheets.Count
76 MsgBox "当前工作簿的工作表数为:" & Chr(10) & i
77 End Sub
78 示例说明:在一个包含图表工作表的工作簿中运行上述两段代码,将会得出不同的结果,原因是对于Sheets集合来讲,工作表包含图表工作表。应注意Worksheets集合与Sheets集合的区别,下同。
79 [示例04-06]获取或设置工作表名称(Name属性)
80 [示例04-06-01]
81 Sub NameWorksheet()
82 Dim sName As String, sChangeName As String
83 sName = Worksheets(2).Name
84 MsgBox "当前工作簿中第2个工作表的名字为:" & sName
85 sChangeName = "我的工作表"
86 MsgBox "将当前工作簿中的第3个工作表名改为:" & sChangeName
87 Worksheets(3).Name = sChangeName
88 End Sub
89 示例说明:使用Name属性可以获取指定工作表的名称,也可以设置工作表的名称。
90 [示例04-06-02]重命名工作表
91 Sub ReNameSheet()
92 Dim xStr As String
93 Retry:
94 Err.Clear
95 xStr = InputBox("请输入工作表的新名称:" _
96 , "重命名工作表", ActiveSheet.Name)
97 If xStr = "" Then Exit Sub
98 On Error Resume Next
99 ActiveSheet.Name = xStr
100 If Err.Number <> 0 Then
101 MsgBox Err.Number & " " & Err.Description
102 Err.Clear
103 GoTo Retry
104 End If
105 On Error GoTo 0
106 '.........
107 End Sub
108 [NextPage][示例04-07]激活/选择工作表(Activate方法和Select方法)
109 [示例04-07-01]
110 Sub SelectWorksheet()
111 MsgBox "激活当前工作簿中的工作表sheet2"
112 Worksheets("sheet2").Activate
113 MsgBox "激活当前工作簿中的工作表sheet3"
114 Worksheets("sheet3").Select
115 MsgBox "同时选择工作簿中的工作表sheet2和sheet3"
116 Worksheets(Array("sheet2", "sheet3")).Select
117 End Sub
118 示例说明:Activate方法只能激活一个工作表,而Select方法可以同时选择多个工作表。
119 [示例04-07-02]
120 Sub SelectManySheet()
121 MsgBox "选取第一个和第三个工作表."
122 Worksheets(1).Select
123 Worksheets(3).Select False
124 End Sub
125 [示例04-08]获取当前工作表的索引号(Index属性)
126 Sub GetSheetIndex()
127 Dim i As Long
128 i = ActiveSheet.Index
129 MsgBox "您正使用的工作表索引号为" & i
130 End Sub
131 [示例04-09]选取前一个工作表(Previous属性)
132 Sub PreviousSheet()
133 If ActiveSheet.Index <> 1 Then
134 MsgBox "选取当前工作簿中当前工作表的前一个工作表"
135 ActiveSheet.Previous.Activate
136 Else
137 MsgBox "已到第一个工作表"
138 End If
139 End Sub
140 示例说明:如果当前工作表是第一个工作表,则使用Previous属性会出错。
141 [示例04-10]选取下一个工作表(Next属性)
142 Sub NextSheet()
143 If ActiveSheet.Index <> Worksheets.Count Then
144 MsgBox "选取当前工作簿中当前工作表的下一个工作表"
145 ActiveSheet.Next.Activate
146 Else
147 MsgBox “已到最后一个工作表”
148 End If
149 End Sub
150 示例说明:如果当前工作表是最后一个工作表,则使用Next属性会出错。
151 [示例04-11]工作表行和列的操作
152 [示例04-11-01]隐藏行
153 Sub HideRow()
154 Dim iRow As Long
155 MsgBox "隐藏当前单元格所在的行"
156 iRow = ActiveCell.Row
157 ActiveSheet.Rows(iRow).Hidden = True
158 MsgBox "取消隐藏"
159 ActiveSheet.Rows(iRow).Hidden = False
160 End Sub
161 [示例04-11-02]隐藏列
162 Sub HideColumn()
163 Dim iColumn As Long
164 MsgBox "隐藏当前单元格所在列"
165 iColumn = ActiveCell.Column
166 ActiveSheet.Columns(iColumn).Hidden = True
167 MsgBox "取消隐藏"
168 ActiveSheet.Columns(iColumn).Hidden = False
169 End Sub
170 [示例04-11-03]插入行
171 Sub InsertRow()
172 Dim rRow As Long
173 MsgBox "在当前单元格上方插入一行"
174 rRow = Selection.Row
175 ActiveSheet.Rows(rRow).Insert
176 End Sub
177 [示例04-11-04]插入列
178 Sub InsertColumn()
179 Dim cColumn As Long
180 MsgBox "在当前单元格所在行的左边插入一行"
181 cColumn = Selection.Column
182 ActiveSheet.Columns(cColumn).Insert
183 End Sub
184 [示例04-11-05]插入多行
185 Sub InsertManyRow()
186 MsgBox "在当前单元格所在行上方插入三行"
187 Dim rRow As Long, i As Long
188 For i = 1 To 3
189 rRow = Selection.Row
190 ActiveSheet.Rows(rRow).Insert
191 Next i
192 End Sub
193 [示例04-11-06]设置行高
194 Sub SetRowHeight()
195 MsgBox "将当前单元格所在的行高设置为25"
196 Dim rRow As Long, iRow As Long
197 rRow = ActiveCell.Row
198 iRow = ActiveSheet.Rows(rRow).RowHeight
199 ActiveSheet.Rows(rRow).RowHeight = 25
200 MsgBox "恢复到原来的行高"
201 ActiveSheet.Rows(rRow).RowHeight = iRow
202 End Sub
203 [示例04-11-07]设置列宽
204 Sub SetColumnWidth()
205 MsgBox "将当前单元格所在列的列宽设置为20"
206 Dim cColumn As Long, iColumn As Long
207 cColumn = ActiveCell.Column
208 iColumn = ActiveSheet.Columns(cColumn).ColumnWidth
209 ActiveSheet.Columns(cColumn).ColumnWidth = 20
210 MsgBox "恢复至原来的列宽"
211 ActiveSheet.Columns(cColumn).ColumnWidth = iColumn
212 End Sub
213 [示例04-11-08]恢复行高列宽至标准值
214 Sub ReSetRowHeightAndColumnWidth()
215 MsgBox "将当前单元格所在的行高和列宽恢复为标准值"
216 Selection.UseStandardHeight = True
217 Selection.UseStandardWidth = True
218 End Sub
219 [示例04-12]工作表标签
220 [示例04-12-01] 设置工作表标签的颜色
221 Sub SetSheetTabColor()
222 MsgBox "设置当前工作表标签的颜色"
223 ActiveSheet.Tab.ColorIndex = 7
224 End Sub
225 [示例04-12-01]恢复工作表标签颜色
226 Sub SetSheetTabColorDefault()
227 MsgBox "将当前工作表标签颜色设置为默认值"
228 ActiveSheet.Tab.ColorIndex = -4142
229 End Sub
230 [示例04-12-03]交替隐藏或显示工作表标签
231 Sub HideOrShowSheetTab()
232 MsgBox "隐藏/显示工作表标签"
233 ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs
234 End Sub
235 [NextPage][示例04-13]确定打印的页数(HPageBreaks属性与VPageBreaks属性)
236 Sub PageCount()
237 Dim i As Long
238 i = (ActiveSheet.HPageBreaks.Count + 1) * (ActiveSheet.VPageBreaks.Count + 1)
239 MsgBox "当前工作表共" & i & "页."
240 End Sub
241 [示例04-14]保护/撤销保护工作表
242 [示例04-14-01]
243 Sub ProtectSheet()
244 MsgBox "保护当前工作表并设定密码"
245 ActiveSheet.Protect Password:="fanjy"
246 End Sub
247 示例说明:运行代码后,当前工作表中将不允许编辑,除非撤销工作表保护。
248 [示例04-14-02]
249 Sub UnprotectSheet()
250 MsgBox "撤销当前工作表保护"
251 ActiveSheet.Unprotect
252 End Sub
253 示例说明:运行代码后,如果原保护的工作表设置有密码,则要求输入密码。
254 [示例04-14-03]保护当前工作簿中的所有工作表
255 Sub ProtectAllWorkSheets()
256 On Error Resume Next
257 Dim ws As Worksheet
258 Dim myPassword As String
259 myPassword = InputBox("请输入您的密码" & vbCrLf & _
260 "(不输入表明无密码)" & vbCrLf & vbCrLf & _
261 "确保您没有忘记密码!", "输入密码")
262 For Each ws In ThisWorkbook.Worksheets
263 ws.Protect (myPassword)
264 Next ws
265 End Sub
266 [示例04-14-04]撤销对当前工作簿中所有工作表的保护
267 Sub UnprotectAllWorkSheets()
268 On Error Resume Next
269 Dim ws As Worksheet
270 Dim myPassword As String
271 myPassword = InputBox("请输入您的密码" & vbCrLf & _
272 "(不输入表示无密码)", "输入密码")
273 For Each ws In ThisWorkbook.Worksheets
274 ws.Unprotect (myPassword)
275 Next ws
276 End Sub
277 [示例04-14-05]仅能编辑未锁定的单元格
278 Sub OnlyEditUnlockedCells()
279 Sheets("Sheet1").EnableSelection = xlUnlockedCells
280 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
281 End Sub
282 示例说明:运行本代码后,在当前工作表中将只能对未锁定的单元格进行编辑,而其它单元格将不能编辑。未锁定的单元格是指在选择菜单“格式——单元格”命令后所弹出的对话框中的“保护”选项卡中,未选中“锁定”复选框的单元格或单元格区域。
283 [示例04-15]删除工作表(Delete方法)
284 Sub DeleteWorksheet()
285 MsgBox "删除当前工作簿中的工作表sheet2"
286 Application.DisplayAlerts = False
287 Worksheets("sheet2").Delete
288 Application.DisplayAlerts = True
289 End Sub
290 示例说明:本示例代码使用Application.DisplayAlerts = False来屏蔽弹出的警告框。
291 <一些编程方法和技巧>
292 [示例04-16] 判断一个工作表(名)是否存在
293 [示例04-16-01]
294 Sub testWorksheetExists1()
295 Dim ws As Worksheet
296 If Not WorksheetExists(ThisWorkbook, "sheet1") Then
297 MsgBox "不能够找到该工作表", vbOKOnly
298 Exit Sub
299 End If
300 MsgBox "已经找到工作表"
301 Set ws = ThisWorkbook.Worksheets("sheet1")
302 End Sub
303 '- - - - - - - - - - - - - - - - - - -
304 Function WorksheetExists(wb As Workbook, sName As String) As Boolean
305 Dim s As String
306 On Error GoTo ErrHandle
307 s = wb.Worksheets(sName).Name
308 WorksheetExists = True
309 Exit Function
310 ErrHandle:
311 WorksheetExists = False
312 End Function
313 示例说明:在测试代码中,用相应的工作簿名和工作表名分别代替“ThisWorkbook”和“Sheet1”,来判断指定工作表是否在工作簿中存在。
314 [示例04-16-02]
315 Sub testWorksheetExists2()
316 If Not SheetExists("<工作表名>") Then
317 MsgBox "<工作表名> 不存在!"
318 Else
319 Sheets("<工作表名>").Activate
320 End If
321 End Sub
322 '- - - - - - - - - - - - - - - - - - -
323 Function SheetExists(SheetName As String) As Boolean
324 SheetExists = False
325 On Error GoTo NoSuchSheet
326 If Len(Sheets(SheetName).Name) > 0 Then
327 SheetExists = True
328 Exit Function
329 End If
330 NoSuchSheet:
331 End Function
332 示例说明:在代码中,用实际工作表名代替<>。
333 [示例04-16-03]
334 Sub TestingFunction()
335 '如果工作表存在则返回True,否则为False
336 '测试DoesWksExist1函数
337 Debug.Print DoesWksExist1("Sheet1")
338 Debug.Print DoesWksExist1("Sheet100")
339 Debug.Print "-----"
340 '测试DoesWksExist2函数
341 Debug.Print DoesWksExist2("Sheet1")
342 Debug.Print DoesWksExist2("Sheet100")
343 End Sub
344 ‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
345 Function DoesWksExist1(sWksName As String) As Boolean
346 Dim i As Long
347 For i = Worksheets.Count To 1 Step -1
348 If Sheets(i).Name = sWksName Then
349 Exit For
350 End If
351 Next
352 If i = 0 Then
353 DoesWksExist1 = False
354 Else
355 DoesWksExist1 = True
356 End If
357 End Function
358 ‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
359 Function DoesWksExist2(sWksName As String) As Boolean
360 Dim wkb As Worksheet
361 On Error Resume Next
362 Set wkb = Sheets(sWksName)
363 On Error GoTo 0
364 DoesWksExist2 = IIf(Not wkb Is Nothing, True, False)
365 End Function
366 [示例04-17]排序工作表
367 [示例04-17-01]
368 Sub SortWorksheets1()
369 Dim bSorted As Boolean
370 Dim nSortedSheets As Long
371 Dim nSheets As Long
372 Dim n As Long
373 nSheets = Worksheets.Count
374 nSortedSheets = 0
375 Do While (nSortedSheets < nSheets) And Not bSorted
376 bSorted = True
377 nSortedSheets = nSortedSheets + 1
378 For n = 1 To nSheets - nSortedSheets
379 If StrComp(Worksheets(n).Name, Worksheets(n + 1).Name, vbTextCompare) > 0 Then
380 Worksheets(n + 1).Move Before:=Worksheets(n)
381 bSorted = False
382 End If
383 Next n
384 Loop
385 End Sub
386 示例说明:本示例代码采用了冒泡法排序。
387 [示例04-17-02]
388 Sub SortWorksheets2()
389 '根据字母对工作表排序
390 Dim i As Long, j As Long
391 For i = 1 To Sheets.Count
392 For j = 1 To Sheets.Count - 1
393 If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
394 Sheets(j).Move After:=Sheets(j + 1)
395 End If
396 Next j
397 Next i
398 End Sub
399 [示例04-17-03]
400 Sub SortWorksheets3()
401 '以升序排列工作表
402 Dim sCount As Integer, i As Integer, j As Integer
403 Application.ScreenUpdating = False
404 sCount = Worksheets.Count
405 If sCount = 1 Then Exit Sub
406 For i = 1 To sCount - 1
407 For j = i + 1 To sCount
408 If Worksheets(j).Name < Worksheets(i).Name Then
409 Worksheets(j).Move Before:=Worksheets(i)
410 End If
411 Next j
412 Next i
413 End Sub
414 示例说明:若想排序所有工作表,将代码中的Worksheets替换为Sheets。
415 [示例04-18]删除当前工作簿中的空工作表
416 Sub Delete_EmptySheets()
417 Dim sh As Worksheet
418 For Each sh In ThisWorkbook.Worksheets
419 If Application.WorksheetFunction.CountA(sh.Cells) = 0 Then
420 Application.DisplayAlerts = False
421 sh.Delete
422 Application.DisplayAlerts = True
423 End If
424 Next
425 End Sub