VBA - ContentControlOnEnter влияет на все мои элементы управления, а не только на указанный - PullRequest
0 голосов
/ 23 февраля 2019

Я создал заполненную форму для курсов.Я пытаюсь, чтобы дата окончания курса автоматически заполнялась в зависимости от выбранного курса и даты начала.

Вместо того, чтобы вызываться при входе в элемент управления «Endate», он запускается при входе во все элементы управления, который выдает повторяющиеся ошибки времени выполнения.Я бы хотел, чтобы поле заполнялось при нажатии, но это не вариант.

Private Sub Document_ContentControlOnEnter(ByVal Endate As ContentControl)

'Declare variable names to deal with the content control data
Dim SD As ContentControl
Dim TC As ContentControl
Dim TC1 As ContentControl
Dim ED As ContentControl
Dim NewDate

'Connect each variable name to its content control
Set TC = ActiveDocument.SelectContentControlsByTag("Training").Item(1)
Set SD = ActiveDocument.SelectContentControlsByTag("Stardate").Item(1)
Set ED = ActiveDocument.SelectContentControlsByTag("Endate").Item(1)
'For some reason, twice removed from the source works better
Set TC1 = TC

    If SD.Range.Text <> "Click to enter a date" Then
    NewDate = DateValue(SD.Range.Text)

'Look at Training Content Control - what was selected.
'If one of the two longer courses is picked, add 2 days to the start date
'and use that as the end date. Otherwise just add one day.
    Select Case TC1.Range.Text
        Case "Basic Skills"
            ED.Range.Text = Format((NewDate + 2), "MMM d, yyyy")
        Case "Caseworker"
            ED.Range.Text = Format((NewDate + 2), "MMM d, yyyy")
        Case Else
            ED.Range.Text = Format((NewDate + 1), "MMM d, yyyy")
    End Select
    End If

'Once we're done, re-set the variables for the next round. This does not change
'the content of the form.
    Set TC = Nothing
    Set SD = Nothing
    Set ED = Nothing

End Sub

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Причина, по которой вы видите описанное поведение

Вместо того, чтобы срабатывать при входе в элемент управления 'Endate', он срабатывает при входе во все элементы управления

из-зарешение Microsoft о разработке элементов управления содержанием, содержащихся в документе.Для каждого типа событий существует отдельное событие, которое будет активировано всеми элементами управления контентом.Это означает, что если код относится к одному или нескольким элементам управления содержимым, необходимо оценить элемент управления содержимым, запускающий событие, и разветвить код, как требуется.

Обратите внимание, что подпись события передает аргумент ByVal ContentControl As ContentControl.Это элемент управления контентом, который запускает событие.Поэтому присвоение этому аргументу имени конкретного элемента управления контентом не является оптимальным подходом - это может быть любой элемент управления контентом.

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

Private Sub Document_ContentControlOnEnter(ByVal cc As ContentControl)

'Declare variable names to deal with the content control data
Dim SD As ContentControl
Dim TC As ContentControl
Dim TC1 As ContentControl
Dim ED As ContentControl
Dim NewDate

If cc.Tag = "EndDate" Then
  'Connect each variable name to its content control
  Set TC = ActiveDocument.SelectContentControlsByTag("Training").Item(1)
  Set SD = ActiveDocument.SelectContentControlsByTag("Stardate").Item(1)
  Set ED = cc 
  'Do other things, here
End If
End Sub
0 голосов
/ 23 февраля 2019

На основании названия события я вижу, что всякий раз, когда вы вводите элемент управления, он передает элемент управления enddate в код.По сути, просто проверьте и посмотрите, имеет ли значение конечная дата, прежде чем продолжать и делать все остальное.

Private Sub Document_ContentControlOnEnter(ByVal Endate As ContentControl)
If len(Endate.Range.Text) > 0 then
    'Declare variable names to deal with the content control data
    Dim SD As ContentControl
    Dim TC As ContentControl
    Dim TC1 As ContentControl
    Dim ED As ContentControl
    Dim NewDate

    'Connect each variable name to its content control
    Set TC = ActiveDocument.SelectContentControlsByTag("Training").Item(1)
    Set SD = ActiveDocument.SelectContentControlsByTag("Stardate").Item(1)
    Set ED = ActiveDocument.SelectContentControlsByTag("Endate").Item(1)
    'For some reason, twice removed from the source works better
    Set TC1 = TC

        If SD.Range.Text <> "Click to enter a date" Then
        NewDate = DateValue(SD.Range.Text)

    'Look at Training Content Control - what was selected.
    'If one of the two longer courses is picked, add 2 days to the start date
    'and use that as the end date. Otherwise just add one day.
        Select Case TC1.Range.Text
            Case "Basic Skills"
                ED.Range.Text = Format((NewDate + 2), "MMM d, yyyy")
            Case "Caseworker"
                ED.Range.Text = Format((NewDate + 2), "MMM d, yyyy")
            Case Else
                ED.Range.Text = Format((NewDate + 1), "MMM d, yyyy")
        End Select
        End If

    'Once we're done, re-set the variables for the next round. This does not change
    'the content of the form.
        Set TC = Nothing
        Set SD = Nothing
        Set ED = Nothing
end if
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...