Ваш внутренний 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