2013-11-14 3 views
0

У меня есть подпрограмма VBA, которая выполняет разное форматирование документов Word. Он использует объект Selection (Selection.WholeStory) для применения форматирования.Квалифицировать объект выбора в VBA Word

Эта подпрограмма вызывается из Outlook VBA с объектом Word.Application.

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

VBA, похоже, не соответствует критериям выбора, поэтому, когда вы пишете Selection.PageSetup (т.е.) и начинаете применять изменения, оно применяется к Документу, уже открытому в Word, а не к документу, который вы обрабатываете из VBA.

Я искал ответ на MSDN и здесь, но не повезло. Если кто-нибудь знает, как квалифицировать этот объект, дайте мне знать. Благодарю.

В основном,

create word handler 
open attachment in word 
Selection.WholeStory 
With Selection.PageSetup 
.LineNumbering.Active = False 
.Orientation = wdOrientPortrait 
/* etc */ 
End with 

С «Выбор» не может быть квалифицировано, все эти изменения получают сделаны к тому, что уже открыто.

if numTextFiles >= 1 then 
    for each textFile in textFileNames 

     'Open text file in word 
     Set doc = WordApp.Documents.Open(outReportFullDir & "\" & textFile) 

     'Set the output name of word doc (change .txt to .docx) 
     reportWordName = left(textFile, len(textFile) - 4) 
     reportWordName = reportWordName & ".docx" 

     'Check if out word document already exists 
     preventOverwrite(outReportFullDir & "\" & reportWordName) 

     'Format Reports 
     formatReport() 
'etc 

_

Private Sub formatReport() 

documents(docToFormat).select 

Selection.WholeStory 

'Added by Ryan to make single-spaced 
WordBasic.OpenOrCloseParaBelow 
WordBasic.OpenOrCloseParaBelow 

Selection.Font.Name = "Courier New" 
Selection.Font.Size = 8 
With Selection.PageSetup 
    .MirrorMargins = False 
    .TwoPagesOnOne = False 
    .BookFoldPrinting = False 
    .BookFoldRevPrinting = False 
    .BookFoldPrintingSheets = 1 
    .GutterPos = wdGutterPosLeft 
End With 
End Sub 
+0

Является ли scriptiing автоматическим закрытием любых открытых экземпляров Word для вас? – hammus

+0

Я спросил группу конечных пользователей и ожидаю ответа. Да, одна работа вокруг, которую я рассматривал, - это проверка того, открыты ли какие-либо документы Word, и если да, подскажите & завершите. Но если кто-нибудь узнает более элегантное решение, я был бы признателен :) – RMurphy

ответ

2

Возможно, существует путаница между объектом выбора Word и объектом выбора Outlook.

Использование

WordApp.Selection 

т.е.

WordApp.Selection.WholeStory 
WordApp.Selection.Font.Name = "Courier New" 

т.д.

(или, например,

Dim sel as Word.Selection 
Set sel = WordApp.Selection 
sel.WholeStory 
sel.Font.Name = "Courier New" 
Set sel = Nothing 

, так что если WordApp не в объеме, вы должны быть в состоянии используйте что-то вроде

Set sel = doc.Application.Selection 

)

Наконец, если вы можете уйти с использованием диапазона Word, вместо этого, я бы сделал так (например, doc.Range или Doc.Content) и избегайте всего объекта Selection.

+0

Вы предоставили элегантный и простой ответ на мой вопрос. Способ выбора объекта выделения - с помощью WordApp. Оглядываясь назад, кажется таким простым и очевидным. Большое спасибо. – RMurphy

0

Вы пробовали что-то вроде этого? Похоже, вы получаете правильную ссылку на правильный документ на одном этапе игры.

if numTextFiles >= 1 then 
    for each textFile in textFileNames 

     'Open text file in word 
     Set doc = WordApp.Documents.Open(outReportFullDir & "\" & textFile) 

     'Set the output name of word doc (change .txt to .docx) 
     reportWordName = left(textFile, len(textFile) - 4) 
     reportWordName = reportWordName & ".docx" 

     'Check if out word document already exists 
     preventOverwrite(outReportFullDir & "\" & reportWordName) 

     'Format Reports 
     Call formatReport(doc) 
'etc 



Private Sub formatReport(ByRef doc) 

    documents(doc).select 

    Selection.WholeStory 

    'Added by Ryan to make single-spaced 
    WordBasic.OpenOrCloseParaBelow 
    WordBasic.OpenOrCloseParaBelow 

    Selection.Font.Name = "Courier New" 
    Selection.Font.Size = 8 
    With Selection.PageSetup 
     .MirrorMargins = False 
     .TwoPagesOnOne = False 
     .BookFoldPrinting = False 
     .BookFoldRevPrinting = False 
     .BookFoldPrintingSheets = 1 
     .GutterPos = wdGutterPosLeft 
    End With 
End Sub