2015-06-16 1 views
1

Вот мой сценарий: Пользователь сглаживает документ Word, у меня есть кнопка на панели быстрого доступа, которая выполняет макрос, который использует оболочку Execute для запуска передачи приложения это параметр.Как получить имя документа из документа слияния Word после слияния в VBA

Это работает, однако мне нужно указать имя документа Word. Когда я запрашиваю активный документ, он называется «Form Letters».

Есть ли способ получить имя документа Word (шаблон) в коде VBA после слияния документа? Я знаю, что Word меняет имя после слияния, мне нужно имя документа Word, содержащее поля слияния.

Const SW_SHOW = 1 
Const SW_SHOWMAXIMIZED = 3 

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (_ 
    ByVal hwnd As Long, ByVal lpOperation As String, _ 
    ByVal lpFile As String, ByVal lpParameters As String, _ 
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Sub RunYourProgram() 
    l = Len(ActiveDocument) 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    ' The line below retrieves name, "FORM LETTER"(strips off .doc) 
    ' rather than name of Word document template 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    Doc_Name = Mid(ActiveDocument, 1, l - 4) 
    Dim RetVal As Long 
    On Error Resume Next 
    RetVal = ShellExecute(0, "open", "M:\gendoc\FG_To_ECF.exe", _ 
     Doc_Name, "c:\Certificates", SW_SHOWNORMAL) 
End Sub 
+0

Спасибо. Забыли код отступа. – KentE

ответ

1

Я не уверен, правильно ли я понял ваш вопрос.

Если вы пытаетесь получить имя файла текущего открытого документа Word, вы должны использовать ActiveDocument.FullName (который включает полный путь) или ActiveDocument.Name (просто имя файла, включая его расширение).

В примере вы дали код бы, как показано ниже:

Const SW_SHOW = 5 
Const SW_SHOWMAXIMIZED = 3 
Const SW_SHOWNORMAL = 1 

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ 
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ 
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Sub RunYourProgram() 

    Dim RetVal As Long 

    On Error Resume Next 
    RetVal = ShellExecute(0, "open", "M:\gendoc\FG_To_ECF.exe", ActiveDocument.Name, "c:\Certificates", SW_SHOWNORMAL) 

End Sub 

UPDATE:

Ok @KentE, я думаю, что теперь я получил то, что вам нужно. К сожалению, окончательный документ, сгенерированный слиянием, не содержит имя исходного файла в любом месте. Я вижу два возможных решения:

1) Вы можете сохранить исходный документ в качестве реального шаблона. В вашем случае CS32.doc должен быть сохранен как расширение .dot или .dotx. Итак, когда вы открываете CS32.dotx и запускаете «Слияние», сгенерированный документ «Form Letters» будет содержать ссылку на исходный шаблон. В этом случае CS32.dotx. В VBA вы можете получить имя шаблона с помощью ActiveDocument.AttachedTemplate

2) Или вы можете изменить CS32.doc, чтобы сохранить пользовательское свойство. Предположим, что вы создали настраиваемое свойство «OriginalName» со значением «CS32.dotx» (может быть любым значением). Итак, когда вы открываете CS32.doc и запускаете «Слияние», сгенерированный документ «Form Letters» будет содержать те же пользовательские свойства исходного документа. В этом случае свойство «OriginalName» будет содержать введенное вами значение. В VBA вы можете получить имя настраиваемого свойства через ActiveDocument.CustomDocumentProperties("OriginalName")

Надеюсь, это поможет. С уважением.

+0

Спасибо за ваш вход Родриго. После того, как Word завершит слияние, он создает имя для объединенного документа, называемого «Form Letters». Код VBA «ActiveDocument.Name» возвращает это имя в моем макросе. Мне нужно имя шаблона Word. В моем случае именем шаблона документа Word является CS32.doc, а именем источника данных является CS32.da1 (текстовый файл с разделителями-запятыми). Когда я сливаюсь, Word дает объединенному документу имя «Form Letters», которое я хочу для получения имени исходного шаблона CS32.docx. Я надеюсь в этом есть смысл. – KentE

+0

Привет @KentE, я отредактировал ответ на основе ваших комментариев. Надеюсь, это поможет вам. К сожалению, сгенерированный файл слияния не содержит ссылки на исходный файл. Пожалуйста, проверьте мой ответ и дайте мне знать. –

+0

Вариант 1 не является вариантом, но вариант 2 может работать, очень гладкий. Это требует изменения всех документов и добавления этого настраиваемого свойства, но после слияния документа код VBA успешно извлекает исходное имя документа. Я бы сказал, что это отвечает на вопрос. Большое спасибо! – KentE

Смежные вопросы