Как проверить, заполнены ли все текстовые поля в документе PowerPoint - PullRequest
1 голос
/ 01 апреля 2020

У меня есть документ PowerPoint, где пользователи могут вводить текст в несколько текстовых полей, всего более 6 слайдов. На последнем слайде Я хочу проверить, заполнил ли пользователь все текстовые поля в презентации .

Я попытался использовать множество фрагментов кода в inte rnet и изменить их, однако я полный нуб VBA и, что удивительно, это не сработало. : ') Буду очень признателен за помощь в выполнении этой задачи.

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

Вот мой код, он не показывает ошибок, однако при нажатии кнопки CheckBox в конце ничего не происходит.

Public Sub CheckTextBox()
    Dim fTextBox As Object
    For Each Slide In ActivePresentation.Slides
    For Each fTextBox In ActivePresentation.Slides
        If TypeName(fTextBox) = "TextBox" Then
            If fTextBox.Text = "" Then
                MsgBox "Please make sure to fill out all fields!"
            End If
        End If
    Next
    Next
End Sub


'When ticking this CheckBox, the MsgBox should show up

Private Sub CheckBox1_Click()
CheckTextBox
End Sub

Большое вам спасибо за помощь.

1 Ответ

1 голос
/ 01 апреля 2020

Ваш внутренний For -l oop неправильный, вам нужно l oop по всем Shapes слайдов, вместо этого вы начинаете еще один l oop по всем слайдам.

По сути, все объекты, которые вы помещаете на слайд, Shapes. Если вы используете TypeName, вы получите Shape. Чтобы различать guish отдельных типов фигур, используйте свойство type объекта-формы. Список типов можно найти по адресу https://docs.microsoft.com/de-de/office/vba/api/office.msoshapetype - текстовое поле имеет тип msoTextBox (17).

Чтобы получить текст формы, используйте свойство TextFrame.TextRange.Text формы.

Попробуйте следующий код (он уже проверяется на длину не менее 4 символов). Он остановится на первом текстовом поле, содержащем менее 4 символов (иначе вы получите один MsgBox для каждого текстового поля) и выделите его.

Public Sub CheckTextBox()
    Dim sh As Shape, slide As slide
    For Each slide In ActivePresentation.Slides
        For Each sh In slide.Shapes
            Debug.Print TypeName(sh)
            If sh.Type = msoTextBox Then
                If Len(sh.TextFrame.TextRange.Text) < 4 Then
                    MsgBox "Please make sure to fill out all fields!"
                    slide.Select
                    sh.Select
                    Exit For
                End If
            End If
        Next
    Next

End Sub

ОБНОВЛЕНИЕ Код выше не принимал во внимание формы в группах. Следующий код перебирает все формы всех слайдов и вызывает функцию checkShape, которая проверяет
a) Если форма представляет собой textBox (msoTextBox, 17) - если да, проверяется длина текста и, если он слишком короткий, возвращается эта форма.
b) Если фигура представляет собой группу (msoGroup, 6 ), она вызывает (рекурсивно) функцию для всех дочерних фигур и возвращает первое найденное дочернее текстовое поле.
Основная подпрограмма (CheckAllTextBoxes) проверяет, был ли найден какой-либо текстовый блок, и, если да, выберет его и выдаст сообщение.

Public Sub CheckAllTextBoxes()
    Dim slide As slide, sh As Shape
    For Each slide In ActivePresentation.Slides
        For Each sh In slide.Shapes

            Dim textBox As Shape
            Set textBox = CheckShape(sh, 4)
            If Not textBox Is Nothing Then
                slide.Select
                textBox.Select
                MsgBox "Please make sure to fill out all fields!"
                Exit Sub
            End If
        Next
    Next

End Sub

Function CheckShape(sh As Shape, minLen As Integer) As Shape

    ' Check if shape is a Textbox and then text is not long enough
    If sh.Type = msoTextBox Then
        If Len(sh.TextFrame.TextRange.Text) < minLen Then
            Set CheckShape = sh
            Exit Function
        End If
    End If

    ' For a group, check all it's child shapes
    If sh.Type = msoGroup Then
        Dim child As Shape
        For Each child In sh.GroupItems
            Dim textBox As Shape
            Set textBox = CheckShape(child, minLen)
            If Not textBox Is Nothing Then
                ' Found a Textbox within the group, return it
                Set CheckShape = textBox
                Exit Function
            End If
        Next child
    End If

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...