Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統的電腦編寫的一款電子表格軟件。直觀的界面、出色的計算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的個人計算機數據處理軟件。 在 Excel 的中名稱是一個使用很頻繁的東西,通過在?Excel?定義和使用名稱,可以更好的管理工作表數據,方便地編寫公式和設置表格。正如在工作表中定義和使用名稱一樣,在VBA中也可以創建和使用名稱,并能利用名稱處理工作表中的數據,這里我們就來具體的講一講Excel 名稱及其 VBA 中的使用。 一、認識和理解名稱1、什么是名稱:所謂名稱就是給單元格引用、常量、公式或者表格取一個有意義的名字,便于你了解和記憶這些對象,比如像下面的這些例子所表現的那樣: ?? 2、名稱的類型:Excel 的可以創建和使用名稱可以分為以下兩種類型 已定義的名稱:??代表單元格、單元格區域、公式或常量值的名稱。您可以創建自己的已定義名稱,有時 Excel 也會為您創建已定義名稱,例如當您設置打印區域時。 表名稱:??Excel 中表格的名稱,每次插入 Excel 表時,Excel 都會創建如 表1、表2 等默認 Excel 表名稱,如果有需要您也可以修改這些默認名稱。 3、名稱的有效范圍名稱的適用范圍可以分為工作表級和工作簿級,其主要的區別如下: 工作表級(局部名稱):? 此類名稱的適用范圍為定義其的工作表。比如在 Sheet1 中定義一個名稱叫 "銷售",這個名稱在沒有限定的情況下只能在?Sheet1?中被識別,如果要在其他的表格中使用這個名稱,就必須在名稱前加上定義工作表的名字來限定他。比如:Sheet1!銷售 工作簿級(全局名稱): ?此類名稱的適用范圍為工作簿。工作簿中的所有工作表而言都可以識別并使用這個名稱。但其他的工作簿是不能識別和使用的。 注意: 名稱的名字在其的適用范圍必須是唯一的。但是你可以在不同的范圍定義名字相同的名稱,比如您可以為 Sheet1,?Sheet2和?Sheet3都定義一個名叫 "銷售" 的名稱。你甚至還可以定義一個工作簿級的名叫 "銷售" 名稱。但工作表和工作簿同時存在一個名字相同的名稱時就會導致名稱沖突。Excel 為解決此類沖突,默認情況下會使用工作表級的名稱,因為局部工作表級的名稱優先于全局工作簿級的名稱。如果要使用工作簿級的名稱的話,那就必須為此名稱添加前綴來消除歧義,比如:Book1!銷售 4、創建名稱在 Excel 中一般可以通過三種方式來創建名稱,如下所述: 編輯欄上的 "名稱框": ?我們可以直接在“名稱框”中輸入名字來命名所選定的單元格或單元格區域,通常,在名稱框中顯示的是所在單元格的行號列標,單擊其右側的下拉箭頭,可以看到工作簿中的名稱列表: ? 根據所選內容創建: ?根據工作表中選定的單元格區域很方便的基于現有的行和列標簽來創建名稱: ?? 使用“定義名稱”對話框: ?使用這種方式可以更加靈活的創建、編輯及使用名稱(例如指定局部工作表級別適用范圍或創建名稱批注),?在該對話框中,可以定義常量名稱和動態名稱: ?? 5、輸入名稱名稱主要通過以下幾種方式來輸入: 直接鍵入:? 直接在單元格等中輸入名稱。 使用?"公式記憶式鍵入" :??使用?"公式記憶式鍵入"?下拉列表,其中自動為您列出了有效名稱。 使用 "用于公式" 命令項: ?從“公式”選項卡“定義的名稱”組中“用于公式”菜單的下拉列表中選擇已定義名稱。 ? 6、命名名稱注意事項下面是創建和編輯名稱時需要注意的語法規則。 有效字符:??名稱中的第一個字符必須是字母、下劃線 (_) 或反斜杠 (\)。名稱中的其余字符可以是字母、數字、句點和下劃線。注意:?不能將字母“C”、“c”、“R”或“r”用作已定義名稱,因為當在“名稱”或“定位”文本框中輸入這些字母中的兩個時,會將它們用作為當前選定的單元格選擇行或列的簡略表示法。 不允許的單元格引用:??名稱不能與單元格引用(例如 Z$100 或 R1C1)相同。 空格無效:??不允許使用空格。請使用下劃線 (_) 和句點 (.) 作為單詞分隔符,例如 Sales_Tax 或 First.Quarter。 名稱長度:??一個名稱最多可以包含 255 個字符。 區分大小寫:??名稱可以包含大寫字母和小寫字母。Excel 在名稱中不區分大寫字符和小寫字符。例如,如果創建了名稱 Sales,接著又在同一工作簿中創建另一個名稱 SALES,則 Excel 會提示您選擇一個唯一的名稱 ? 二、VBA 中對名稱的基本操作?? |
ActiveWorkbook.Names.Add Name:="MyName", RefersToR1C1:="=Sheet1!R2C2:R6C4"'或者ActiveWorkbook.Names.Add Name:="MyName", RefersTo:="=Sheet1!$B$2:$D$6" |
?
上面的代碼在當前工作簿中將工作表Sheet1內的區域B2:D6命名為MyName,該名稱為全局名稱。在所命名的名稱中不能出現空格和單元格引用,并且,如果對命名區域使用A1樣式的引用,則最后使用絕對引用,否則所命名的區域將會不確定。
在所命名的名稱前加上工作表名,則創建局部名稱,如:
ActiveWorkbook.Names.Add Name:="Sheet1!MyName1", RefersTo:="=Sheet1!$B$2:$D$6" |
Worksheets("sheet2").Names.Add Name:="MyName2", RefersTo:="=Sheet2!$A$1:$B$3" |
Worksheets("Sheet1").Range("B8:C10").Name = "MyName3" |
Worksheets("Sheet2").Range("H15:G16").Name = "Sheet2!MyName4" |
Worksheets("Sheet1").Range("E6:F8").Name = "Sheet2!MyName5" |
Worksheets("sheet2").Names.Add Name:="MyName5", RefersTo:="=Sheet1!$E$6:$F$8" |
Names.Add Name:="NameNumber", RefersTo:=666 |
Names.Add Name:="NameString", RefersTo:="TV" |
Dim MyArray(10)Dim i As IntegerFor i = 1 To 10 MyArray(i) = iNext iNames.Add Name:="NameArray", RefersTo:=MyArray |
Names.Add Name:="NameFormlas", RefersTo:="=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),1)" |
?
Worksheets("Sheet2").Names("MyName5").Name = "MyName6" |
Worksheets(“Sheet1”).Names.Add Selection.Name.Name,Sheet1.Range(“B3:C4”) |
使用Evaluate方法,例如:代碼
Evaluate("MyName").Interior.ColorIndex = 3 |
Evaluate("MyName").Interior.ColorIndex = 3
將工作表中名稱MyName所代表的單元格區域的背景設置為紅色。
?
Names.Add Name:="HideName", RefersTo:="=$A$1:$C$3", Visible:=False |
Names.Add Name:="HideName", RefersTo:="=$A$1:$C$3", Visible:=False
將隱藏所創建的名稱。注意,如果再創建的名稱與所隱藏的名稱相同,則被隱藏的名稱將被覆蓋。
?
Names("MyName3").Delete |
Names("MyName3").Delete
上面的代碼刪除當前工作簿中的名稱MyName3。
注意,當前工作簿中重命名已有名稱和刪除名稱時,要注意所要操作的名稱是全局名稱還是局部名稱。如果為局部名稱,則必須在代碼中加上該名稱所在工作表的引用。
我們在第一部分了解和認識了名稱的初步概念,在第二部分又學習了 VBA 中名稱一些基本的操作,比如 添加和刪除等,下面我們用一些具體的例子來進一步學習 VBA 中名稱的運用
Sub test() Dim str As Boolean str = NameExists("myName") If str = True Then MsgBox "該名稱存在于當前工作簿中." Else MsgBox "該名稱不存在." End IfEnd Sub‘- - - - - - - - - - - - - - - - - - - - - Function NameExists(FindName As String) As Boolean Dim rng As Range Dim myName As String On Error Resume Next myName = ActiveWorkbook.Names(FindName).Name If Err.Number = 0 Then NameExists = TrueEnd Function |
Function NameExists(TheName As String) As Boolean On Error Resume Next NameExists = Len(ThisWorkbook.Names(TheName).Name) <> 0End Function |
Sub UnHideName() Dim Nm As Name For Each Nm In Names Nm.Visible = True NextEnd Sub |
Sub ShowNames() Dim N As Integer For N = 1 To ActiveWorkbook.Names.Count On Error Resume Next Cells(N, 1) = "'" & ActiveWorkbook.Names(N).Name Cells(N, 2) = "'" & ActiveWorkbook.Names(N).RefersToRange.Address Cells(N, 3) = "'" & ActiveWorkbook.Names(N).ShortcutKey Cells(N, 4) = "'" & ActiveWorkbook.Names(N).Visible NextEnd Sub |
Sub ShowNames_activecell() On Error Resume Next MsgBox ActiveCell.Name.Name Select Case Err.Number Case 0 Case 1004 MsgBox "單元格" & ActiveCell.Address(4) & "沒有命名。" Case Else MsgBox Err.Number & " -- " & Err.Description End SelectEnd Sub |
?
Sub DeleteName() Dim Nm As Name For Each Nm In ActiveWorkbook.Names If Nm.Name Like "*name*" Then Nm.Delete Next NmEnd Sub |
Function NameOfParentRange(Rng As Range) As String Dim Nm As Name For Each Nm In ThisWorkbook.Names If Rng.Parent.Name = Nm.RefersToRange.Parent.Name Then If Not Application.Intersect(Rng, Nm.RefersToRange) Is Nothing Then NameOfParentRange = Nm.Name Exit Function End If End If Next Nm NameOfParentRange = ""End Function |
??
在Excel工作表的名稱框中(如圖1所示),大約只能顯示16個字符,當超過它所能容納的字符時,后面的字符將會被截取,將不能看到完整的名稱,這對前面的字符相同而區別在最后幾個字符的名稱來說,很不方便,但是在Excel中沒有改變名稱框尺寸的設置。這可通過調用 Windows API 來解決,通過調用API來增加下拉框的寬度。在VBE編輯器中插入一個標準模塊,并輸入以下的代碼(代碼可用于 32 位和64位 Excel):
#If Win64 Then Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As LongPtr, ByVal wMsg As Long, _ ByVal wParam As LongPtr, lParam As Any) As LongPtr#Else Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long#End IfPublic Const CB_SETDROPPEDWIDTH = &H160Sub SetNameBoxDropWidth() Const xWidth = 600 '這里設置為你需要的寬度 Call SendMessage( _ FindWindowEx( _ FindWindowEx( _ FindWindow("XLMAIN", Application.Caption), _ 0, "EXCEL;", vbNullString), _ 0, "combobox", vbNullString), _ CB_SETDROPPEDWIDTH, xWidth, 0)End Sub |
?
效果如圖:
示例說明:上述代碼運行前后的結果如圖3和圖4所示。在上面的代碼中,可以通過改變常量 xWidth 的值來定義下拉框的寬度。
Excel提供的快捷鍵中沒有名稱框的快捷鍵。但是,您能使用VBA代碼設置快捷鍵,以方便能快速定位到名稱框。
在VBE編輯器中,插入一個標準模塊,并輸入以下代碼(代碼可用于 32 位和64位 Excel):
#If Win64 Then Public Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr#Else Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As Long#End IfSub SetFocusNameBox() Call SetFocus( _ FindWindowEx( _ FindWindowEx( _ FindWindow("XLMAIN", Application.Caption), _ 0, "EXCEL;", vbNullString), _ 0, "combobox", vbNullString))End Sub |
溫馨提示:喜歡本站的話,請收藏一下本站!