我有一个宏创建一个名为" 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的情况下进行了更改?
答案 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
甚至更简单:
ALT+F11
Activeworkbook.protect
优点:您无需将VBA代码放入工作簿本身。
缺点:您将保护工作簿的 所有 工作表,并且无法保护其中一个工作表并保持其他工作表处于打开状态。
我不知道(意味着您可能需要尝试):用户是否仍然可以执行您希望用户使用此保护执行的操作?