Как открыть Excel из другого приложения Office, не задавая ссылки? - PullRequest
0 голосов
/ 30 января 2019

В Word и Outlook я пытаюсь открыть открытый Excel, используя метод GetObject, но сначала мне нужно установить ссылки.Я получаю «Ошибка компиляции: пользовательский тип не определен».Чтобы исправить это вручную, мне нужно перейти в Инструменты> Ссылки> Microsoft Excel XX.X Object Library.Есть ли способ не выполнять шаг настройки ссылки вручную?

Я получаю доступ к одним и тем же файлам из разных сеансов (локальный сеанс, Citrix, VMware), которые имеют разные версии Excel.

https://docs.microsoft.com/en-us/office/vba/excel/concepts/working-with-other-applications/controlling-one-microsoft-office-application-from-another

Код до сих пор

Sub Macro1()
'
    Dim Excel As Object

    Dim wkbkXLBook As Excel.Workbook
    Dim wkSheet As Excel.worksheet

    Set Excel = GetObject(, "Excel.Application")

    If Excel Is Nothing Then

        MsgBox ("Excel was not found")

    End If

    Selection.WholeStory
    Selection.WholeStory
    Selection.Copy
End Sub

1 Ответ

0 голосов
/ 30 января 2019

Если вы не добавляете ссылку на библиотеку типов, вы не можете использовать ранние типы, определенные в этой библиотеке типов.

Dim wkbkXLBook As Excel.Workbook
Dim wkSheet As Excel.worksheet

Excelявляется программным именем библиотеки типов Excel, а Workbook является именем класса, определенного в этой библиотеке.То же самое для Worksheet.Поскольку на Excel нет ссылок, VBA не может разрешить эти типы, и вы получаете ошибку компиляции.

Вам необходимо работать с кодом с поздней привязкой, т. Е. В темноте, без IntelliSense , автозаполнение или быстрая информация о параметрах и без каких-либо опечаток - иначе вы столкнетесь с ошибками 438 и 1004 во время выполнения.

«Позднее» означает «разрешено во время выполнения».Всякий раз, когда вы объявляете что-то As Object, именно это и происходит:

Dim wkbkXLBook As Object
Dim wkSheet As Object

Вы не можете использовать любой из типов Excel, если не ссылаетесь на библиотеку типов Excel.Это включает в себя также любую xl* константу.

Dim Excel As Object

Я настоятельно рекомендую переименовать ее, например, в xlApp.

Следите за неявными ссылками на объекты:

Dim someRange As Object
Set someRange = xlApp.ActiveWorkbook.Worksheets("Sheet1").Range("A1")

Вышеописанное будет работать, но также будет пропускать объект ActiveWorkbook, его коллекцию Worksheets и извлеченный объект Worksheet;эти просочившиеся объекты могут (и часто do ) препятствуют корректному завершению процесса EXCEL.EXE, даже после выполнения xlApp.Quit и Set xlApp = Nothing: избегайте двойных точек, ссылающихся на подобные объекты.Сделайте это вместо этого:

Dim books As Object
Set books = xlApp.Workbooks

Dim wb As Object
Set wb = books("workbook name")

Dim wbSheets As Object
Set wbSheets = wb.Worksheets

Dim ws As Object
Set ws = wbSheets("sheet name")

Dim rng As Object
Set rng = ws.Range("A1")

С каждым объектом, включенным в явную область действия локальной процедуры, все должно быть в порядке.

...