在受保护的VBProject中更改工作表CodeName

时间:2019-06-15 06:52:51

标签: excel vba passwords

我有一个受password(1)保护的VBProject。我试图添加一个工作表并在运行时更改其代号,但我得到了error 50289

通过点击按钮从sheet1调用代码。

Public Sub AddSheet()
    Dim sh As Worksheet
    With ThisWorkbook
        .Worksheets.Add
        Set sh = .ActiveSheet
        .VBProject.VBComponents(sh.CodeName).Name = "sh" & VBA.Minute(VBA.Now) & VBA.Second(VBA.Now)
        .Save
        Sheet1.Activate
    End With
End Sub

我真的想保持项目锁定。 VBProject被锁定时,有什么方法可以实现?

2 个答案:

答案 0 :(得分:2)

不是问题的解决方案 (我错过了打开视图保护的时间;(我只设置了一个密码。可惜!),但是也许有人从_CodeName或隐藏成员的发现中受益。)

尽管Worksheet.CodeName是只读的,但是存在可以编辑的隐藏属性Worksheet._CodeName!无需通过API调用来完成解锁项目。

要在对象浏览器中查看隐藏的成员,请右键单击它,然后选择Show Hidden Member

`Public Sub AddSheet()
    Dim sh As Worksheet
    With ThisWorkbook
        .Worksheets.Add
        Set sh = .ActiveSheet
        sh.[_CodeName] = "sh" & VBA.Minute(VBA.Now) & VBA.Second(VBA.Now)
        .Save
        Sheet1.Activate
    End With
End Sub

答案 1 :(得分:0)

由于在Project受保护的同时您无法编辑CodeName,并且我们不想通过代码取消保护,因此请使用不受保护的另一个Project。

temp.xlsm工作簿包含一个功能,用于编辑工作表的代号,并返回对该工作表的引用。此参考可用于将工作表复制到受保护的工作簿。 该函数由Application.Run("temp.xlsm!EditCodeName", CodeName)执行,并返回带有已编辑CodeName的工作表。

复制工作表的步骤:

Public Sub CopySheet()

    Dim ws As Excel.Worksheet
    Dim wsTemp As Excel.Worksheet
    Dim CodeName As String

    CodeName = "sh" & VBA.Minute(VBA.Now) & VBA.Second(VBA.Now)
    Set ws = ThisWorkbook.Worksheets(1)
    Set wsTemp = Application.Run("temp.xlsm!EditCodeName", CodeName)
    wsTemp.Copy After:=ws

End Sub

用于编辑temp.xlsm中的CodeName的功能(如果将其放在受保护的工作簿中名为modCodeName的模块中,则过程CreateWB()会在创建时将其复制到temp.xlsm中。

Public Function EditCodeName(ByVal CodeName As String) As Excel.Worksheet

    Dim sh As Excel.Worksheet

    With ThisWorkbook
        Set sh = .Worksheets(1)  
        sh.[_CodeName] = CodeName    
        Set EditCodeName = sh
    End With

End Function

以及创建temp.xlsm工作簿的过程

Sub CreateWB()

    Const CodeFile As String = "CodeFile.txt"
    Const TempWB As String = "temp.xlsm"

    With Workbooks.Add
        .SaveAs TempWB, xlOpenXMLWorkbookMacroEnabled
        ThisWorkbook.VBProject.VBComponents("modCodeName").Export CodeFile
        .VBProject.VBComponents.Import CodeFile
        .Close True
    End With

End Sub