2016-10-21 9 views
0

매우 긴 ppt 프레젠테이션 (약 850 슬라이드)이 있고 두 번째 절반에는 삭제할 특정 텍스트가있는 모양이 가득합니다. . 슬프게도, 그것은 슬라이드 마스터와 아무런 관련이없는 것처럼 보입니다. 그래서 그것을 사용할 수 없습니다. VBA Powerpoint : 특정 텍스트가있는 도형을 삭제합니다. 런타임 오류 '-2147024809 (80070057)': 지정한 값이 범위를 벗어났습니다.

내가 오류가있어 :

Run-time error '-2147024809 (80070057)': 
The specified value is out of range 

여기 코드의를,이 코드는 오류를 발생 수있는 몇 가지 이유가 있습니다 순간

Sub DeleteShapeWithSpecTxt() 


Dim oSl As Slides, oSh As Shapes, oTr As TextRange 
Dim str As String 
Dim testcomp1, testcomp2 
Dim lppt, ShapeNb, k, j As Long 
Dim pptAct 
Set pptAct = PowerPoint.ActivePresentation 


str = pptAct.Slides(335).Shapes(4).TextFrame.TextRange.Text 
lppt = pptAct.Slides.Count 




For k = 1 To lppt 
    ShapeNb = pptAct.Slides(k).Shapes.Count 
    For j = 1 To ShapeNb 
     If pptAct.Slides(k).Shapes(j).HasTextFrame And StrComp(str, pptAct.Slides(k).Shapes(j).TextFrame.TextRange.Text) = 0 Then 
      pptAct.Slides(k).Shapes(j).Delete 
     End If 
    Next 
Next 

최종 하위

답변

0

에서 얻었다. 첫째, 슬라이드 335 또는 모양 4가 존재하지 않는 경우 (해당 숫자를 동적으로 만들거나 오류를 처리하려고 시도하십시오). 다음으로 If 행은 두 부분을 평가하므로 셰이프에 TextFrame이 없으면 VBA는 두 번째 부분을 평가하여 오류를 발생시킵니다. 마지막으로 개체를 삭제할 수있는 개체 컬렉션에서 거꾸로 계산해야합니다. 또한 각 다음 구조를 위해를 사용하여이를 단순화하고 선택적으로 기본 코드에서 절차에 검색 텍스트를 전달할 수 :

Sub DeleteShapeWithSpecTxt(Optional sSearch As String) 
    Dim oSld As Slide 
    Dim oShp As Shape 
    Dim lShp As Long 

    On Error GoTo errorhandler 
    If sSearch = "" Then sSearch = ActivePresentation.Slides(335).Shapes(4).TextFrame.TextRange.Text 

    For Each oSld In ActivePresentation.Slides 
    ' I would usually use the next line to loop through all shapes on the slide but can't in this case as shapes may be deleted 
    'For Each oShp In oSld.Shapes 
    For lShp = oSld.Shapes.Count To 1 Step -1 
     With oSld.Shapes(lShp) 
     If .HasTextFrame Then 
      If StrComp(sSearch, .TextFrame.TextRange.Text) = 0 Then .Delete 
     End If 
     End With 
    Next 
    Next 
Exit Sub 
errorhandler: 
    Debug.Print "Error in DeleteShapeWithSpecTxt : " & Err & ": " & Err.Description 
    On Error GoTo 0 
End Sub 

당신이 검색 텍스트를 동적으로 만들려면,이 좋은 간단한 방법입니다. 그냥 교체 만약 sSearch = ""... 이와 라인 :

If sSearch = "" Then sSearch = InputBox("Enter test to search for and all shapes matching the text will be deleted across this presentation:","Delete Matching Shapes","test") 
0

@JamieG 내가 같은 솔루션 (코드로하지만 같은 깔끔한되지 않음)를 발견, 감사합니다. 더 정밀 : 내가봤을 때 나는 당신의 대답

편집

건배를 게시 할 예정 된 문자열의 동적 설정 (VBA의 내 지식은 매우 고급 없습니다) 가지 어려웠다. 그런 이유로 특정 슬라이드/도형에서 텍스트를 선택하는 것이 훨씬 쉬웠습니다. IF에 대한 의견은 삭제 시점에 거꾸로 계산할 때뿐이었습니다.

+0

차가워졌습니다. 매크로가 실행될 때 사용자로부터 검색 문자열을 가져올 수있는 가능성을 포함하도록 답변을 업데이트했습니다. 답변이 도움이된다면, 그것을 자유롭게 투표하십시오 :-) –

+0

사랑 하겠지만, 저는 15over 평판이 필요합니다. 나는 stackoverflow를 처음 접하는 이래로 가지고 있지 않습니다 ... –