Spped of searching

M

Marcw

I have recently ported some VBA code that checks Word documents for
misspellings, incorrect terminology, etc. to PowerPoint and discovered
the limitations of the PPT object model compared to Word. I am looping
through the presentations by Slide, Shape, looking for TextFrames and
TextRanges, etc. for both slides and Notes and have found the entire
process to be extremely slow.

There are about 950 rules being processed. My test presentation is 19
slides with notes on just about each page and takes 10-12 minutes. In
Word checking a 54 page document took a little over 2 minutes. The
Notes checking appears to be taking the most time, but there is a lot
of text in these notes.

Are there any hints on speeding this up?

Here's the relevant code:

Private Function myFind(SlideNum As Integer, ShapeNumber As Integer,
ViewType As Integer) As Boolean

Set sld = Application.ActivePresentation.Slides(nSld)
If ActiveWindow.ViewType = ppViewNotesPage Then GoTo NotesPage
ActiveWindow.ViewType = ppViewSlide
' Loop through each shape on each slide.
For nShp = ShapeNumber To sld.Shapes.Count
Set shp = sld.Shapes(nShp)
If shp.HasTextFrame And shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
Set foundText = txtRng.Find(FindWhat:=sFrom,
MatchCase:=CaseSens, WholeWords:=IsAlpha(sFrom))
If Not (foundText Is Nothing) Then
If sTo <> "count" Then ScreenUpdating = True
ActiveWindow.View.GotoSlide index:=sld.SlideIndex
foundText.Select
myFind = True
ShapeType = Slide
If sTo = "count" Then
lcv = lcv + 1
Do While Not (foundText Is Nothing)
With foundText
Set foundText =
txtRng.Find(FindWhat:=sFrom, After:=.Start, _
MatchCase:=CaseSens,
WholeWords:=IsAlpha(sFrom))
If Not (foundText Is Nothing) Then
lcv = lcv + 1
End If
End With
Loop
Else
ScreenUpdating = True
Exit Function
End If
End If
End If
Next nShp
NotesPage:
If ActiveWindow.ViewType = ppViewSlide Then
ShapeNumber = 1
ActiveWindow.ViewType = ppViewNotesPage
End If
' Loop through each shape on each slide.
For nShp = ShapeNumber To sld.NotesPage.Shapes.Count
Set shp = sld.NotesPage.Shapes(nShp)
If shp.PlaceholderFormat.Type = ppPlaceholderBody Then
If shp.HasTextFrame And shp.TextFrame.HasText Then
Set txtRng = shp.TextFrame.TextRange
Set foundText = txtRng.Find(FindWhat:=sFrom,
MatchCase:=CaseSens, WholeWords:=IsAlpha(sFrom))
If Not (foundText Is Nothing) Then
If sTo <> "count" Then ScreenUpdating = True
ActiveWindow.View.GotoSlide
index:=sld.SlideIndex
foundText.Select
myFind = True
ShapeType = Note
If sTo = "count" Then
lcv = lcv + 1
Do While Not (foundText Is Nothing)
With foundText
Set foundText =
txtRng.Find(FindWhat:=sFrom, After:=.Start, _
MatchCase:=CaseSens,
WholeWords:=IsAlpha(sFrom))
If Not (foundText Is Nothing) Then
lcv = lcv + 1
End If
End With
Loop
Else
ScreenUpdating = True
Exit Function
End If
End If
End If
End If
Next nShp
ActiveWindow.ViewType = ppViewSlide
Next nSld




Thanks,

Marc Wiener
Gartner, Inc.
 
M

Marc Wiener

Hi Steve, things are well. Sorry about this double posting. I posted through
Google groups and for some reason did not seeing the post. After a day I
reposted and was able to see it, but now it has again disappeared. No clue
what's going on, but I've now resorted to using Outlook Express.

Anyway, I've changed my ints to longs. Thanks for that, I was lazy and
didn't look it up.

As to the selects, this is an interactive application. When we find an item
in our rules list, we need to present it to the Editor who decides whether
or not to make the change, skip the instance or skip the rule according to
our style guide, e.g., Cost Benefit Analysis should be Cost-Benefit
Analysis. As the find itself does not highlight the term, I used select (and
changed the view, etc.). Is there another way of getting the same result
without the detriment of selecting? I would much prefer not having to
select, obviously.

Thanks as always,

Marc
 
M

Marc Wiener

Thanks, but this is not a simple spell check, but a series of rules that
follow our style guide.

Marc
 
M

Marc Wiener

Steve,

No problem, I didn't think you were scolding. Anyway, you made me think
about this again and I made a one line change that improved efficiency
enormously. I moved the ActiveWindow.ViewType = ppViewNotesPage down in the
loop so it only gets called when a find is made. Run time is now greatly
imroved and makes this utility viable. I appreciate the prodding to make me
think :) I'm getting lazier in my old age.

Marc
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top