1

Тема: синхронизация пунктов двух раскрывающихся списков

Подскажите код макроса, чтобы сделать следующее:

В документе Word 2007 есть элемент управления содержимым называемый "Исполнитель" в виде раскрывающегося списка вида "Иванов, Петров, Сидоров". Далее в документе есть другой элемент управления содержимым "Код исполнителя" (тоже в виде раскрывающегося списка), где каждой указанной выше фамилии соответствует числовой код, типа "1001, 1002, 1003".

Как сделать, чтобы при выборе фамилии в одном элементе, в другом элементе управления содержимым автоматически подставлялся нужный числовой код?

Файл с примерами списков прилагается. Заранее спасибо.

Post's attachments

example_forum.docx 17.38 Кб, 47 скачиваний с 2011-04-25 

You don't have the permssions to download the attachments of this post.

2

Re: синхронизация пунктов двух раскрывающихся списков

вот какой код для решения подсказали (может пригодится кому-то):

макрос

Sub SyncContentControlByValue(Src As ContentControl, Dest As ContentControl)
 
Dim SrcT As String
Dim SrcV As String
Dim ccLE As ContentControlListEntry
 
SrcT = Src.Range.Text
 
For i = 1 To Src.DropdownListEntries.Count
    If SrcT = Src.DropdownListEntries.Item(i).Text Then
         
        SrcV = Src.DropdownListEntries.Item(i).Value
         
        For k = 1 To Dest.DropdownListEntries.Count
            If Dest.DropdownListEntries.Item(k).Value = SrcV Then
                Dest.DropdownListEntries.Item(k).Select
                Exit Sub
            End If
        Next
         
        ' Если не найден выбираем первый
        Dest.DropdownListEntries.Item(1).Select
    End If
Next
 
End Sub 

процедура его запускающая по выходу из "Исполнителя"

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    Dim ccI As ContentControl
    Dim ccK As ContentControl
     
    Set ccI = ActiveDocument.SelectContentControlsByTag("исполнитель").Item(1)
    Set ccK = ActiveDocument.SelectContentControlsByTag("код исполнителя").Item(1)
     
    Select Case ContentControl.Tag
    Case "исполнитель":
        SyncContentControlByValue ccI, ccK
    Case "код исполнителя":
        SyncContentControlByValue ccK, ccI
    End Select
End Sub 

3

Re: синхронизация пунктов двух раскрывающихся списков

код работает для двух списков, может кто его модифицировать для 3 и более списков?

4

Re: синхронизация пунктов двух раскрывающихся списков

опять возникла такая потребность, например при выборе  из выпадающего списка третьей строки, в остальных выпадающих списках автоматически выбиралась тоже третья строка.

5

Re: синхронизация пунктов двух раскрывающихся списков

Для любого количества списков.

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    Dim ccI As ContentControl 'переменная цикла перебора элементов управления
    Dim ccS As ContentControl 'Генератор события
    Dim sControlText As String 'Текст, выбранный в генераторе события
    Dim i As Integer
    
    Set ccS = ContentControl
    sControlText = ccS.Range.Text
    
    For Each ccI In ActiveDocument.ContentControls
        If ccI.Type = wdContentControlDropdownList Then 'Отсеиваем не списки
            If ccI.ID <> ContentControl.ID Then 'Отсеиваем генератор события
                'Цикл ищет индекс выбранного элемента списка
                For i = 1 To ccS.DropdownListEntries.Count
                    If sControlText = ccS.DropdownListEntries.Item(i).Text Then
                        'Выбираем соответсвующий пункт в других списках
                        ccI.DropdownListEntries.Item(i).Select
                    End If
                Next
            End If
        End If
    Next
End Sub
Лучше день потерять — потом за пять минут долететь!

6

Re: синхронизация пунктов двух раскрывающихся списков

это добавить в процедуры? а макрос из поста №2?

7

Re: синхронизация пунктов двух раскрывающихся списков

Это процедура, срабатывающая при выходе  из контрола. Макросы из второго поста можно убрать, моя процедура их полностью заменяет

Лучше день потерять — потом за пять минут долететь!

8

Re: синхронизация пунктов двух раскрывающихся списков

может у меня в документе что-то не так, но не работает как надо - При выборе например третьего значения в первом списке, автоматически выбираются третьи значения в остальных списках

Post's attachments

test.docm 31.64 Кб, 28 скачиваний с 2012-11-15 

You don't have the permssions to download the attachments of this post.

9

Re: синхронизация пунктов двух раскрывающихся списков

А надо было что?

Лучше день потерять — потом за пять минут долететь!

10

Re: синхронизация пунктов двух раскрывающихся списков

Всё, разобрался. Немного модифицировал, что бы не только в "Поле со списком" а и в "раскрывающийся список" менял значения.

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    Dim ccI As ContentControl 'переменная цикла перебора элементов управления
    Dim ccS As ContentControl 'Генератор события
    Dim sControlText As String 'Текст, выбранный в генераторе события
    Dim i As Integer
    
    Set ccS = ContentControl
    sControlText = ccS.Range.Text
    
    For Each ccI In ActiveDocument.ContentControls
        'If ccI.Type = wdContentControlDropdownList Then 'Отсеиваем не списки
            If ccI.ID <> ContentControl.ID Then 'Отсеиваем генератор события
                'Цикл ищет индекс выбранного элемента списка
                For i = 1 To ccS.DropdownListEntries.Count
                    If sControlText = ccS.DropdownListEntries.Item(i).Text Then
                        'Выбираем соответсвующий пункт в других списках
                        ccI.DropdownListEntries.Item(i).Select
                    End If
                Next
            End If
        'End If
    Next
End Sub

11

Re: синхронизация пунктов двух раскрывающихся списков

Смотрел смотрел, но так и не понял как запустить вышеуказанный макрос. Наверное руки не от туда растут.