Excel VBA — создание нового документа Word и защита для форм

#excel #vba #macos #ms-word

#excel #vba #macos #ms-word

Вопрос:

У меня есть файл Excel с поддержкой макросов (обратите внимание, что он запущен на Mac с использованием Office для Mac), в котором есть несколько сохраненных макросов, один из которых для:

  1. Создайте новый файл документа .docx из сохраненного файла шаблона .dotx.
  2. Заполните закладки в новом файле .docx данными из электронной таблицы.
  3. Защитите новый документ, чтобы разрешить редактирование полей формы только конечным пользователем.
  4. Сохраните новый документ в определенной папке.

Код, который я использую в настоящее время, работает, за исключением пункта 3, я использовал Document.Метод Protect для применения требуемой защиты, но, похоже, не имеет эффекта / не работает. Также не отображается сообщение об ошибке. Смотрите текущий код ниже:

 Sub GenerateDocType(DocType As String)
    Dim form As Worksheet
    Dim db As Worksheet
    Dim WordApp As Object
    Dim WordDoc As Object
    Dim InPath As String
    Dim OutPath As String
    Dim OutFile As String
    Dim temp As String
    
        Set form = Worksheets("Bookings")
        Set db = Worksheets("Database")
    
        On Error Resume Next
        Set WordApp = GetObject(, "Word.application")
        If Err = 429 Then
            Set WordApp = CreateObject("Word.application")
            Err.Clear
            Application.Wait (Now   TimeValue("0:00:03"))
        End If
        On Error GoTo 0
        Set WordApp = GetObject(, "Word.application")
        WordApp.Visible = True

        f = form.Range("Booking_Ref").Value
        With db.Range("G2", "G" amp; i)
            Set r = .Find(What:=f)
        End With
    
        InPath = ThisWorkbook.path amp; Application.PathSeparator amp; "Templates" amp; Application.PathSeparator amp; "Booking Form.dotx"
        Set WordDoc = WordApp.Documents.Add(InPath)
        
        With WordDoc.Bookmarks
             .Item("BookingRef").Range.InsertAfter CStr(db.Cells(r.Row, 7).Value)
             'Have removed other bookmark inserts as these are not relevant to issue, they are similar to above line
        End With
        
        OutPath = ThisWorkbook.path amp; Application.PathSeparator amp; "Bookings" amp; Application.PathSeparator
        OutFile = "Booking Form - " amp; Replace(form.Range("Booking_Ref").Value, "/", "") amp; ".docx"

        WordDoc.SaveAs2 OutPath amp; OutFile
        WordApp.ActiveDocument.Protect Type:=wdAllowOnlyFormFields, noreset:=True, Password:="password"
        'Above line seems to have no effect on new document created
        WordDoc.Save
        WordApp.Quit
End Sub
  

Будет предоставлена любая помощь по исправлению защиты нового файла .docx, не уверен, что причиной может быть выполнение этого на Mac.

Спасибо.

Ответ №1:

Похоже, что вы используете позднюю привязку, что означает, что вы не можете использовать константы и перечисления из библиотеки объектов Word, например wdAllowOnlyFormFields . Поэтому ваш код должен быть:

 WordDoc.Protect Type:=2, noreset:=True, Password:="password"