Vba 在没有信任访问权限的情况下保护宏创建的工作表的名称
我有一个宏,可以创建一个名为“final”的工作表。我需要停止用户编辑工作表名称,以便我的代码仍能正常工作。我做了一些研究,得出了以下代码。这段代码适用于我自己,但问题是它要求用户对所选的Visual Basic项目具有信任访问权限。我没有办法让我所有的用户都这么做 我使用了以下代码: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
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编辑器
Activeworkbook.protect
我不知道的是(意味着您可能必须尝试):是否仍然允许用户使用此保护执行您希望用户执行的操作?我刚刚测试了此代码。据我所见,它将一张名为“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