excel表格名稱的秘密
excel表格名稱的秘密

名稱是Excel中的一項(xiàng)強(qiáng)大功能,無論是在公式中還是在VBA中運(yùn)用名稱,都能帶來極大的便利。
本文主要談?wù)勗贓xcel中不被注意到的一些名稱的使用。
Excel內(nèi)置的名稱
Excel有一些內(nèi)置的名稱,它們會(huì)在特定的環(huán)境下自動(dòng)使用。
例如,設(shè)置打印區(qū)域后,Excel會(huì)自動(dòng)命名打印區(qū)域?yàn)镻rint_Area,如下圖1所示。
圖1
如果設(shè)置打印標(biāo)題,則Excel會(huì)創(chuàng)建名稱Print_Titles。
又如,在使用高級(jí)篩選獲取不重復(fù)值列表時(shí),Excel會(huì)自動(dòng)創(chuàng)建名稱Extract,如圖2所示。
圖2
如果在使用高級(jí)篩選時(shí),使用了條件,除了名稱Extract外,Excel還會(huì)自動(dòng)將條件區(qū)域命名為Criteria,如圖3所示。
圖3
Excel還有其它一些內(nèi)置名稱,例如:Consolidate_Area、Database、FilterDatabase、Sheet_Title,等等。
因此,在VBA代碼中,如果出現(xiàn)了上述名稱,你不必感到奇怪。例如,下面的語句刪除當(dāng)前工作表中已經(jīng)設(shè)置的打印區(qū)域:
ActiveSheet.Names(“Print_Area”).Delete
在《經(jīng)典代碼解析5:查找并顯示部分匹配的數(shù)據(jù)》中,VBA代碼將名稱“Extract”定義為常量,在篩選完成后,再將該名稱代表的區(qū)域刪除,即作為臨時(shí)數(shù)據(jù)區(qū)域。
Excel中隱藏的名稱空間
認(rèn)識(shí)Excel隱藏的名稱空間
Excel隱藏的名稱空間是一個(gè)屬于當(dāng)前Excel實(shí)例的內(nèi)存區(qū)域,該區(qū)域加載項(xiàng)DLLS(“XLLS”)能夠存儲(chǔ)臨時(shí)的名稱。使用這個(gè)區(qū)域,即便沒有可利用的宏工作表,XLLs也能夠定義名稱。
隱藏著的名稱操作基于XLM函數(shù)SET.NAME、GET.NAME和EVALUATE。當(dāng)在XLM宏工作表中使用時(shí),SET.NAME定義一個(gè)標(biāo)準(zhǔn)的工作表級(jí)名稱;當(dāng)它在XLL中被調(diào)用時(shí),創(chuàng)建一個(gè)應(yīng)用程序級(jí)名稱并且將其存儲(chǔ)在一個(gè)被隱藏的區(qū)域中。
與隱藏著的名稱相關(guān)的可用的C API命令如下:
Excel4(xlfSetName,&xResult,2,&xName,&xValue);
定義包含xValue的名稱xlName。
Excel4(xlfGetName,&xResult,1,&xName);
獲取xlName的定義(例如,“=1”),并將其存儲(chǔ)在xResult中。
Excel4(xlfEvaluate,&xResult,1,&xName);
獲取xlName的內(nèi)容(例如,1)并將其存儲(chǔ)在xResult中。
Excel4(xlfSetName,&xResult,1,&xName);
刪除xlName(忽略第二個(gè)參數(shù))。
定義在隱藏區(qū)域的名稱有一些特殊功能,這使得它們與標(biāo)準(zhǔn)工作簿名稱有很大的不同。
隱藏的名稱空間的特征
在隱藏的名稱空間中所定義的名稱不屬于任何工作簿,而屬于應(yīng)用程序本身。
在Excel的任何地方可以直接訪問這些名稱。無論在哪個(gè)工作簿中創(chuàng)建了這個(gè)名稱,在任何工作簿中的任何VBA模塊、工作表或宏工作表(和任何DLL加載項(xiàng))中都能直接讀取和修改它們。
隱藏的名稱的“生存時(shí)間”與當(dāng)前Excel會(huì)話一致。
如果你在工作簿W(wǎng)B1.xlsx中某個(gè)VBA模塊中創(chuàng)建了一個(gè)名稱,然后關(guān)閉了這個(gè)工作簿,那么該名稱仍然存儲(chǔ)在隱藏的命名空間中。如果你接著打開另一個(gè)工作簿W(wǎng)B2.xlsx,那么該工作簿的VBA過程仍能獲取和修改這個(gè)隱藏的名稱,即便它是在WB1.xls中所創(chuàng)建的。如果沒有被任何VBA加載項(xiàng)所限制的話,那么在隱藏的名稱空間中所定義的名稱能被用作永久的“公共變量”訪問。
對(duì)于這些屬于應(yīng)用程序的隱藏的名稱,關(guān)閉所有工作簿和加載項(xiàng)不會(huì)銷毀它們。它們僅能通過對(duì)SET.NAME(如果沒有第二個(gè)參數(shù))明確的調(diào)用或者通過退出并重啟Excel被銷毀。在這種情況下,這些名稱能被用作一種Excel的環(huán)境變量。
它們是完全隱藏的。當(dāng)一個(gè)受保護(hù)的加載項(xiàng)使用這個(gè)隱藏的名稱空間時(shí),新的名稱不能被任何其它的VBA模塊讀取,也不能被用戶讀取,除非他們知道它們的身份證書。沒有方法“列出”定義在隱藏命名空間中的名稱。
這些名稱無須與標(biāo)準(zhǔn)的隱藏名稱(工作簿或工作表名稱的.Visible屬性已設(shè)置為False)混淆。標(biāo)準(zhǔn)的工作簿級(jí)的名稱決不會(huì)真正的被隱藏,因?yàn)樗鼈兡芡ㄟ^使用Application.Names集合的任何VBA程序來獲取和修改,如下面的代碼所示:
Dim CName As Name
For Each CName In Workbooks(“WB1.xlsm”).Names
If CName.Hidden Then
MsgBox CName.Name & ” 被刪除”
CName.Delete
End If
Next CName
上面的代碼,在工作簿W(wǎng)B1.xlsm的所有名稱中循環(huán),并刪除它們中隱藏的名稱。然而,這些代碼不能發(fā)現(xiàn)存儲(chǔ)在隱藏名稱空間中的名稱,因?yàn)檫@些名稱不屬于Application.Names集合。因此,它們被保護(hù)以反對(duì)任何惡意的訪問或修改。
在VBA中訪問隱藏的名稱空間
創(chuàng)建一個(gè)隱藏的名稱
下面的語句創(chuàng)建一個(gè)包含字符串“OK”的名為Test的隱藏的名稱:
Application.ExecuteExcel4Macro”SET.NAME(“”Test””,””O(jiān)K””)”
獲取一個(gè)隱藏名稱的內(nèi)容
下面的語句獲取名稱“Test”所代表的內(nèi)容:
TestVal = Application.ExecuteExcel4Macro(“Test”)
只是使用名稱本身作為ExecuteExcel4Macro的參數(shù)。
刪除一個(gè)隱藏的名稱
下面的語句刪除名稱“Test”:
Application.ExecuteExcel4Macro”SET.NAME(“”Test””)”
忽略了SET.NAME的第二個(gè)參數(shù)。
在工作表中訪問隱藏的名稱空間
在工作表中也可以直接訪問隱藏的名稱,必須使用SET.NAME和EVALUATE與CALL()和API函數(shù)Excel4組合在一起。函數(shù)SET.NAME和EVALUATE的編號(hào)分別是88和257。
創(chuàng)建一個(gè)隱藏的名稱
下面創(chuàng)建一個(gè)包含字符串“OK”的名為Test的隱藏的名稱:
=CALL(“Xlcall32″,”Excel4″,”2JRJRR#”,88,,2,”Test”,”O(jiān)K”)
獲取一個(gè)隱藏名稱的內(nèi)容
下面獲取名為“Test”的名稱的內(nèi)容:
=CALL(“Xlcall32″,”Excel4″,”2JRJR#”,257,,1,”Test”)
刪除一個(gè)隱藏名稱
下面刪除名稱“Test”:
=CALL(“Xlcall32″,”Excel4″,”2JRJRR#”,88,,1,”Test”)
在工作表公式中直接定義和刪除名稱是可能的,因?yàn)镾ET.NAME不是一個(gè)命令而是一個(gè)宏函數(shù)。
在宏工作表中能以相同的方式使用隱藏的名稱,除了不需要給類型字符串添加數(shù)字標(biāo)志外。
示例
下面的代碼演示了在受保護(hù)的VBA加載項(xiàng)中隱藏的名稱空間的可能的用途。
它限制用戶在相同的Excel會(huì)話中執(zhí)行加載項(xiàng)主過程超過3次。沒有在一個(gè)模塊級(jí)的變量中存儲(chǔ)允許剩余執(zhí)行的計(jì)數(shù)器,也沒有將其存儲(chǔ)在依賴加載項(xiàng)的名稱中,而是存儲(chǔ)在這個(gè)隱藏的命名空間中。
使用名稱空間阻止用戶中斷保護(hù),修復(fù)了傳統(tǒng)方法的下列缺點(diǎn):
像所有變量一樣,存儲(chǔ)在VBA中的計(jì)數(shù)器可以在VBE中手工清除。
同樣,任何外部子過程遍歷加載項(xiàng)的Names集合,可以讀取、修改和刪除中所有隱藏的或者未隱藏的工作簿名稱。
隱藏的名稱空間避免了這些危險(xiǎn),它也比基于環(huán)境字符串的實(shí)例、臨時(shí)文件或注冊(cè)輸入等方法更簡單,而且隱藏的名稱空間是永久的,用戶能關(guān)閉和重新打開該工作簿而無須重新設(shè)置這個(gè)計(jì)數(shù)器。
在下面的代碼中,函數(shù)SetHName、GetHName和DelHName允許創(chuàng)建、獲取和刪除隱藏的名稱,而無須直接使用冗長的Application.ExecuteExcel4Macro方法。
Sub Main()
Application.EnableCancelKey = xlDisabled
Dim Count
Count = GetHName(“TswbkCount”)
If IsError(Count) Then
SetHName “TswbkCount”, 3
ElseIf Count = 1 Then
MsgBox “宏被禁止. 你必須重新啟動(dòng)Excel.”, vbInformation
Else
SetHName “TswbkCount”, Count – 1
End If
End Sub
Sub SetHName(Name As String, Value)
Application.ExecuteExcel4Macro _
“SET.NAME(“”” & Name &”””,” & Value & “)”
End Sub
Function GetHName(Name As String)
GetHName = Application.ExecuteExcel4Macro(Name)
End Function
Sub DelHName(Name As String)
Application.ExecuteExcel4Macro”SET.NAME(“”” & Name & “””)”
End Sub
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。