#excel #vba #macos #ms-word #ole
Вопрос:
Я использую Excel версии 16.54 на Macbook Pro. Ниже приведена часть кода, которая должна принимать некоторые значения из листа Excel и записывать их в документ Word.Документ Word хранится в той же папке, что и файл Excel. Весь процесс записи в документе Word запускается кнопкой в файле Excel.(Функция, которая запускается при нажатии кнопки)
Сначала я получаю приглашение с вопросом «Открыт ли Microsoft Word?». Если я нажму «Да» (Word открыт)… Я получаю ошибку автоматизации во время выполнения. Если я нажму Нет (Word открыт)… Я получаю ошибку автоматизации во время выполнения. Если я нажму Нет (Word закрыт)… Я получаю ошибку автоматизации во время выполнения. Если я закрою Word и повторю попытку, я должен нажать «Нет», чтобы начать запись в документе Word.
Моя проблема в том, что мне всегда приходится проходить через ошибку хотя бы один раз, чтобы она начала работать. Что-то не так с моим кодом или это просто потому, что я использую Macbook?
Обновление: он работает без проблем в Windows.
Dim wdApp As Object
Dim wdDoc As Object
Dim exBk As Workbook
Dim exSht As Worksheet
Set exBk = ThisWorkbook
filepath = exBk.Path amp; "/" amp; Worksheets("Content").Range("B2").Value
a = MsgBox("Is Microsoft Word Open?", vbYesNo)
If a = vbYes Then
Set wdApp = GetObject(filepath, "Word.Application")
Else
Set wdApp = CreateObject("Word.Application")
Set wdDoc = wdApp.Documents.Open(filepath)
End If
wdApp.Visible = True
Комментарии:
1. В вашем коде нет ничего плохого. Это просто связано с Office на macOS. Если вы выполните поиск таким образом, вы обнаружите, что этот вопрос задавался ранее. Вы можете получить лучший ответ, если разместите свой вопрос на форуме Apple
2. Вы также получите сообщение об ошибке в Windows, используя GetObject, когда Word еще не запущен. Вот почему я предлагаю использовать процедуру tryGetWord- см. Ниже.
3. Office для Mac с использованием мини-порта технологии Windows OLE. Она плохо написана. Вы должны отправить отчет об ошибке в корпорацию Майкрософт. Настройте страницу, на которой отображается ваш код, чтобы его можно было воспроизвести. Нажмите на значок «человек с речевым пузырем» в правом верхнем углу окна программы и выберите «Мне что-то не нравится». Опишите проблему подробно, приложите скриншот, показывающий ваш код, и отправьте. Они вряд ли ответят.
Ответ №1:
Я использую следующую TryGet-функцию для возврата WordApp. Это один из случаев, когда я использую On error resume next.
Проверено на Windows, а не на Mac
Sub test_getWord()
Dim wdApp As Object
If tryGetWordApp(wdApp) = False Then
MsgBox "Word could not be started."
Exit Sub
End If
wdApp.Visible = True
End Sub
Public Function tryGetWordApp(wdApp As Object) As Boolean
'Generic function to retrieve Word Application - regardless of wether app is already open or has to be opened.
'Returns true if wdApp could be set, otherwise false
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err > 0 Or wdApp Is Nothing Then
'Word not yet open
Err.Clear
Set wdApp = CreateObject("Word.Application")
If Err = 0 Then tryGetWordApp = True
Else
tryGetWordApp = True
End If
On Error GoTo 0
End Function