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.
 
S

Steve Rindsberg

Marcw said:
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:

Hi Marc, how's it going. Apart from this, that is? <g>
Now as to this:

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

Internally, all of these things are VB/VBA Longs, not Integers.
Treating them as integers will work, but will be marginally slower and may rear
back and bite you some day in a later version. Better to use Longs instead.

Set sld = Application.ActivePresentation.Slides(nSld)
If ActiveWindow.ViewType = ppViewNotesPage Then GoTo NotesPage
ActiveWindow.ViewType = ppViewSlide

No need to change the view or go to slide if you're not going to use .Select,
and as noted below, don't use .Select

That alone should speed things up hugely.

' 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

Avoid .Select like the plague.
Declare an object variable of the appropriate type and set a reference to it
instead, then use the variable instead of the selection.

You've already done that (foundText). Why Select it?

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

Same deal here. Don't select, don't change view, don't go to slide
 
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
 
S

Steve Rindsberg

Hi Steve, things are well. Sorry about this double posting.

No problem. I wasn't scolding, just too lazy to look my other answer and post
again. said:
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

OK. That falls into the "when you have to" side of "unless you have to".

You pretty much have to show them the context of the text in order for them to
make an informed decision.

But what about going to the slide in slide view then displaying the text on a
user form instead? In several text boxes, perhaps?

- All of the text from the shape in question (inactive so it can't be edited)

- The specific offending text the rule's called on the carpet (editable,
perhaps?)

- Proposed change to the text

- Buttons for Accept, Reject, etc


Another possibility is to lose the built in text finder and try replacing it
with your own (look at each shape, test to see if it has a text frame, if the
text frame has text, etc, then use Instr to see if your search text is present
in the shape's text.

, e.g., Cost Benefit Analysis should be Cost-Benefit
 
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
 
S

Steve Rindsberg

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.

Heh! I know *that* feeling. Coffee doesn't do it in the AM any more. Herself
has to get out the electrodes. ZZZZZZZI'M UP I'M UP!
 

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

Similar Threads


Top