2014-06-17 45 views
0

我有一個宏,它創建一個名爲「最終」的工作表。我需要停止用戶編輯工作表名稱,以便我的代碼仍然可以正常工作。我已經做了一些研究,並拿出下面的代碼。此代碼適用於我自己,但問題是它需要用戶具有對Visual Basic項目的信任訪問權限。我無法讓所有用戶都這樣做。保護無信任訪問宏創建工作表的名稱

我使用的代碼:

Dim wb As Workbook, ws As Worksheet 
Dim VBP As Object, VBC As Object, CM As Object 
Dim strProcName As String 
Set wb = ThisWorkbook 
Set ws = wb.Sheets("Final") 

Set VBP = wb.VBProject 

strProcName = "Worksheet_SelectionChange" 

With wb.VBProject.VBComponents(wb.Worksheets(ws.Name).CodeName).CodeModule 
    .InsertLines Line:=.CreateEventProc("Deactivate", "Worksheet") + 1, _ 
    String:=vbCrLf & _ 
    " Me.Name = "NameOfSheet"" 
End With 

如果我有一個在宏創建了一個表,有沒有改變,如果不使用我鎖定/總重命名工作表的名稱的方式一個VBProject?

回答

0

你可以考慮使用一個工作表範圍的名稱標記您的「最後」表,然後根據標識片:

Sub Tester() 

    Const NAME_NAME As String = "FINAL_SHEET" 

    With ThisWorkbook.Worksheets("Final") 

     .Names.Add Name:=NAME_NAME, RefersToR1C1:="=TRUE" 

     .Name = "WasFinal" 'simulates user changing sheet name 

     MsgBox GetSheetWithName(NAME_NAME).Name ' "WasFinal" - the correct sheet 

    End With 

End Sub 

Function GetSheetWithName(sName As String, Optional wb As Workbook) 
Dim sht As Worksheet, nm As Name, rv As Worksheet 
    If wb Is Nothing Then Set wb = ThisWorkbook 
    For Each sht In wb.Worksheets 
     On Error Resume Next 
     Set nm = sht.Names(sName) 
     On Error GoTo 0 
     If Not nm Is Nothing Then 
      Set rv = sht 
      Exit For 
     End If 
    Next sht 
    Set GetSheetWithName = rv 
End Function 
+0

我剛剛測試過這段代碼。從我所看到的它將名爲「Final」的表更改爲「WasFinal」。它仍然允許我將表格名稱更改爲我想要的任何內容,例如「樹」。這是我試圖阻止的(用戶更改工作表的名稱)。 – user3737057

+0

我將你的問題理解爲「即使用戶更改我的工作表名稱,我該如何保持我的代碼正常工作?」。通過允許您識別特定的工作表,無論其名稱如何,您都可以這樣做。我的「測試器」代碼僅僅是您應用它的一個例子(即表格名稱更改是模仿用戶操作)。 –

0
Sub Test() 

Dim SN As String 

SN = "Final Sheet" 

If Worksheets(1).Name <> SN Then 

Worksheets(1).Name = SN 

End If 


End Sub 

此代碼假定工作表「最終片」工作表1.如果有人更改工作表的名稱,此代碼將起作用,但如果他們更改工作表的順序,現在位於Worksheets(X)(其中X是索引編號)的工作表將重命名爲「最終工作表」

更改在至Worksheets(X).Name工作表

UPDATE的索引號

Sub Test() 

Dim SN As String 

SN = "Final Sheet" 

If Final_Sheet.Name <> SN Then 

Final_Sheet.Name = SN 

End If 


End Sub 

其中代號等於「Final_Sheet」上面的代碼將改變薄片的名稱。因此,如果有人更改了工作表的名稱,則此代碼在運行時將被更改,無論訂單如何。

只是想到我會提及阻止用戶重命名單元格的方法(禁用右鍵單擊,雙擊ect),但是爲什麼要在通過運行宏來重命名錶單之前運行宏的麻煩。

-1

工作表對象提供了幾個屬性來保護工作表孩子(如行或列)或單元格免受用戶更改。

正如我理解你的問題,你想保護工作表本身免於重命名。

因此,您必須更改工作簿屬性(工作表的父級)以保護工作表免受用戶更改。

通過以下兩個簡單的潛艇可以保護/取消保護工作簿:

Sub protectWb() 
Dim testWb As Workbook 
Set testWb = ActiveWorkbook 
testWb.Protect 
End Sub 

Sub unprotectWb() 
Dim testWb As Workbook 
Set testWb = ActiveWorkbook 
testWb.Unprotect 
End Sub 

或更簡單:

  1. 打開要通過保護
  2. 打開VBA編輯器中的工作簿打到ALT+F11
  3. 類型Activeworkbook.protect在VBE的直接窗口中

優點:您不需要將VBA代碼放入工作簿本身。

缺點:你會保護工作簿的所有工作表和不能保護只是其中之一,並保持其他開關打開。

我不知道的(意味着您可能需要嘗試):用戶是否仍允許執行您希望用戶使用此保護功能的內容?