保护宏的名称创建没有信任访问的工作表

时间:2014-06-17 16:27:52

标签: excel vba excel-vba worksheet

我有一个宏创建一个名为" final"的工作表。我需要阻止用户编辑工作表名称,以便我的代码仍然可以正常工作。我做了一些研究并提出了以下代码。此代码适用于我自己,但问题是它要求用户具有对所选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的情况下进行了更改?

3 个答案:

答案 0 :(得分:0)

你可以考虑标记你的" final"具有工作表范围名称的工作表,然后根据该工作表识别工作表:

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

答案 1 :(得分:0)

Sub Test()

Dim SN As String

SN = "Final Sheet"

If Worksheets(1).Name <> SN Then

Worksheets(1).Name = SN

End If


End Sub

此代码假定工作表&#34; Final Sheet&#34;是工作表1.如果有人更改工作表的名称,此代码将起作用,但如果他们更改了工作表的顺序,则现在位于Worksheets(X)(其中X是您的索引编号)的工作表将重命名为&#34;决赛表&#34;

X中的Worksheets(X).Name更改为工作表的索引号

<强>更新

Sub Test()

Dim SN As String

SN = "Final Sheet"

If Final_Sheet.Name <> SN Then

Final_Sheet.Name = SN

End If


End Sub

上述代码将更改代号同等于&#34; Final_Sheet&#34;的工作表名称。因此,如果有人更改工作表的名称,则无论顺序如何,都会在运行此代码时将其更改回来

只是想到我提到有一些方法可以阻止用户重命名单元格(禁用右键单击,双击等),但是为什么当你只需运行一个时就可以解决这个问题的麻烦宏在宏运行之前重命名工作表。

答案 2 :(得分:-1)

工作表对象提供了几个属性来保护工作表子项,如行或列或单元格,以防止用户更改。

我理解你的问题,你想保护工作表本身免于重命名。

因此,您必须更改工作簿属性(工作表的父级)以保护工作表不受用户更改的影响。

通过以下2个简单的潜艇,您可以保护/取消保护您的工作簿:

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. 点击ALT+F11
  3. 打开VBA编辑器
  4. 在VBE的直接窗口中输入Activeworkbook.protect
  5. 优点:您无需将VBA代码放入工作簿本身。

    缺点:您将保护工作簿的 所有 工作表,并且无法保护其中一个工作表并保持其他工作表处于打开状态。

    我不知道(意味着您可能需要尝试):用户是否仍然可以执行您希望用户使用此保护执行的操作?