Автор Тема: Word VBA Макросы: Действия с полями в защищённом документе.  (Прочитано 2322 раз)

Irina18

  • Гость
Всем  удачного дня. Особенные поздравления программистам, с 256 днем вас – днем программиста. Пока у программистов не начался банкет, прошу помощи.

Имеется защищённый документ. В нем надо, чтобы несколько раз дублировались данные из нескольких полей и какие-то части этих полей. Для Сотрудника 1 имеется вот такие коды (я взяла их из интернета):
Спойлер
Sub WriteToTextFF(writeText)
    With GetCurrentFF
        If .Type = wdFieldFormTextInput Then
            .Result = writeText
        End If
    End With
lbl_Exit:
    Exit Sub
End Sub
 Private Function GetCurrentFF() As Word.FormField
    Dim rngFF, fldFF
    Set rngFF = Selection.Range
    rngFF.Expand wdParagraph
    For Each fldFF In rngFF.FormFields
        Set GetCurrentFF = fldFF
        Exit For
    Next fldFF
lbl_Exit:
    Exit Function
End Function
Спойлер
Sub FIOname1()
Dim pr As Bookmark
Dim sText As String
Dim sArray() As String
Dim sResult1 As String
Dim sResult2 As String
Set pr = ActiveDocument.Bookmarks("name1")
sText = pr.Range.Text
sArray = Split(sText)
sResult1 = sArray(0) & " "
sResult1 = sResult1 & Left(sArray(1), 1) & ". "
sResult1 = sResult1 & Left(sArray(2), 1) & "."
sResult2 = sArray(2) & " "
sResult2 = sResult2 & sArray(1)
ActiveDocument.Bookmarks("fioname1").Select
WriteToTextFF (sResult1)
Это дописала сама, но не знаю насколько правильно с точки зрения VBA
Спойлер
ActiveDocument.Bookmarks("fioname11").Select
WriteToTextFF (sResult1)
ActiveDocument.Bookmarks("name11").Select
WriteToTextFF (sText)
End Sub
но всё работает. Как это же самое сделать для Сотрудника 2?

В VBA навыков не имею, вот и обращаюсь на форум. Мой файл с макросом во вложении. Всем спасибо.

[вложение удалено администратором]

Оффлайн Администратор

  • Administrator
  • Сообщений: 2162
Для каждого сотрудника нужно делать процедуру:
Sub Sotrudnik1()
    FIOname 1
End Sub

1 - это на конце имени закладки, например:
name_1
fio1_1

Посмотрите, как я назначил имена закладок "полей формы" в файле.

Макрос
Sub Sotrudnik1()
    FIOname 1
End Sub

Sub Sotrudnik2()
    FIOname 2
End Sub

Private Sub FIOname(index As Long)

    Dim sText As String, sResult1 As String, sResult2 As String
    Dim sArray() As String
   
    sText = GetFormfield(ActiveDocument.Bookmarks("name_" & index).Range).Result
    sArray = Split(sText)
    sResult1 = sArray(0) & " "
    sResult1 = sResult1 & Left(sArray(1), 1) & ". "
    sResult1 = sResult1 & Left(sArray(2), 1) & "."
    sResult2 = sArray(2) & " "
    sResult2 = sResult2 & sArray(1)
    GetFormfield(ActiveDocument.Bookmarks("fio1_" & index).Range).Result = sResult1
    GetFormfield(ActiveDocument.Bookmarks("fio2_" & index).Range).Result = sResult1
    GetFormfield(ActiveDocument.Bookmarks("full_" & index).Range).Result = sText
   
End Sub

Private Function GetFormfield(BmRange As Range) As FormField
    ' Получение доступа к "полю формы". По порядковому номеру
        ' не получается получить доступ, поэтому используется цикл.
    Dim FormField As FormField
    For Each FormField In BmRange.FormFields
        Set GetFormfield = FormField
        Exit For
    Next FormField
End Function

[вложение удалено администратором]

Irina18

  • Гость
Большое спасибо. Как всегда быстрый и толковый ответ. Ещё раз с вашим праздником.

Оффлайн Администратор

  • Administrator
  • Сообщений: 2162
Сейчас обратил внимание, что в моём макросе не используются данные из переменной "sResult2".

Irina18

  • Гость
Вроде бы все работает правильно. Или я что-то не увидела?

Оффлайн Администратор

  • Administrator
  • Сообщений: 2162
Да, работает правильно, просто переменная не используется. Тогда лучше удалите лишнее из кода, чтобы не было лишних вопросов.

Irina18

  • Гость
Вот это  sResult2 = sArray(2) & " "
    sResult2 = sResult2 & sArray(1)
я удалила.

Оффлайн Администратор

  • Administrator
  • Сообщений: 2162
И ещё создание переменной, это вверху, где Dim.

Irina18

  • Гость
И там удалила. Спасибо.