Изменить кодовое имя листа в защищенном VBProject - PullRequest
0 голосов
/ 15 июня 2019

У меня есть VBProject, который защищен с password(1).Я пытаюсь добавить лист и изменить его кодовое имя во время выполнения, но я получаю 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 ]

2 голосов
/ 15 июня 2019

Не решение вопроса (Я пропустил включение защиты просмотра; (Я только установил pwd. Позор мне!, Но, возможно, кто-то выиграет от открытия _CodeName или скрытых участников.)

Хотя Worksheet.CodeName только для чтения, существует скрытое свойство Worksheet._CodeName, которое можно редактировать! Не нужно лазить по проекту разблокировки через API-вызовы.

Чтобы просмотреть скрытые элементы в Object-Browser, щелкните по нему правой кнопкой мыши и выберите 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
0 голосов
/ 16 июня 2019

Поскольку вы не можете редактировать CodeName, пока проект защищен, и мы не хотим снимать защиту с помощью кода, просто используйте другой проект, который не защищен.

Эта temp.xlsm рабочая книга содержит функцию для редактирования CodeName рабочего листа и возвращает ссылку на этот лист. Эту ссылку можно использовать для копирования листа в защищенную книгу. Функция выполняется 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

Функция для редактирования CodeName в файле temp.xlsm (если вы поместите его в модуль с именем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...