2012-02-17 2 views
1

У меня есть этот код ниже, чтобы скопировать коды VBA из одного документа документа в другой (я использую C#). Он работает для модулей, но я не могу заставить его работать с пользовательскими формами.Копировать документ Word Userform в другой

VBComponent sourceVBC = GetSourceDocVB(); 
VBComponent targetVBC = document.VBProject.VBComponents.Add(sourceVBC.Type); 
string codes = sourceVBC.CodeModule.get_Lines(1, sourceVBC.CodeModule.CountOfLines); 
targetVBC.CodeModule.AddFromString(codes); 
targetVBC.Name = sourceVBC.Name; 

Да, пользовательская форма копируется в целевой документ, но его полей нет. Например, если в нем есть метки и текстовые поля. Эти поля не копируются. Я что-то упустил?

ответ

2

Да, вам что-то не хватает. Формы не определены только в файле кода, но также нужны бинарный файл. Вы ничего не рассказываете о том, как генерируются исходные файлы. Обычно в VBA вы используете оператор «Экспорт» объекта VBComponent. Конечно, можно сделать это вручную, перейдя в редактор VBA в Word, щелкнув правой кнопкой мыши компонент проекта и выбрав «Экспорт». Если вы посмотрите в папку экспорта, вы увидите, что форма сохраняется как два файла «Form1.frm» (содержащие код) и «Form1.frx» (содержащие двоичные данные формы, как метки и другие материалы) , В другом проекте вы можете использовать функцию File, Import, которая выполняет двоичное определение, если вы импортируете форму.

В VBA, вы можете использовать что-то вроде этого, чтобы экспортировать из проекта:

For Each vbC In ActiveDocument.VBProject.VBComponents 
    Select Case vbC.Type 

    Case vbext_ct_StdModule 
     strVbcExt = ".bas" 
    Case vbext_ct_ClassModule 
     strVbcExt = ".cls" 
    Case vbext_ct_MSForm 
     strVbcExt = ".frm" 
    Case Else 
    End Select 

    strvbCName = vbC.Name 
    strFilename = strPath & "\" & strvbCName & strVbcExt 
    vbC.Export strFilename 
(omitted the rest) 

И импортировать вы будете использовать

ActiveDocument.VBProject.VBComponents.Import strFilename 
Смежные вопросы