Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在没有信任访问权限的情况下保护宏创建的工作表的名称_Vba_Excel_Worksheet - Fatal编程技术网

Vba 在没有信任访问权限的情况下保护宏创建的工作表的名称

Vba 在没有信任访问权限的情况下保护宏创建的工作表的名称,vba,excel,worksheet,Vba,Excel,Worksheet,我有一个宏,可以创建一个名为“final”的工作表。我需要停止用户编辑工作表名称,以便我的代码仍能正常工作。我做了一些研究,得出了以下代码。这段代码适用于我自己,但问题是它要求用户对所选的Visual Basic项目具有信任访问权限。我没有办法让我所有的用户都这么做 我使用了以下代码: Dim wb As Workbook, ws As Worksheet Dim VBP As Object, VBC As Object, CM As Object Dim strProcName As Stri

我有一个宏,可以创建一个名为“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的情况下更改图纸,是否有方法锁定/始终重命名图纸的名称

> P>您可以考虑用工作表范围名称标记您的“最终”页,然后根据该表标识该表:

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
上述代码将更改代码名等于“Final_sheet”的工作表的名称。因此,如果有人更改了工作表的名称,则在运行此代码时,无论顺序如何,都会将其更改回


我只是想说,有一些方法可以阻止用户重命名单元格(禁用右键单击、双击等),但是,如果可以在运行宏之前简单地运行宏来重命名工作表,那么为什么还要麻烦地处理这个问题呢。

工作表对象提供了几个属性来保护工作表子对象(如行、列或单元格)不受用户更改的影响

我理解您的问题,您希望保护工作表本身不被重命名

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

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

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
或者更简单:

  • 打开要保护的工作簿
  • 点击
    ALT+F11打开VBA编辑器
  • 在VBE的直接窗口中键入
    Activeworkbook.protect
  • 优点:您不需要将VBA代码放入工作簿本身

    缺点:您将保护工作簿的所有工作表,不能只保护其中一个,而保持其他工作表的打开状态


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

    我刚刚测试了此代码。据我所见,它将一张名为“Final”的表格更改为“WasFinal”。它仍然允许我将工作表名称更改为我想要的任何名称,例如“tree”。这就是我试图阻止的(用户更改工作表名称)。我理解您的问题的意思是“即使用户更改了我的工作表名称,我如何保持代码工作?”。通过允许您识别特定的图纸,而不管其名称如何,这样您就可以做到这一点。我的
    Tester
    代码只是您如何应用它的一个示例(即,更改工作表名称是为了模拟用户操作)。
    Sub Test()
    
    Dim SN As String
    
    SN = "Final Sheet"
    
    If Final_Sheet.Name <> SN Then
    
    Final_Sheet.Name = SN
    
    End If
    
    
    End Sub
    
    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