關于Excel的隱藏名稱空間這個被隱藏的名稱空間是一個屬于當前Excel實例的內(nèi)存區(qū)域,,該區(qū)域加載項DLLs(“XLLS”)能存儲臨時的名稱,。使用這個區(qū)域,,即使沒有可利用的宏工作表可用,,XLLs也能定義名稱,。
隱藏著的名稱操作基于XLM函數(shù)SET.NAME、GET.NAME和EVALUATE,,而且當在XLM宏工作表中使用時,,SET.NAME定義一個標準的工作表級名稱,同時,,當它在XLL中被調(diào)用時,,創(chuàng)建一個應用程序級名稱并且存儲在一個被隱藏的區(qū)域中。
定義在被隱西藏域的名稱有一些特殊的功能,,這使得它們與標準工作簿名稱有很大的不同,。這些功能將在后面描述。
與隱藏著的名稱相關的可用C API命令如下:
Excel4(xlfSetName,&xResult,2,&xName,&xValue),,定義包含xValue的名稱xlName,。
Excel4(xlfGetName,&xResult,1,&xName),獲取xlName的定義(例如”=1”)并將它存儲在xResult中,。
Excel4(xlfEvaluate,&xResult,1,&xName),,獲取xlName的內(nèi)容(例如:1)并將它存儲在xResult中。
Excel4(xlfSetName,&xResult,1,&xName),,刪除xName(忽略第二個參數(shù)),。
在VBA中訪問被隱藏的名稱空間(1) 創(chuàng)建一個隱藏的名稱
下面的語句創(chuàng)建一個包含字符串“OK”的名為Test的隱藏名稱:
Application.ExecuteExcel4Macro "SET.NAME(""Test"",""OK"")"
(2) 獲取一個隱藏名稱所代表的內(nèi)容
為了獲取名稱Test所代表的內(nèi)容,使用下面的代碼:
TestVal = Application.ExecuteExcel4Macro("Test")
注意,,只使用名稱本身作為ExecuteExcel4Macro的參數(shù),。
(3) 刪除一個隱藏的名稱
為了刪除名稱Test,使用下面的語句:
Application.ExecuteExcel4Macro "SET.NAME(""Test"")"
注意,,忽略了SET.NAME中的第二個參數(shù),。
被隱藏的名稱空間的特征在被隱藏的名稱空間中所定義的名稱的主要特征是:它們不屬于任何工作簿,而屬于應用程序本身,,這意味著:
(1)在Excel中的任何地方可以直接訪問這些名稱,。無論在哪個工作簿中創(chuàng)建了這種名稱,在任何工作簿中的任何VBA模塊,、工作表或宏工作表(和任何DLL加載項)中直接都能直接讀取和修改它們,。
(2) 它們的“生存時間”與當前Excel會話一致
如果在工作簿W(wǎng)bk1.xls中的某個VBA模塊中創(chuàng)建了一個名稱,然后關閉了這個工作簿,,那么該名稱仍然存儲在被隱藏的命名空間中,。如果接著打開另一個工作簿W(wǎng)bk2.xls,那么這個工作簿的VBA過程仍能獲取和修改剛才在Wbk1.xls中所創(chuàng)建的名稱,。在沒有被任何VBA加載項所限制的情況下,,在被隱藏的名稱空間中所定義的名稱能作為永久的“公共變量”訪問。
對于這些屬于應用程序的隱藏的名稱,,關閉所有工作簿和加載項不會銷毀它們,。通過對SET.NAME(沒有第二個參數(shù))明確的調(diào)用或者退出并重啟Excel,才能銷毀它們,。在這種情況下,,這些名稱能作為一種Excel的環(huán)境變量來使用。
(3) 它們是“完全隱藏著的”
當一個受保護的加載項使用這個隱藏的名稱空間時,,新的名稱不能被任何其它的VBA模塊讀取,,也不能被用戶讀取,除非他們知道名稱空間的身份證書,。沒有方法去“列出”被定義在隱藏命名空間中的名稱,。
這些名稱無須與標準的隱藏名稱(即將工作簿或工作表名稱的.Visible屬性設置為False)相混淆。標準的工作簿級的名稱決不會真正的被隱藏,,因為它們能通過使用Application.Names集合的任何VBA過程來獲取和修改,,如下面的代碼所示:
Dim CName As Name
For Each CName In Workbooks("Wbks1.xls").Names
If CName.Hidden Then
MsgBox CName.Name & " deleted"
CName.Delete
End If
Next CName
上面的代碼在工作簿W(wǎng)bks1.xls所有隱藏的名稱中循環(huán)并刪除它們,但是這些代碼不能發(fā)現(xiàn)存儲在被隱藏的命名空間中的名稱,,因為這些名稱不屬于Application.Names集合,,因此,它們被保護以反對任何惡意的訪問或修改,。
示例
下面的代碼演示了在受保護的VBA加載項中隱藏著的命名空間的可能的用途,。
它限制用戶在相同的Excel會話中執(zhí)行加載項主過程超過3次。允許剩余執(zhí)行次數(shù)的計數(shù)器沒有存儲在模塊級的變量中,,也沒有存儲在依賴加載項的名稱中,,而是存儲在隱藏的命名空間里。通過排除了傳統(tǒng)方法的下列缺點,,隱藏的命名空間阻止了用戶能夠中止保護,。
(1) 像所有變量一樣,存儲在VBA中的計數(shù)器變量能在VBE中手動清除,。
(2) 同樣的方式,,任何外部過程通過在加載項的Names集合中循環(huán),都可以讀取,、修改和可能刪除加載項中所有隱藏的或未隱藏的工作簿名稱,。
但是,隱藏的命名空間避免了這些危險,。它也比使用基于環(huán)境字符串的實例,、臨時文件或注冊進入等方法更簡單,而且隱藏的命名空間是永久的,,用戶能關閉和重新打開該工作簿而無須重新設置這個計數(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 "Macro disabled. You must restart 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
注:本文翻譯整理自Chip Pearson的文章《
Hidden Name Space In Excel》,,略作修改,。并提供示例文檔 Wbks1.xls。
UploadFiles/2006-12/121312334.rar