我有一个受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
被锁定时,有什么方法可以实现?
答案 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