ExcelVBASelectCase结构
人生经常要面临“多选一”的情况,在编写程序代码时也是如此。在上篇文章中,我们讲解了使用If-Then结构来进行判断,也举了很多个小例子。我们看到,随着条件的增多,代码的结构也变得复杂或难以理解。幸运的是,VBA为我们提供了Select Case结构,让我们根据多个条件判断选择时,能够写出容易理解的代码。
上篇文章的结尾举了一个例子:按照一定的规则,根据员工的工龄来确定员工的年休假天数:
工龄(年)年休假天数10年及以下510~201020~251525年以上20现在,我们使用Select Case结构来编写代码,实现相同的功能。首先看看示例代码:
示例代码1
Sub NianXiuTianWithSelectCase()
‘声明变量,用来表示年休天数和工龄
Dim lngDays As Long
Dim lngYears As Long
lngYears = Range(“A1”).Value
‘根据工龄确定相应的年休天数
Select Case lngYears
Case 0 To 10
lngDays = 5
Case 10 To 20
lngDays = 10
Case 20 To 25
lngDays = 15
Case Is > 25
lngDays = 20
End Select
MsgBox “工龄:” &lngYears & vbCrLf & “年休天数:” &lngDays
End Sub
同样,您可以在工作表单元格A1中输入代表工龄的数字,运行代码后,会显示相应的年休天数,就像在上篇文章中所示的图一样。
与上篇文章中的代码相比,既简单又易理解。
Select Case结构的语法如下:
Select Case 条件(表达式)
[Case 表达式值1
[语句块] ]
[Case 表达式值2
[语句块] ]
……
[Case Else
[语句块] ]
End Select
说明:
- 当某个Case“表达式值”满足“条件(表达式)”的结果时,执行相应的语句块,并退出Select Case结构。如果没有满足“条件(表达式)”的结果时,就执行Case Else后的语句块。方括号表示可选。Case子句可以有多个,CaseElse子句可以有也可以没有。
Case后的表达式可以是数值范围,如示例代码1所示。下面再举一些简单的例子来说明Select Case结构的用法,这些例子本身没有多大的实用价值,只是方便您理解Select Case结构。
Case后的表达式也可以是逗号分隔的数值或字符串,如下面的示例代码所示:
示例代码2:逗号分隔数值
SubNumWithSelectCase()
Select Case Range(“A1”).Value
Case 1, 3, 5
MsgBox “单元格A1中的值是5以内的奇数.”
End Select
End Sub
如果单元格A1中是数值1或3或5,运行代码后就会弹出“单元格A1中的值是5以内的奇数.”的消息框。
示例代码3:逗号分隔字符
Sub CharWithSelectCase()
Select Case Range(“A1”).Value
Case “A”, “E”,”I”, “O”, “U”
MsgBox “单元格A1中是大写元音字母.”
Case Else
MsgBox “单元格A1中不是大写元音字母.”
End Select
End Sub
如果单元格A1中是字母“A”、“E”、“I”、“O”、“U”之一,运行代码后就会弹出“单元格A1中是大写元音字母”的消息框。
我们还可以嵌套使用Select Case结构,如下面的示例代码所示:
示例代码4:嵌套的Select Case结构
Sub qtWithSelectCase()
Select Case Range(“A1”).Value
Case “工作表”
Select Case Worksheets.Count
Case 1
MsgBox “工作簿中有1个工作表”
Case 2
MsgBox “工作簿中有2个工作表”
Case Else
MsgBox “工作簿中的工作表超过了2个”
End Select
Case Else
MsgBox “请在单元格A1中输入文本:工作表”
End Select
End Sub
如果单元格A1中的值为文本“工作表”,就判断工作簿中的工作表数量(语句Worksheets.Count),并在消息框中显示相应的信息。
说明:
- Select Case结构可以多层嵌套,但要注意每个Select Case语句要对应一条End Select语句。在书写嵌套结果时,在代码中使用缩进排列可以使程序清晰易懂。
如果Case子句后只有一条指令,那么可以将指令与Case书写在一行上。例如,我们重写示例代码2如下:
Sub NumWithSelectCase()
Select Case Range(“A1”).Value
Case 1, 3, 5: MsgBox “单元格中的数字是5以内的奇数.”
End Select
End Sub
说明:
- 如果将Case子句与后面的指令写在一行上,那么必须在它们之间加上冒号(:)。
绛旓細濡備笅杩欎釜灏辫锛歋ub Macro3()Dim m As Range For Each m In Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell))'姣忎釜鍗曞厓鏍煎鐞嗙殑浠g爜 If m.Text <> "" Then m.Select '...'...End If Next m End Sub 鏈夌枒闂紝璇稨i鎴戞垨缁欐垜鍙戠櫨搴︽秷鎭 GoodLuck!
绛旓細澶嶅埗sheet1锛屼互鏃堕棿鍛藉悕鏂扮殑宸ヤ綔绨 temp = Now temp = Replace(temp, ":", "")temp = Replace(temp, "/", "")temp = Replace(temp, " ", "")temp = ActiveWorkbook.Path & "\" & temp Sheets("sheet1").Copy ActiveWorkbook.SaveAs temp ...
绛旓細姣斿浣犺妫娴婣鍒10000琛屽紑濮嬬殑鍗曞厓鏍兼槸涓嶆槸閮芥湁鈥淭EXT鈥濊繖鍥涗釜瀛楃锛屼唬鐮佸彲浠ヨ繖鏍峰啓 鍥剧墖 Sub 妫娴嬪瓧绗()Dim a Dim b Dim c a = 10000 b = 0 Do a = a + 1 If a = 11000 Then Exit Do ElseIf Cells(a, 1) = "TEXT" Then b = b + 1 c = c & " " & a End If Loop ...
绛旓細閫変腑A1:N2锛歳ange("A1:N2").select 濡傛灉瑕佸惊鐜疉1:N2鍏朵腑绗竴琛岀殑姣忎釜鍗曞厓鏍硷細dim c as range for each c in range("A1:N2").rows(1)msgbox c.value next
绛旓細Dim MPATH As String Dim I, J As Integer Dim K1, K2 As Integer 'K1璁板綍鎶ヨ〃鐨勮鍙凤紝K2璁板綍鎶ヨ〃鐨勫垪鍙 MPATH = ActiveWorkbook.Path MBOOK = ActiveWorkbook.Name Set d = CreateObject("Scripting.Dictionary")Sheets("閫佸ザ璁板綍").Select I = 2 Do While Len(Cells(I, 2)) > 0 c = ...
绛旓細鍙互灏濊瘯灏嗗鍒剁殑鏂囦欢鍏堢矘璐村埌闈為殣钘忕殑鍗曞厓鏍,鍐嶅鍔犱竴娈靛鍒朵唬鐮佸簲璇ュ氨鍙互浜 Private Sub CommandButton1_Click()Range("C30:C39").Copy Range("C1000:c1009")Range("C1000:c1009").Copy End Sub
绛旓細Select 鏄 Action锛屼笉鍙兘鏈 Locked 灞炴с傚彧鏈 Selection 鎵嶆湁銆係pecialCells 鏄 Range 鐨勫睘鎬э紝涓嶆槸 Sheets 鐨勫睘鎬с傜敤閿 鐩爣锛圤bject锛変簡銆
绛旓細鎴戣寰椾綘杩欎釜闂锛屽湪A鍒楀拰B鍒楁煡鎵剧殑鎰忔濇槸蹇呴』瑕丄鍒楃瓑浜200806015锛孊鍒楃瓑浜庘滅敳鐧界彮鈥濓紝鐒跺悗C鍒椻24#鈥濓紝鏈鍚庢墠杩斿洖D鍒楀拰C鍒楀搴旇鐨勫笺傛墍浠ュ簲璇ョ洿鎺ユ煡鎵綜鍒楋紝鐒跺悗杩涜鍒ゆ柇灏卞彲浠ヤ簡銆VBA鐨勮瑷鏄繖鏍风殑锛歴ub chazhao()dim i as integer for i = 1 to 100 if cells(i,3)="24#" and ...
绛旓細Excel VBA鐢ㄦ埛鏈杩戝湪涓涓鍧涗笂璇㈤棶锛屽綋宸ヤ綔琛ㄥ悕绉板瓨鍌ㄤ负鍙橀噺鏃讹紝濡備綍鍦╒BA涓夋嫨宸ヤ綔琛ㄣ傞鍏堜粬涓嶉渶瑕侀夋嫨宸ヤ綔琛ㄧ殑鍑犵巼绾︿负95锛呫備负浜嗚鏄庯紝鎴戞墦寮浜嗗畯褰曞埗鍣紝閫夋嫨浜嗗崟鍏冩牸D9锛岀劧鍚庡湪鍗曞厓鏍间腑杈撳叆“ x”銆傝繖鏄疎xcel璁板綍瀹忕殑鏂瑰紡锛歋ub Macro1()Range("D9").Select ActiveCell.FormulaR1C...
绛旓細2) b(i) = Cells(i, 3) Next '閫変腑绗簩琛屾暣琛 Rows("2:2").EntireRow.Select '寮濮嬬┖琛岀殑鎻掑叆鍜屽崟鍏冩牸鏁版嵁鐨勫~鍏 For i = 1 To m For j = 1 To a(i) '鎻掑叆鏂扮殑涓琛 Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove '灏咰鍒楃殑...