- 帖子
- 128
- 主題
- 13
- 精華
- 1
- 積分
- 118
- 點名
- 0
- 作業系統
- WinXP
- 軟體版本
- Office2003
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 四川成都邛崃
- 註冊時間
- 2010-9-13
- 最後登錄
- 2017-5-12
|
跨檔案(工作簿)使用使用名稱
本帖最後由 et5323 於 2010-10-3 10:41 編輯
a.xls的Sheet1裏定義有名稱”name”,在其處於“打開”的狀態下:
1.在b.xls的單格裏引用:=’a.xls’!name
2.代碼裏引用:
Sub test()
Msgbox workbooks(“a.xls”).sheets(“Sheet1”).[name]
End sub
以下內容来自http://www.cpearson.com/excel/hidden.htm:
Excel中隱藏著的名稱空間
這個被隱藏的名稱空間是一個屬於當前Excel實例的記憶體區域,該區域載入項DLLs(“XLLS”)能存儲臨時的名稱。使用這個區域,即使沒有可利用的宏工作表可用,XLLs也能定義名稱。
隱藏著的名稱操作基於XLM函數SET.NAME、GET.NAME和EVALUATE,而且當在XLM宏工作表中使用時,SET.NAME定義一個標準的工作表級名稱,同時,當它在XLL中被調用時,創建一個應用程式級名稱並且存儲在一個被隱藏的區域中。
定義在被隱藏區域的名稱有一些特殊的功能,這使得它們與標準工作簿名稱有很大的不同。這些功能將在後面描述。
(1) 創建一個隱藏的名稱
下面的語句創建一個包含字串“OK”的名為Test的隱藏名稱:
Application.ExecuteExcel4Macro "SET.NAME(""Test"",""OK"")"
(2) 獲取一個隱藏名稱所代表的內容
為了獲取名稱Test所代表的內容,使用下面的代碼:
TestVal = Application.ExecuteExcel4Macro("Test")
注意,只使用名稱本身作為ExecuteExcel4Macro的參數。
(3) 刪除一個隱藏的名稱
為了刪除名稱Test,使用下面的語句:
Application.ExecuteExcel4Macro "SET.NAME(""Test"")"
注意,忽略了SET.NAME中的第二個參數。
被隱藏的名稱空間的特徵
在被隱藏的名稱空間中所定義的名稱的主要特徵是:它們不屬於任何工作簿,而屬於應用程式本身,這意味著:
(1)在Excel中的任何地方可以直接訪問這些名稱。無論在哪個工作簿中創建了這種名稱,在任何工作簿中的任何VBA模組、工作表或巨集工作表(和任何DLL載入項)中直接都能直接讀取和修改它們。
(2) 它們的“生存時間”與當前Excel會話一致
如果在工作簿Wbk1.xls中的某個VBA模組中創建了一個名稱,然後關閉了這個工作簿,那麼該名稱仍然存儲在被隱藏的命名空間中。如果接著打開另一個工作簿Wbk2.xls,那麼這個工作簿的VBA過程仍能獲取和修改剛才在Wbk1.xls中所創建的名稱。在沒有被任何VBA載入項所限制的情況下,在被隱藏的名稱空間中所定義的名稱能作為永久的“公共變數”訪問。
對於這些屬於應用程式的隱藏的名稱,關閉所有工作簿和載入項不會銷毀它們。通過對SET.NAME(沒有第二個參數)明確的調用或者退出並重啟Excel,才能銷毀它們。在這種情況下,這些名稱能作為一種Excel的環境變數來使用。
(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
上面的代碼在工作簿Wbks1.xls所有隱藏的名稱中迴圈並刪除它們,但是這些代碼不能發現存儲在被隱藏的命名空間中的名稱,因為這些名稱不屬於Application.Names集合,因此,它們被保護以反對任何惡意的訪問或修改。
示例
下面的代碼演示了在受保護的VBA載入項中隱藏著的命名空間的可能的用途。
它限制用戶在相同的Excel會話中執行載入項主過程超過3次。允許剩餘執行次數的計數器沒有存儲在模組級的變數中,也沒有存儲在依賴載入項的名稱中,而是存儲在隱藏的命名空間裏。通過排除了傳統方法的下列缺點,隱藏的命名空間阻止了用戶能夠中止保護。
(1) 像所有變數一樣,存儲在VBA中的計數器變數能在VBE中手動清除。
(2) 同樣的方式,任何外部過程通過在載入項的Names集合中迴圈,都可以讀取、修改和可能刪除載入項中所有隱藏的或未隱藏的工作簿名稱。
但是,隱藏的命名空間避免了這些危險。它也比使用基於環境字串的實例、暫存檔案或註冊進入等方法更簡單,而且隱藏的命名空間是永久的,用戶能關閉和重新打開該工作簿而無須重新設置這個計數器。
在這個代碼中,函數SetHName、GetHName和DelHName可以創建、獲取和刪除隱藏的名稱,而不需要直接使用冗長的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 |
-
2
評分人數
-
|