2015-01-14 8 views
0

다음 코드를 사용하여 도큐멘트의 도형 줄을 모두 선택하고 삭제합니다.word 2007 vba는 한 번에 모든 도형 줄을 지울 수 없습니다.

그것은 MS 워드 2003에서 잘 작동 (또한 2007 년에 열 때 2003을 사용하여 그린 선에 대한) 그러나 그것의 MS 워드에 그려진 선을 선택하지 2007

Sub line() 
Dim shp As Shape, intBoxNbr As Integer 

intNbrShapes = 0 
For Each shp In ActiveDocument.Shapes 
If shp.Type = msoLine Then 
intNbrShapes = intNbrShapes + 1 
ActiveWindow.ScrollIntoView Selection.Range, True 
shp.Select 
Selection.Delete 
'shp.Delete 
'(Selection.Delete is used in MSWord 2007 and shp.Delete used in MSWord 2003) 
End If 
Next shp 

End Sub 

내가 찾은 그 MSword 2007에서 그려진 선은 Autoshape ##이라는 이름을 가지고 있는데, 2003은 line ##을 가지고 있습니다. 문서에서 다른 자동 모양 (텍스트 상자 등)을 사용하므로 "if shp.Type = msoAutoShape Then"을 사용할 수 없습니다. MS 워드 2007을 사용하여 그려진 선을 선택하고 삭제하는 방법을 도와주십시오.

감사합니다.

코드를 지금 업데이트했습니다 ... 모든 행을 한꺼번에 제거하지 못했습니다. 매크로를 여러 번 실행하여 모두 제거해야합니다. 당신이 모음에서 항목을 제거 할 때

Sub Macro1() 
' 
' Macro1 Macro 
' 
Dim shp As Shape, i As Integer 

i = 0 
For Each shp In ActiveDocument.Shapes 
If shp.Type = msoAutoShape Then 
i = i + 1 
ActiveWindow.ScrollIntoView Selection.Range, True 
shp.Select 

If Selection.ShapeRange.Line.DashStyle = msoLineSolid Then 
Selection.Delete 
End If 

'shp.Delete 

End If 
Next shp 

End Sub 
+1

당신이 디버깅 할 무슨 짓을 작동? 'For Each shp' 문에 중단 점을 넣고 알려진 "줄"에 대한'shp.Type' 속성을 확인하십시오. 'msoLine' 타입이 아닐 수도 있습니다. 그러면 그 모양을 선택/삭제하는 것이 "실패"합니다. –

+0

좀 더 간단한 설명을 해줄 수 있습니까? – user2531449

+0

이러한 조건을 테스트하기 위해 2003 또는 2007을 사용할 수 없으며 2010 년 셰이프 기본 이름이 설명과 다릅니다 (대신 "직선 커넥터 1"등). 따라서 디버깅을하고 다양한 속성을 사용하여 가능한 것을 확인해야합니다. –

답변

1

, 위해이 작업을 수행 할 필요가있다. 이것은 콜렉션이 색인화되기 때문입니다. 다음 예제 모음을 고려 : 우리가 .Count 1에서 바로 반복하여 모든 항목을 삭제하려고 경우

Item# Name 
    1  David 
    2  Sergio 
    3  Beatrice 
    4  Eunice 

, 그것은 작동하지 않습니다

Sub foo() 
Dim coll As New Collection 
Dim i As Integer 

coll.Add 1, "David" 
coll.Add 2, "Sergio" 
coll.Add 3, "Beatrice" 
coll.Add 4, "Eunice" 

For i = 1 To coll.Count 
    coll.Remove (i) 
Next 

MsgBox coll.Count 

End Sub 

을 첫 번째 반복에서 I = 1 "David"는 두 번째 패스에서 i = 2를 제거하지만 아이템 1은 이전에 제거되었으므로 두 번째 인덱스는 이제 "Beatrice"이므로 "Sergio"는 건너 뜁니다. 그리고 세 번째 반복에서는 i = 3이지만 더 이상 컬렉션에 3 개의 항목이 없으므로 오류가 발생합니다! (첨자가 범위를 벗어남). 아직 오류가 발생하지 않았다면 가능합니다.

그래서,이 문제를 방지하려면 거꾸로 단계가 필요 :이 의미

For i = coll.Count to 1 Step -1 
    coll.Remove(i) 
Next 

당신이하는 For Each보다는 인덱스 반복을 사용해야하므로 코드에 맞게, 당신은 같은 시도 할 수 있습니다 :

For i = ActiveDocument.Shapes.Count to 1 Step - 1 
    Set shp = ActiveDocument.Shapes(i) 

    If shp.Type = msoAutoShape Then 

     ActiveWindow.ScrollIntoView Selection.Range, True 
     shp.Select 

     If Selection.ShapeRange.Line.DashStyle = msoLineSolid Then 
      Selection.Delete 
     End If 
    End If 
Next 
+0

"For Each i = ActiveDocument.Shapes.Count to 1 Step - 1"코드 행에 구문 오류가 발생합니다. – user2531449

+0

잘못 입력했습니다. 간단히 말하면 :'For i = ... ' –

+0

감사합니다. 하지만이 코드를 사용해 보셨습니까? 다른 오류가 발생했습니다. 다음 컨트롤 변수 참조 – user2531449

0

이 하나

Sub Macro2() 
' 
' Macro2 Macro 
' 
' 
    Dim shp As Shape, i As Integer 

i = 0 

For i = ActiveDocument.Shapes.Count To 1 Step -1 
    Set shp = ActiveDocument.Shapes(i) 

    If shp.Type = msoAutoShape Then 

     ActiveWindow.ScrollIntoView Selection.Range, True 
     shp.Select 

     If Selection.ShapeRange.Line.DashStyle = msoLineSolid Then 
      Selection.Delete 
     End If 
    End If 
Next 

End Sub