Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Word / Programming / July 2007

Tip: Looking for answers? Try searching our database.

Finding shapes

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Fuzzhead - 12 Jul 2007 22:06 GMT
I have the following macro that creates vertical lines and then names each
one. How would I write a macro that would let me scroll down thru my
documents at a later date and find each one, look at it and then ask me to go
to the next one?

Dim lineNew As Shape
Dim i, j
On Error GoTo Endthis
i = Selection.Information(wdVerticalPositionRelativeToPage)
j = InchesToPoints(InputBox("BAR LENGTH {In Inches}:"))
Set lineNew = ActiveDocument.Shapes.AddLine(562, i, 562, j + i)
   lineNew.Name = "vline" & idx
   idx = idx + 1
Endthis:
periodic - 13 Jul 2007 00:02 GMT
I recently wrote the following macro to check some shapes in a document

Public Function checkShapes() As Boolean
   Selection.HomeKey unit:=wdStory, Extend:=wdMove

   Dim picPos As Long
   Dim oldPos As Long
   
   checkShapes = False
   
   Dim elm As Shape
   Dim elm2 As InlineShape
   
   For Each elm In ActiveDocument.Shapes
       MsgBox prompt:="invalidShape! All shapes must be inline shapes"
       
'next two lines to make word jump here in the document
       Selection.Start = elm.Anchor.Start
       Selection.EndKey unit:=wdLine, Extend:=wdExtend
       Exit Function
   Next elm

   For Each elm2 In ActiveDocument.InlineShapes
       Selection.Start = elm2.Range.Start
       Selection.MoveRight unit:=wdCharacter, Extend:=wdExtend
       
       If Not Selection.Style = "Picture" Then
           If InStr(1, elm2.Field.Code.Text, "Equation", vbTextCompare) <>
0 Then
               If Not Selection.Style = "Caption EQ" Then
                   MsgBox "Equation has the wrong style, fix this!"
                   Exit Function
               End If
           Else
               MsgBox "Picture has the wrong style, fix this!"
               Exit Function
           End If
       End If
       
       
       Dim pageWidth As Long
       Dim leftMargin As Long
       Dim rightMargin As Long
       
       pageWidth = ActiveDocument.PageSetup.pageWidth
       leftMargin = ActiveDocument.PageSetup.leftMargin
       rightMargin = ActiveDocument.PageSetup.rightMargin
       
       Dim textWidth As Long
       
       textWidth = pageWidth - leftMargin - rightMargin
       
       If elm2.Width >= textWidth Then
           MsgBox prompt:="picture is too wide, fix this!"
           Exit Function
       End If
       
   Next elm2
   
   checkShapes = True
   
End Function

Anyway the way I found you made word jump to a shape was by marking it.
Therefore the:
Selection.EndKey unit:=wdLine, Extend:=wdExtend

Then I guess you could just use a MsgBox to say go to the next with a yes
and no button. I wrote this in a macro recently

           msgBoxRet = MsgBox(prompt:=msgString, buttons:=vbYesNoCancel)
               
           If msgBoxRet = vbYes Then
               Selection.Delete unit:=wdCharacter, count:=1
               Selection.Collapse direction:=wdStart
               Selection.InsertCrossReference      
                                             
referenceType:=wdRefTypeNumberedItem, _
                                             
referenceKind:=wdNumberRelativeContext, _
                                              referenceItem:=refNum, _
                                              insertAsHyperlink:=True, _
                                              includePosition:=False, _
                                              SeparateNumbers:=False, _
                                              SeparatorString:=" "
           ElseIf msgBoxRet = vbCancel Then
               Exit Sub
           End If

Hope its to some help
Fuzzhead - 13 Jul 2007 21:26 GMT
periodic,

What you have is over my head. I am not sure how to use what you gave me.

fuzzhead

> I recently wrote the following macro to check some shapes in a document
>
[quoted text clipped - 86 lines]
>
> Hope its to some help
periodic - 14 Jul 2007 19:02 GMT
Ok

Had some more tome to check into this now.

First of all you original code wont work. It must look something like this

Sub insertLine()

   Dim lineNew As Shape
   Dim i As Long
   Dim j As Long
   Dim idx As Long
   idx = ActiveDocument.Variables("idx") + 1
   i = Selection.Information(wdVerticalPositionRelativeToPage)
   j = InchesToPoints(1)
   ActiveDocument.Shapes.AddLine(562, i, 562, j + i).Name = "vline" & idx
   ActiveDocument.Variables("idx") = idx
End Sub

So you keep the line numbering variable between the runs of the macro.

Next is the find it macro

Sub findIt()

   Selection.HomeKey unit:=wdStory, Extend:=wdMove

   Dim elm As Shape

   For Each elm In ActiveDocument.Shapes
      'Use inStr to check that the shape is a line we added.
       If InStr(1, elm.Name, "vline", vbTextCompare) Then
           Selection.Collapse direction:=wdCollapseStart
           gotoRange rng:=elm.Anchor
           elm.Select
           MsgBox prompt:="See next"
       End If
   Next elm
End Sub

Then we need to jump to a range in the document. I have not figured a good
way to do this. I consider this a hack. Anyway someone else might have a
better way to jump to a selected object.

Sub gotoRange(rng As Range)
   Selection.Range = rng
   Selection.Collapse direction:=wdCollapseStart
   Selection.EndKey unit:=wdLine, Extend:=wdExtend
End Sub

you can probably figure out the details of this. This is just a rough and
fast hack to show you the basics of how it can be done.

Hope this is of more help
periodic - 14 Jul 2007 19:10 GMT
I found a better way to solve the jumping to a range part.

The new findIt macro then looks like this

Sub findIt()

   Selection.HomeKey unit:=wdStory, Extend:=wdMove

   Dim elm As Shape

   For Each elm In ActiveDocument.Shapes
       If InStr(1, elm.Name, "vline", vbTextCompare) Then
           elm.Select
           gotoRange rng:=Selection.Range
           elm.Select
           MsgBox prompt:="See next"
       End If
   Next elm
End Sub

Sub gotoRange(rng As Range)
   ActiveWindow.ScrollIntoView rng
End Sub
Fuzzhead - 16 Jul 2007 23:30 GMT
periodic,

I tried your new findit macro useing my old newline and it worked.  It kind
of jumped around but it did find them all. I tried your insertLine macro but
it gives me the following error:  Object has been deleted.  

It is at the following code: idx = ActiveDocument.Variables("idx") + 1

Fuzzhead

> I found a better way to solve the jumping to a range part.
>
[quoted text clipped - 19 lines]
>     ActiveWindow.ScrollIntoView rng
> End Sub
Russ - 17 Jul 2007 07:31 GMT
Fuzzhead,
Try this change to the macro.

Sub insertLine()

   Dim i As Long
   Dim j As Long
   Dim idx As Long
   Dim num As Long
   Dim aVar As Variant

   For Each aVar In ActiveDocument.Variables
       If aVar.Name = "idx" Then
           num = aVar.Index
           Exit For
       End If
   Next aVar

   If num = 0 Then
       ActiveDocument.Variables.Add Name:="idx", Value:=0
   End If

   idx = ActiveDocument.Variables("idx").Value + 1
   i = Selection.Information(wdVerticalPositionRelativeToPage)
   j = InchesToPoints(1)
   ActiveDocument.Shapes.AddLine(562, i, 562, j + i).Name = "vline" & idx
   ActiveDocument.Variables("idx").Value = idx

End Sub

> periodic,
>
[quoted text clipped - 29 lines]
>>     ActiveWindow.ScrollIntoView rng
>> End Sub

Signature

Russ

drsmN0SPAMikleAThotmailD0Tcom.INVALID

Fuzzhead - 17 Jul 2007 17:58 GMT
Thank you Russ. That worked. I have another shape macro that I use. The
problem is when I run the findPCN macro it will only find the first
occurrence in each case. Is there a better way to write my first macro so I
can use periodic’s findit macro?

Sub PCNHighlight()
Dim idx As Long
Dim PCN As Shape
Dim i
On Error GoTo endthis

i = Selection.Information(wdVerticalPositionRelativeToPage)
Select Case Selection.Style
Case ActiveDocument.Styles(wdStyleHeading1)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 48, i - 3, 32,
18#)
   PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
   PCN.Fill.Transparency = 0.3
   PCN.Line.Visible = msoFalse
   PCN.Name = "PCNa" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading2)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 48, i - 3, 32,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNb" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading3)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 85, i - 3, 40,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNc" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading4)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 129, i - 3, 25,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNd" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading5)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 153, i - 3, 25,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNe" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading6)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 174, i - 3, 25,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNf" & idx
   idx = idx + 1

Case ActiveDocument.Styles(wdStyleHeading7)
Set PCN = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 199, i - 3, 25,
18#)
PCN.Fill.ForeColor.RGB = RGB(150, 150, 150)
PCN.Fill.Transparency = 0.3
PCN.Line.Visible = msoFalse
PCN.Name = "PCNg" & idx
   idx = idx + 1

endthis:
End Select
End Sub

periodic’s findit macro
Sub findPCN()

Selection.HomeKey unit:=wdStory, Extend:=wdMove
Dim elm As Shape

For Each elm In ActiveDocument.Shapes
If InStr(1, elm.Name, "PCN", vbTextCompare) Then
     elm.Select
     gotoRange rng:=Selection.Range
     elm.Select
     MsgBox prompt:="See the next PCN Number"
End If
Next elm
End Sub
periodic - 17 Jul 2007 22:02 GMT
Well the problem is the same as in your first insert line macro. The idx
variable is not saved between the runs of the macro and when you create the
next rectangle for a certain style it will have the same name as the
previous, i.e. all heading 1 styles will get the name PCNa0. However Word
does not allow two shapes to have to same name and refuses to change the name
of the second rectangle. Giving it the name Rectangle n (where n is the next
free number).
Thus you must add the idx variable as a document variable. Bu running
fuzzheads code:

'... Some init stuff

For Each aVar In ActiveDocument.Variables
If aVar.Name = "idx" Then
num = aVar.Index
Exit For
End If
Next aVar

If num = 0 Then
ActiveDocument.Variables.Add Name:="idx", Value:=0
End If  

... Do stuff with idx

ActiveDocument.Variables("idx").Value = idx

End Sub

This way idx get saved between the runs and say that you increase it to 1
the first run of the macro the idx variable is stored in the document as a
variable ready for use in the next run of the macro.

But as Fuzzheas says, for headings I would use the goto function
Russ - 17 Jul 2007 18:19 GMT
Fuzzhead,
Now that we have gone through this programming exercise, I have to ask, why
do you need to do this?

The bookmark function does the same thing by insertion point, selection of
text or object. You give the bookmark a name and using the menus
Edit/Goto... Bookmark or Insert/Bookmark... can go to any named bookmark.
The Browse buttons on each document's window below the vertical scrollbar
can goto previous or next object. Or the keys Control/Page Down and
Control/Page Up move browse next or browse previous.

Tools/Track Changes... is for edit control in documents.

Insert/Comments can also mark text with information.

> Fuzzhead,
> Try this change to the macro.
[quoted text clipped - 59 lines]
>>>     ActiveWindow.ScrollIntoView rng
>>> End Sub

Signature

Russ

drsmN0SPAMikleAThotmailD0Tcom.INVALID

Fuzzhead - 18 Jul 2007 00:18 GMT
Thank you both for all the help.

I am new to Word and don't know all that it can do. I have been going
through this site when I try to write a macro. I know that there are easer
way to do some things but I don't know where to look and find it. There is so
much info here that I find something close to what I need and then work on
it.

Fuzzhead

> Fuzzhead,
> Now that we have gone through this programming exercise, I have to ask, why
[quoted text clipped - 74 lines]
> >>>     ActiveWindow.ScrollIntoView rng
> >>> End Sub
Russ - 18 Jul 2007 05:43 GMT
Fuzzhead,
You're not the first one to try and re-invent the wheel. That's why I
thought I should ask what you were trying to do. I don't want to discourage
you from using macros because they can make you more productive in other
ways, too. I don't know everything about Word and learn something every day
by reading various forums. We all had to start at the beginning. Here are
some useful sites:
<http://word.mvps.org/>
<http://www.addbalance.com/word/>
<http://gmayor.com/Word_pages.htm>
<http://www.shaunakelly.com/word/index.html>

> Thank you both for all the help.
>
[quoted text clipped - 85 lines]
>>>>>     ActiveWindow.ScrollIntoView rng
>>>>> End Sub

Signature

Russ

drsmN0SPAMikleAThotmailD0Tcom.INVALID

Fuzzhead - 19 Jul 2007 18:04 GMT
Russ,

Thanks for your help and the sites. I have bookmarked them as favorites and
will start using them.

Fuzzhead

> Fuzzhead,
> You're not the first one to try and re-invent the wheel. That's why I
[quoted text clipped - 97 lines]
> >>>>>     ActiveWindow.ScrollIntoView rng
> >>>>> End Sub
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.