Вкладки, ленты и меню не реагируют после создания меток в VBA (Word 2007) из IBM Notes
Я создаю набор меток с помощью Word 2007, управляемый через VBA из IBM Notes.
Документ генерируется нормально, но после генерации вкладки, ленты и меню не реагируют. Я могу щелкнуть в сгенерированном документе, но щелчок по любому из верхних элементов управления не имеет никакого эффекта (значки не нажимаются и т. Д.). В качестве обходного пути я могу щелкнуть другое окно, поиграть там, и тогда среагирует лента для этого конкретного документа. Я предполагаю, что это как-то связано с проблемой фокуса.
После завершения кода я устанавливаю Word Application.Visible в True, ScreenUpdating в True. Я звоню "Закрыть", чтобы закрыть все открытые файлы, но все равно, безрезультатно.
Код вызывается базой данных IBM Notes в Lotusscript.
Сталкивались ли вы с этим раньше? Это очень озадачивает, и не пускает моих клиентов.
Эндрю
Основная функция:
Dim p As New LabelSourceFile
Call p.GenerateFileForSelectedDocuments()
Call p.ExtractWordTemplateFromConfig()
Dim w As New WordExport
w.setSelectedTemplateFullFile(p.FilePathToTemplate)
Print "file path to template: " + p.FilePathToTemplate
Call w.InitializeWordDocument()
Dim finaldoc As Variant
set finaldoc = w.MailMergeWithThisFile(p.getDataFileStreamFileName())
Call w.ReplaceCRWithCarriageReturns(finaldoc)
finaldoc.Activate 'gives focus back to document I've just generated
Set finaldoc = Nothing
'p.DeleteVorlage
'Kill p.FilePathToDataFile
Call w.ReleaseToUser()
Эта функция инициализирует мой документ:
Public Function InitializeWordDocument As Integer
'Initialize a Word Document Object
' If m_strSelectedTemplateFullFile = "" an empty document is created
InitializeWordDocument = False
'On Error Goto ErrorHdl
m_objWordApplication.DisplayAlerts = wdAlertsnone
If Not m_objWordApplication Is Nothing Then
If m_strSelectedTemplateFullFile <> "" Then
Set m_objWordDoc = m_objWordApplication.Documents.Add( m_strSelectedTemplateFullFile )
InitializeWordDocument = True
Else
Set m_objWordDoc = m_objWordApplication.Documents.Add()
End If
Set m_objCurrentRange = m_objWordDoc.Range(0,0)
End If
m_objWordApplication.DisplayAlerts = wdAlertsAll
Exit Function
ErrorHdl:
InitializeWordDocument = False
Exit Function
End Function
Эта функция фактически выполняет слияние:
'/*************************************************************************************
' * Function MailMergeWithThisFile
' * @param datafilename the data file
' * @return the final merged word document
' * @author Andrew Magerman/Magerman/NotesNet
' * @version Dec 18, 2013
' *************************************************************************************/
Function MailMergeWithThisFile (datafilename As String) As variant
On Error GoTo ErrorHandler
'If I don't block the popups, there is an annoying pop-up that appears.
m_objWordApplication.DisplayAlerts = wdAlertsnone
With me.m_objWordDoc.MailMerge
.MainDocumentType = wdFormLetters
Call .OpenDataSource(datafilename, wdOpenFormatText, false)
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute(False)
End With
'I need to set this here, immediately after the generation of the destination, merged document because the later
'actions of closing change the active document.
Set MailMergeWithThisFile = m_objWordApplication.ActiveDocument
Call m_objWordDoc.Close(False)
m_objWordApplication.DisplayAlerts = wdAlertsAll
Exit Function
ErrorHandler:
Call logError
Exit Function
End Function
1 ответ
Бездумно комментируя строки, пока я не получил ответ, вот мой обходной путь:
Всегда создавайте новый экземпляр (CreateObject) и забудьте о GetObject.
Если у кого-нибудь есть хорошее объяснение этому, я буду рад это услышать. На данный момент я просто собираюсь использовать обходной путь.
'Initialize the Word Object
Set m_objWordApplication = Nothing
'I create always a new Word instance because that avoids me having focus issues.
' Set m_objWordApplication = GetObject("","word.application")
' If m_objWordApplication Is Nothing Then
Set m_objWordApplication = CreateObject("word.application")
' End If