Power Point 宏:运行 时间错误 9
Power Point Macro: Run time error 9
此代码用于查找和替换文本列表以进行质量检查
sub FindAndReplace()
Dim Pres As Presentation
Dim sld As Slide
Dim shp As Shape
For Each Pres In Application.Presentations
For Each sld In Pres.Slides
For Each shp In sld.Shapes
Call checklist(shp)
Next shp
Next sld
Next Pres
MsgBox "Completed Succesfully!"
End Sub
Sub checklist(shp As Object)
Dim txtRng As TextRange
Dim rngFound As TextRange
Dim I, K, X As Long
Dim iRows As Integer
Dim iCols As Integer
Dim TargetList, DestinationList
TargetList = Array(" ", " ", " ", " ", " ", " ", " ", " / ", "i.e. ", "e.g. ", "/ ", " /", " :", " ;", " .", " ,", " - ", "resume", "a.m.", "p.m.", ":00")
DestinationList = Array(" ", " ", " ", " ", " ", " ", " ", "/", "i.e., ", "e.g., ", "/", "/", ":", ";", ".", ",", " – ", "résumé", "am", "")
With shp
If shp.HasTable Then
For iRows = 1 To shp.Table.Rows.Count
For iCols = 1 To shp.Table.Rows(iRows).Cells.Count
Set txtRng = shp.Table.Rows(iRows).Cells(iCols).Shape.TextFrame.TextRange
For I = 0 To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
Next
Next
End If
End With
Select Case shp.Type
Case msoGroup
For X = 1 To shp.GroupItems.Count
Call checklist(shp.GroupItems(X))
Next X
Case 21
For X = 1 To shp.Diagram.Nodes.Count
Call checklist(shp.GroupItems(X))
Next X
Case Else
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
For I = 0 To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
End If
End If
End Select
End Sub
我收到此代码的 运行 时间 9 错误。
此外,此代码仅替换某些单词的第一次出现,例如 "i.e." 和 "e.g:,但我想替换所有出现的单词。
错误的原因是您正在尝试引用 DestinationList 数组中的第 21 项,但它不存在,因为您缺少 "p.m." 的相应参数我为此添加了错误检查,已更正I、K、X 的 Dim 行,并在循环数组时将 0 更改为 LBound,因为如果基数不为 0,那也会导致问题。更正后的代码:
Option Explicit
Private ArrayError As Boolean
Sub FindAndReplace()
Dim Pres As Presentation
Dim sld As Slide
Dim shp As Shape
ArrayError = False
For Each Pres In Application.Presentations
For Each sld In Pres.Slides
For Each shp In sld.Shapes
If Not ArrayError Then checklist shp
Next shp
Next sld
Next Pres
If Not ArrayError Then MsgBox "Completed Succesfully!"
End Sub
Sub checklist(shp As Object)
Dim txtRng As TextRange
Dim rngFound As TextRange
Dim I As Long, K As Long, X As Long
Dim iRows As Integer
Dim iCols As Integer
Dim TargetList, DestinationList
TargetList = Array(" ", " ", " ", " ", " ", " ", " ", " / ", "i.e. ", "e.g. ", "/ ", " /", " :", " ;", " .", " ,", " - ", "resume", "a.m.", "p.m.", ":00")
DestinationList = Array(" ", " ", " ", " ", " ", " ", " ", "/", "i.e., ", "e.g., ", "/", "/", ":", ";", ".", ",", " ? ", "résumé", "am", "pm", "")
If Not UBound(TargetList) = UBound(DestinationList) Then
MsgBox "Search and Replace arrary do not have the same number of arguments.", vbCritical + vbOKOnly, "Arrays Don't Match"
ArrayError = True
Exit Sub
End If
With shp
If shp.HasTable Then
For iRows = 1 To shp.Table.Rows.Count
For iCols = 1 To shp.Table.Rows(iRows).Cells.Count
Set txtRng = shp.Table.Rows(iRows).Cells(iCols).Shape.TextFrame.TextRange
For I = LBound(TargetList) To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
Next
Next
End If
End With
Select Case shp.Type
Case msoGroup
For X = 1 To shp.GroupItems.Count
Call checklist(shp.GroupItems(X))
Next X
Case 21
For X = 1 To shp.Diagram.Nodes.Count
Call checklist(shp.GroupItems(X))
Next X
Case Else
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
For I = LBound(TargetList) To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
End If
End If
End Select
End Sub
此代码用于查找和替换文本列表以进行质量检查
sub FindAndReplace()
Dim Pres As Presentation
Dim sld As Slide
Dim shp As Shape
For Each Pres In Application.Presentations
For Each sld In Pres.Slides
For Each shp In sld.Shapes
Call checklist(shp)
Next shp
Next sld
Next Pres
MsgBox "Completed Succesfully!"
End Sub
Sub checklist(shp As Object)
Dim txtRng As TextRange
Dim rngFound As TextRange
Dim I, K, X As Long
Dim iRows As Integer
Dim iCols As Integer
Dim TargetList, DestinationList
TargetList = Array(" ", " ", " ", " ", " ", " ", " ", " / ", "i.e. ", "e.g. ", "/ ", " /", " :", " ;", " .", " ,", " - ", "resume", "a.m.", "p.m.", ":00")
DestinationList = Array(" ", " ", " ", " ", " ", " ", " ", "/", "i.e., ", "e.g., ", "/", "/", ":", ";", ".", ",", " – ", "résumé", "am", "")
With shp
If shp.HasTable Then
For iRows = 1 To shp.Table.Rows.Count
For iCols = 1 To shp.Table.Rows(iRows).Cells.Count
Set txtRng = shp.Table.Rows(iRows).Cells(iCols).Shape.TextFrame.TextRange
For I = 0 To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
Next
Next
End If
End With
Select Case shp.Type
Case msoGroup
For X = 1 To shp.GroupItems.Count
Call checklist(shp.GroupItems(X))
Next X
Case 21
For X = 1 To shp.Diagram.Nodes.Count
Call checklist(shp.GroupItems(X))
Next X
Case Else
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
For I = 0 To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
End If
End If
End Select
End Sub
我收到此代码的 运行 时间 9 错误。
此外,此代码仅替换某些单词的第一次出现,例如 "i.e." 和 "e.g:,但我想替换所有出现的单词。
错误的原因是您正在尝试引用 DestinationList 数组中的第 21 项,但它不存在,因为您缺少 "p.m." 的相应参数我为此添加了错误检查,已更正I、K、X 的 Dim 行,并在循环数组时将 0 更改为 LBound,因为如果基数不为 0,那也会导致问题。更正后的代码:
Option Explicit
Private ArrayError As Boolean
Sub FindAndReplace()
Dim Pres As Presentation
Dim sld As Slide
Dim shp As Shape
ArrayError = False
For Each Pres In Application.Presentations
For Each sld In Pres.Slides
For Each shp In sld.Shapes
If Not ArrayError Then checklist shp
Next shp
Next sld
Next Pres
If Not ArrayError Then MsgBox "Completed Succesfully!"
End Sub
Sub checklist(shp As Object)
Dim txtRng As TextRange
Dim rngFound As TextRange
Dim I As Long, K As Long, X As Long
Dim iRows As Integer
Dim iCols As Integer
Dim TargetList, DestinationList
TargetList = Array(" ", " ", " ", " ", " ", " ", " ", " / ", "i.e. ", "e.g. ", "/ ", " /", " :", " ;", " .", " ,", " - ", "resume", "a.m.", "p.m.", ":00")
DestinationList = Array(" ", " ", " ", " ", " ", " ", " ", "/", "i.e., ", "e.g., ", "/", "/", ":", ";", ".", ",", " ? ", "résumé", "am", "pm", "")
If Not UBound(TargetList) = UBound(DestinationList) Then
MsgBox "Search and Replace arrary do not have the same number of arguments.", vbCritical + vbOKOnly, "Arrays Don't Match"
ArrayError = True
Exit Sub
End If
With shp
If shp.HasTable Then
For iRows = 1 To shp.Table.Rows.Count
For iCols = 1 To shp.Table.Rows(iRows).Cells.Count
Set txtRng = shp.Table.Rows(iRows).Cells(iCols).Shape.TextFrame.TextRange
For I = LBound(TargetList) To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
Next
Next
End If
End With
Select Case shp.Type
Case msoGroup
For X = 1 To shp.GroupItems.Count
Call checklist(shp.GroupItems(X))
Next X
Case 21
For X = 1 To shp.Diagram.Nodes.Count
Call checklist(shp.GroupItems(X))
Next X
Case Else
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
For I = LBound(TargetList) To UBound(TargetList)
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I))
Do While Not rngFound Is Nothing
Set rngFound = txtRng.Replace(TargetList(I), DestinationList(I), After:=rngFound.Start + rngFound.Length, wholewords:=True)
Loop
Next
End If
End If
End Select
End Sub