2014-07-18 94 views
1

我有一個VBA宏,具有密碼保護功能(防止對宏進行未經授權的訪問),該宏按預期運行。用戶單擊按鈕,宏運行。內容或多或少:如果未輸入VBA密碼,宏/ VBA無法運行

Sub sample() 
    ActiveSheet.Unprotect Password:="xyz" 
    ...VBA code....etc 
    ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True,  cenarios:=True 
    End Sub 

現在我已經添加了一項功能,代碼如下:

Function 
......etc 
End Function 

Sub sample() 
ActiveSheet.Unprotect Password:="xyz" 
...VBA code....etc 
code referencing the function 
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, Scenarios:=True 
End sub 

如果打開工作簿,並打開VBA窗口和VBA密碼進入,該宏每次都運行良好。工作表密碼訪問正常工作。

但是,如果我以用戶身份重新打開工作簿,無法訪問VBA代碼,則在輸入VBA密碼之前,宏將不會運行。我猜測原因是該函數是子程序的「外部」,但是放入子程序內部不允許宏運行。我不想讓用戶訪問VBA代碼,他們只需要運行宏。

期待一個簡單的答案!

+0

有一些我沒有得到:你說的密碼訪問VBA代碼(我們可以使用一個來鎖定所有的代碼),但在這裏看起來('ActiveSheet.Protect'),你只是保護工作表一個密碼。所以:你的意思是你用密碼保護工作表,並且vba代碼在工作表中,而不是一個單獨的模塊?還是我總是錯了? – smagnan

回答

0

我沒有得到很好的點,但有兩點:

1 /如果你想保護你所有的代碼用密碼(如果尚未完成):

在VBA編輯器:

工具> VBAProject屬性>保護

2. /那麼事實是,sample()鎖定該用戶的表(瓦特浩沒有密碼)和密碼,當您使用:

ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, Scenarios:=True 

如果您希望您的代碼訪問的表沒有限制,但你wnat的片材,通過密碼保護(保護用戶),可以使用:

UserInterFaceOnly:=True 

這樣的:

ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, _ 
    Contents:=True, Scenarios:=True, UserInterFaceOnly:=True 

所以,你的代碼可以訪問一切,但用戶仍然需要密碼才能編輯工作表。

我不知道這是你需要的,我希望如此。如果不是的話,你可以考慮重新配置你的問題

0

不知道你試圖實現保護/不保護你的代碼和所有這些。就我個人而言,我認爲你看錯了方向。

在我的公司,我們有一套廣泛的VBA加載項(.xla和.xlam),它們受密碼保護(甚至爲了安全和防止篡改而進行了數字簽名)。他們中的很多人相互引用,試圖將它們組織爲「剪貼板插件」,「通用實用程序加載項」等,以便將它們的大小和功能分開。在這個例子中,通用utils加載項保留對剪貼板加載項的引用,以便從中調用「Public」函數(不能在模塊間或從工作簿中調用私有函數)。

只有我們知道加載項的密碼,但客戶端可以在沒有任何問題的情況下調用「Public」函數和子程序,就像我們在加載項之間調用這些函數和子程序的方式一樣。我們在加載項模塊中也有一大套「私有」例程,但沒關係,因爲它們僅在內部使用。

我們還提供了一組工作簿,這些工作簿通過引用一些加載項(這些加載項也受到保護)來使用這些加載項。但是,所有功能都可供用戶使用,我們甚至還擁有一個不受保護的VBA加載項,該加載項託管着我們的VBA API - 一層薄薄的公用程序,映射到受保護的代碼中。

客戶端不需要知道加載項內部發生了什麼。他們唯一需要知道的是我們提供的公開API接口,他們可以使用它來自動化各種各樣的事情。

我知道這可能不是你正在尋找的答案。我只是提供一個希望有用的備選方法,您可能需要考慮。