Ошибка VBA «Требуется объект» ТОЛЬКО КОГДА компьютер заблокирован - PullRequest
0 голосов
/ 01 июля 2019

Мой код ниже сканирует предоставленный файл документации (параметр sp) и копирует таблицы на лист с именем «xxxx» (указанный в глобальной переменной «shtTableName»). Этот код отлично работает, когда компьютер НЕ заблокирован. Но этот код не запускается, когда экран / компьютер заблокирован.

Я проследил, что проблема .. это с линии

sht.Paste Range("A1")

я пытался

Acitvesheet.Paste 

но выдает ту же ошибку.

Я перепробовал все возможные вещи в Excel vba, но ни одна из них не работала,

Кроме того, когда выдается ошибка, она не перехватывается в разделе ErrWord, она сразу же выдает ошибку в родительский обработчик ошибок вызывающей процедуры ....

Не могу понять, почему блокировка экрана / компьютера может создать такую ​​проблему. Любая помощь будет принята с благодарностью.

Я использую Windows 10 версии 1808, сборка 10730.20348

Спасибо Gaurav

Sub read_word_document(filename As String)

    Dim DOC_PATH As String
    DOC_PATH = filename

    Dim sht As Worksheet
    Dim WordDoc As Word.Document
    Dim WordApp As Word.Application
    Dim i As Long, r As Long, c As Long
    Dim rng As Range, t As Word.Table
    Dim oData As New DataObject 'object to use the clipboard
    Dim bWordDocObjectCreated As Boolean

On Error GoTo ErrWord

        bWordDocObjectCreated = False
        Set WordApp = CreateObject("Word.Application")
        WordApp.Visible = True
        Set WordDoc = WordApp.Documents.Open(DOC_PATH, ReadOnly:=True)
        bWordDocObjectCreated = True 'indicates that object WordDoc has been created and file has been opened

        Set sht = Sheets(shtTableName)
        Set rng = sht.Range("A1")

        For Each t In WordDoc.Tables
            sht.Cells.Delete Shift:=-4162
            sht.Activate
            sht.Range("A1").Select
            t.Range.Copy
            sht.Paste Range("A1")
            'ActiveSheet.Paste
            Exit For 'get only first table
        Next t

        Application.CutCopyMode = False
        oData.SetText Text:=Empty 'Clear
        oData.PutInClipboard 'take it to the clipboard to empty it

        Application.DisplayAlerts = False
        WordDoc.Close False
        WordApp.Quit
        Exit Sub

ErrWord:
        If Not UCase(Err.Description) Like "*CORRUPTED*" And bWordDocObjectCreated = True Then
            Data.SetText Text:=Empty 'Clear
            oData.PutInClipboard 'take in the clipboard to empty it
            Application.CutCopyMode = False
            Application.DisplayAlerts = False
            WordDoc.Close False
        End If

        WordApp.Quit

End Sub

1 Ответ

0 голосов
/ 01 июля 2019

У меня была похожая проблема, но в Excel. Решение, которое работало для меня, было добавлением

Application.ScreenUpdating = False в начале макроса. Это может или не может работать в вашем случае.

Вообще говоря, макросы, которые имитируют действия пользователя, например, копирование / вставка, отправка нажатий клавиш, не могут выполняться при заблокированном экране - по моему опыту.

Вам может потребоваться другое приложение, чтобы убедиться, что экран разблокирован перед запуском макроса, или оставить экран разблокированным. Для этой цели я успешно использовал кофеин .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...