Solved

How do you programmatically delete ALL images from a word doc using VBA?

Posted on 2009-07-10
13
699 Views
Last Modified: 2012-06-27
I would like to remove all images from a document programmatically.  I'm using Microsoft Office 2003 and the word 11.0 object library.
I've seen this question answered elsewhere with the following script :

    Dim objPic As InlineShape
    For Each objPic In word_doc.InlineShapes
        objPic.Delete
    Next objPic

Whilst there are circumstances where this code removes some of the images, there are plenty of occasions where it does not.  I have a document with a header/footer containing images, these were for example unaffacted.
Is there an enhancement to this code that would literally clean ALL images, wherever they may be.  I am not concerned with how the layout of the document might be adversely affected.
thanks!
0
Comment
Question by:dgloveruk
  • 4
  • 3
  • 3
13 Comments
 
LVL 37

Expert Comment

by:Joanne M. Orzech
Comment Utility
Try this macro from (I tested it and it worked for headers and footers too)
http://www.word.mvps.org/FAQs/MacrosVBA/FindReplaceAllWithVBA.htm
Sub FasterFindAndReplaceAllStoriesHopefully()

 

Dim myStoryRange As Range

 

'First search the main document using the Selection

 With Selection.Find

    .Text = "^g"

    .Replacement.Text = ""

    .Forward = True

    .Wrap = wdFindContinue

    .Format = False

    .MatchCase = False

    .MatchWholeWord = False

    .MatchWildcards = False

    .MatchSoundsLike = False

    .MatchAllWordForms = False

    .Execute Replace:=wdReplaceAll

 End With

 

'Now search all other stories using Ranges

For Each myStoryRange In ActiveDocument.StoryRanges

   If myStoryRange.StoryType <> wdMainTextStory Then

        With myStoryRange.Find

            .Text = "^g"

            .Replacement.Text = ""

            .Wrap = wdFindContinue

            .Execute Replace:=wdReplaceAll

        End With

        Do While Not (myStoryRange.NextStoryRange Is Nothing)

           Set myStoryRange = myStoryRange.NextStoryRange

            With myStoryRange.Find

                .Text = "^g"

                .Replacement.Text = ""

                .Wrap = wdFindContinue

                .Execute Replace:=wdReplaceAll

            End With

        Loop

    End If

Next myStoryRange

End Sub

Open in new window

0
 

Author Comment

by:dgloveruk
Comment Utility
I'm afraid this did not remove the image from the file.
I've attached a sample document so you can see the code not working / more easily find a working solution.
Ali-F-133101.doc
0
 
LVL 37

Expert Comment

by:Joanne M. Orzech
Comment Utility
Oh - I see - I believe it's not working properly because the image is set to "square" wrapping... let me see if I can figure something out.
0
 
LVL 37

Expert Comment

by:Joanne M. Orzech
Comment Utility
I'm not having much luck.... hoping another expert can help you with this.
0
 
LVL 18

Expert Comment

by:JR2003
Comment Utility
This works in Word 2007
Option Explicit

Sub DeletePictures()

    

    Dim myShape As InlineShape

    Dim myRange As Range

    For Each myRange In ActiveDocument.StoryRanges

        For Each myShape In myRange.InlineShapes

            myShape.Delete

        Next myShape

    Next myRange
 

End Sub

Open in new window

0
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 
LVL 18

Expert Comment

by:JR2003
Comment Utility
I just tried it on you attached document and it didn't work, so I've modified it:
Option Explicit

Sub DeletePictures()

    

    Dim myInlineShape As InlineShape

    Dim myHeaderFooter As HeaderFooter

    Dim mySection As Section

    Dim myShape As Shape

    Dim myRange As Range

    

    For Each myRange In ActiveDocument.StoryRanges

        For Each myInlineShape In myRange.InlineShapes

            myInlineShape.Delete

        Next myInlineShape

    Next myRange

    

    For Each mySection In ActiveDocument.Sections

        For Each myHeaderFooter In mySection.Headers

            For Each myShape In myHeaderFooter.Shapes

                myShape.Delete

            Next myShape

        Next myHeaderFooter

        For Each myHeaderFooter In mySection.Headers

            For Each myShape In myHeaderFooter.Shapes

                myShape.Delete

            Next myShape

        Next myHeaderFooter

    Next mySection

End Sub

Open in new window

0
 
LVL 18

Accepted Solution

by:
JR2003 earned 500 total points
Comment Utility
second myHeaderFooter loop for should have been footers:
Option Explicit

Sub DeletePictures()

    

    Dim myInlineShape As InlineShape

    Dim myHeaderFooter As HeaderFooter

    Dim mySection As Section

    Dim myShape As Shape

    Dim myRange As Range

    

    For Each myRange In ActiveDocument.StoryRanges

        For Each myInlineShape In myRange.InlineShapes

            myInlineShape.Delete

        Next myInlineShape

    Next myRange

    

    For Each mySection In ActiveDocument.Sections

        For Each myHeaderFooter In mySection.Headers

            For Each myShape In myHeaderFooter.Shapes

                myShape.Delete

            Next myShape

        Next myHeaderFooter

        For Each myHeaderFooter In mySection.Footers

            For Each myShape In myHeaderFooter.Shapes

                myShape.Delete

            Next myShape

        Next myHeaderFooter

    Next mySection

End Sub

Open in new window

0
 

Author Comment

by:dgloveruk
Comment Utility
Thank you for your sugggestion,
The shape object doesn't seem to have a .delete method... is this code that would work in word 2003 with the document object model 11?
0
 
LVL 18

Expert Comment

by:JR2003
Comment Utility
I've just tried it as a macro from Word 2003 (11.8202.8202) SP3 and it worked.
How are you running it?
0
 

Author Closing Comment

by:dgloveruk
Comment Utility
Your follow up question abtou what I was using led me to the cause of the last hickup.  I was using VB6 and the object types you had declared were object types used by other references and I needed to dimension the variables as word.shape not just shape to get the methods needed.
Thank you for your help, I've been stuck on this one a while!
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Shortcuts in Word Just the other day I had a training for Microsoft and they wanted me to show how well the new Windows and Office behaved on a touch device, which by the way is great, but it was only then that I realized that using keyboard shortc…
Using Word 2013, I was experiencing some incredible lag when typing.  Here's what worked for me....
Office 365 is currently available in five editions. Three of them are for business use: Office 365 Business Essentials, Office 365 Business, and Office 365 Business Premium. Two of them are for home/personal use: Office 365 Home and Office 365 Perso…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now