Вы должны добавить ссылку на Microsoft Visual Basic for Applications Extensibility 5.3
через Tools/Reference в редакторе VBA.
В качестве альтернативы вы можете использовать последнее связывание.
Заменить
Dim comp As VBComponent
по
Dim comp As Object
А потом
Set comp = ThisWorkbook.VBProject.VBComponents("File")
будет работать, как ожидалось. Как ни странно, вам не нужно включать ссылку для вызова .VBProject
, поскольку это стандартное свойство объекта рабочей книги.
К сожалению,
Workbooks("book2.xlsm").VBProject.VBComponents.Add comp
не будет работать, как вы ожидаете. .Add
создает пустой компонент. Аргумент должен быть константой, которая описывает тип компонента, который вы хотите создать, который должен быть 1
для стандартного модуля кода. (Есть константы, которые вы можете использовать вместо 1
, но я подозреваю, что эти константы не будут работать без ссылки).
Вы можете проверить, что даже без ссылки на строку:
Set target = Workbooks("book2.xlsm").VBProject.VBComponents.Add(1)
(где target
объявлен как Object
или Variant
) преуспеет в обеих создании нового модуля в book2 и создании ссылки на него. Эта ссылка может использоваться для передачи кода, но не (AFAIK) все сразу. Для этого вам может потребоваться программный экспорт/импорт, как описано в Chip Pearson's article on scripting the VBE. Вы можете проработать эту статью, используя при необходимости позднюю привязку.
Во-первых, зачем вам нужно _programmatically_ копировать модуль? Во-вторых, используйте отладчик, чтобы найти, на какой строке вы получаете сообщение об ошибке. – FDavidov
@FDavidov посмотрите пожалуйста обновленный вопрос. –