Вкладки, ленты и меню не реагируют после создания меток в 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
Другие вопросы по тегам