【发布时间】:2022-11-01 10:51:07
【问题描述】:
VBA 新手。我有一个包含 150 多张幻灯片的大型 PPT,并且我运行了一个 VBA 宏将它们(SlidesA ... SlidesF)标记为标签“分组”。我有一个带有一堆复选框的用户表单来选择用户想要保留的幻灯片分组。在选择了用户想要保留的分组后,他们单击“确定”按钮。我有一些代码(如下)来查找未选中的幻灯片并根据 Tags.Value 将其删除,并保留其余部分。但由于某种原因,它并没有删除所有幻灯片,它只是删除了 SlidesA 组中的 4 个。
Private Sub btnOK_Click()
' Slide.Tag has .Name and .Value parameters
If chkSlidesA = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesA" Then
s.Delete
End If
Next i
End With
Next
Else
If chkSlidesB = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesB" Then
s.Delete
End If
Next i
End With
Next
Else
If chkSlidesC = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesC" Then
s.Delete
End If
Next i
End With
Next
Else
If chkSlidesD = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesD" Then
s.Delete
End If
Next i
End With
Next
Else
If chkSlidesE = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesE" Then
s.Delete
End If
Next i
End With
Next
Else
If chkSlidesF = False Then
For Each s In Application.ActivePresentation.Slides
With s.Tags
For i = 1 To .Count
If .Value(i) = "SlidesF" Then
s.Delete
End If
Next i
End With
Next
Else
End If
End If
End If
End If
End If
End If
Unload Me
End Sub
我已经通过运行一些 VBA 来读取标签并显示一个 MsgBox 来显示标签值,从而验证了幻灯片是否标记有正确的值。
我试图理解为什么它没有删除所有幻灯片。
【问题讨论】:
-
尝试颠倒幻灯片遍历/删除的顺序
-
从集合中删除项目时,您犯了经典的新手错误。当您删除第 2 项时,第 3 项自动变为第 2 项。但 VBA 管理的控件变量不知道这一点并递增到 3,但第 3 项现在是第 4 项,因此您跳过了一项。您可以安全地从集合中删除的唯一方法是反向迭代集合。这意味着您不能执行 For Each,您必须使用 Count -1 到 1 执行 for Next。
-
是的,我最初的想法是删除部分,我注意到它正在执行整个“3 变为 2”,并且在迭代时删除了错误的部分 ID……我没有想到它正在这样做这里也是。谢谢!
标签: vba powerpoint