2016-03-28 7 views
3

Я создал проект VBA в Excel и в рамках указанного проекта является модулем, который записывает код в другой модуль. Я, в конечном счете, защитил паролем проект, чтобы скрыть код (не понимая сразу, что это создаст некоторые довольно очевидные проблемы).Запись процедуры/функции VBA в .xlam addin

Когда пользователь взаимодействует с файлом, модуль пытается запустить код, но обнаруживает ошибку (проект, защищенный паролем, не может изменить себя!) У всех нас есть свои моменты: p).

Таким образом, я понял, «почему бы не сделать отредактированную часть незащищенной», оставив остальную часть файла заблокированной. Поэтому я решил, что создам незащищенную надстройку .xlam, а затем напишу код на эту часть. Однако мне сложно понять, как это сделать. Ниже приведен код, который я написал, что пишет код в другой модуль:

Public Sub errorWrite() 

Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 
Dim s As String 
Dim d As String 
Dim lineNumb As Long 

With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "Public sub newModule()" 

j = j + 1 

With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "(my code etc..)" 

j = j + 1 

    With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "end sub" 


end sub 

В то время как я нашел некоторую информацию о стеке и в других местах в отношении .xlam надстроек (Updating an xlam add-in using VBA), например, я бы просто держать его как можно проще. Предложения и подсказки очень ценятся. Благодаря!

ответ

1

Использование незащищенного Addin похоже на разумный подход. Но код, который вы опубликовали, записывается в другой Модуль в пределах Защищенный addin. Вы должны ссылаться на другой AddIn как VBProject

Изменить название вашей Незащищенной надстройки к уникальной Name (значение по умолчанию равно VBAProject и не должен быть уникальными)

Затем создайте ссылку на него как этот

Dim VBP As VBProject 
Set VBP = ThisWorkbook.VBProject.VBE.VBProjects("NameOfYourUnprotectedAddin") 

Тогда весь ваш код использует эту ссылку вместо ThisWorkbook.VBProject

Eg

With VBP.VBComponents.item("NewModule") 
    .CodeModule.InsertLines j, "Public sub newModule()" 
' etc 

End With 
+0

При использовании выше, как вы предложили, я получаю сообщение об ошибке выполнения «9», индекс вне диапазона. Согласно excel, добавлен аддон, я также использовал уникальное имя аддона как с расширением .xlam, так и без него: – Singularity20XX

0

поэтому я смог найти способ, который, кажется, работает, я написал код с использованием FSO, а затем сохранил файл как .bas-модуль. Оттуда я использовал ниже, чтобы иметь модуль импортированный непосредственно в .xlam надстройке как модуль:

Public Sub importBas() 
Dim VBP As VBProject 
Set VBP = Workbooks("example.xlam").VBProject 

VBP.VBComponents.Import ("C:\Users\...example.bas") 
VBP.VBComponents.Remove 

End Sub 

Затем, в оригинальном модуле, я удалил процедуру в xlam после исполнения было закончено. Поэтому никакого кода не видно (при условии, что я не забываю использовать обработку ошибок и отключить режим прерывания: p)

Мне все еще любопытно, как написать «прямо», поэтому я буду играть с ним больше и посмотреть, получить его, хотя этот способ работает

Спасибо :)