Как обратиться к OLE Workbook? - PullRequest
0 голосов
/ 05 марта 2020

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

Я открываю этот файл, используя OLEobj.Verb xlVerbOpen и присвойте его переменной Workbook с именем wbR . Поскольку его имя может меняться при каждом его открытии, единственный способ, который я рассчитывал сделать, это использовать ActiveWorkbook .

Это работает, когда я запускаю код построчно. Однако, когда весь макрос запускается с кнопки, большую часть времени ActiveWorkbook будет считаться таким же, как ThisWorkBook . Я пытался использовать Wait и Sleep.

Часть, которая дает эту проблему:

For Each OLEobj In ThisWorkbook.Sheets("SheetName").OLEObjects
    Set OLEobj = wsr.OLEObjects(OLEobj.Name)
    OLEobj.Verb xlVerbOpen
    Application.Wait (Now + TimeValue("0:00:05"))
    'Sleep 5000
    Set wbR = ActiveWorkbook
    Exit For
Next OLEobj

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Использование .Verb xlVerbOpen может быть рискованным для получения «активного» приложения.

Activate (start/open) объекта и использование OLEFormat.Object.Object для получения объекта книги.

Это то, что вы пытаетесь?

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim shp As Shape
    Dim wb As Object

    '~~> Change this to the relevant sheet where the excel file is embedded
    Set ws = Sheet1

    '~~> Change this to the relevant object name
    Set shp = ws.Shapes("Object 1") ' OLEobj.Name? from your code?

    '~~> Activate it (Open it)
    shp.OLEFormat.Activate

    '~~> Get the workbook object
    Set wb = shp.OLEFormat.Object.Object

    With wb
        '
        '~~> Work with the workbook object here
        '

        MsgBox .Worksheets.Count
    End With
End Sub
0 голосов
/ 05 марта 2020

Следуя вашему предложению, я изменил свой код, как показано ниже, и он работает как шарм. Большое спасибо за вашу помощь !!

For Each OLEobj In ThisWorkbook.Sheets("Ratios").OLEObjects
    Set OLEobj = wsr.OLEObjects(OLEobj.Name)
    'OLEobj.Verb xlVerbOpen
    OLEobj.Activate
    **Set wbR = OLEobj.Object**  ' New line that solves the issue.
    Exit For
Next OLEobj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...