Всем удачного дня. Особенные поздравления программистам, с 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 навыков не имею, вот и обращаюсь на форум. Мой файл с макросом во вложении. Всем спасибо.
[вложение удалено администратором]
Для каждого сотрудника нужно делать процедуру:
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
[вложение удалено администратором]
Большое спасибо. Как всегда быстрый и толковый ответ. Ещё раз с вашим праздником.
Сейчас обратил внимание, что в моём макросе не используются данные из переменной "sResult2".
Вроде бы все работает правильно. Или я что-то не увидела?
Да, работает правильно, просто переменная не используется. Тогда лучше удалите лишнее из кода, чтобы не было лишних вопросов.
Вот это sResult2 = sArray(2) & " "
sResult2 = sResult2 & sArray(1)
я удалила.
И ещё создание переменной, это вверху, где Dim.
И там удалила. Спасибо.