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 / March 2008

Tip: Looking for answers? Try searching our database.

Need help with ActiveDocument

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
MarieJ - 11 Mar 2008 19:29 GMT
Hi,
I have a very complex template with 10 user forms that collects various
information and inserts information into the Word document in various places
and ways.  The person requesting this template wants users to be able to work
on other documents in the middle of the sequence of user forms because it
takes alot of time to fill out the forms and proceed to the end of the
complete template.  What is happening is occasionally a user will switch over
to another Word document screen and, for example, create a new document, and
type something into the new document.  Then when they switch back to the user
form and fill out some information and click Next to process that information
and move to the next form, Word is thinking the new document they created is
the ActiveDocument instead of the original document created based on the
template, and errors appear such as unable to find a bookmark, etc.  What's
the best way for me to prevent this but not restrict the template so users
can still work on other documents?  Is there a way to capture what the
ActiveDocument value is when the document is created from the template, and
then whenever the command button is clicked, check what the ActiveDocument
is, and if it isn't the right one, switch to the right one?

I hope I explained that clearly enough.
TIA  MarieJ
Benjamino5 - 11 Mar 2008 20:04 GMT
MarieJ,

If you create a variable for the document you want to keep track of, you can
then allow the user to switch around as much as possible without your code
losing track of that document.

Here's an example:

Sub MyDocument
' create variable to store your document
dim myDoc as Document
' make sure the current Active Document is
' the one you want to use, then
Set myDoc=ActiveDocument
' now the rest of your code can refer to myDoc
' instead of ActiveDocument

End Sub

> Hi,
> I have a very complex template with 10 user forms that collects various
[quoted text clipped - 17 lines]
> I hope I explained that clearly enough.
> TIA  MarieJ
Benjamino5 - 11 Mar 2008 20:20 GMT
Forgot to mention: if you write

myDoc.Activate

then myDoc will become the ActiveDocument again.

> MarieJ,
>
[quoted text clipped - 36 lines]
> > I hope I explained that clearly enough.
> > TIA  MarieJ
MarieJ - 11 Mar 2008 21:22 GMT
Great!  Where do I put that procedure, though, so it will keep that variable
throughout all the user forms, etc.

I do appreciate it!  Marie

> Forgot to mention: if you write
>
[quoted text clipped - 42 lines]
> > > I hope I explained that clearly enough.
> > > TIA  MarieJ
Benjamino5 - 11 Mar 2008 22:08 GMT
Marie,

I hope the MVPs weigh in here with the best solution, because I'm not sure
what's really the most elegant or correct. But here's a technique that will
work:

1) Create a global variable, which is available to all your code. To do
this, put this statement at the top of the first module that runs:

Public aDoc as Document

(Obviously "aDoc" could be "myDoc" or any other name you want.)

2) Make sure the Sub that set aDoc to the right document runs before you
need to refer to aDoc.

3) Replace all references to ActiveDocument everywhere in your code with
references to aDoc.

4) If you're using the Selection object or making other assumptions about
the ActiveDocument, watch out for errors. You may need to rewrite little
pieces. For example, writing "Selection.Range..." will capture whatever the
current activedocument's selection is, NOT what aDoc's selection/range is.

Another approach that would avoid having to use a Public statement would be
to simply pass "aDoc" as an argument to every Sub or Function throughout your
code, but you still need to watch out for problems with the Selection object,
etc.

Good luck!

Ben

> Great!  Where do I put that procedure, though, so it will keep that variable
> throughout all the user forms, etc.
[quoted text clipped - 47 lines]
> > > > I hope I explained that clearly enough.
> > > > TIA  MarieJ
Jonathan West - 11 Mar 2008 22:16 GMT
> Great!  Where do I put that procedure, though, so it will keep that
> variable
> throughout all the user forms, etc.
>
> I do appreciate it!  Marie

I'm not usually a fan of using global variables, but this is a case where
they are useful

Before the first Sub of a module, add this line

Public myDoc as Document

In the macro which you run, from which the UserForms are called, make one of
the first lines this

Set myDoc = ActiveDocument

at the end of the macro, include this line

Set myDoc = Nothing

Now, in routines or userforms which you call from the initial macro,
wherever you used ActiveDocument, use myDoc instead.

Signature

Regards
Jonathan West - Word MVP
www.intelligentdocuments.co.uk
Please reply to the newsgroup

MarieJ - 12 Mar 2008 15:51 GMT
OK, I think you need to save me from myself. lol

I can't get this to work.  I don't have a central macro that runs all the
user forms.  In the Private Sub Document_New(), I load the first form.  The
"Next" command button on the first form does what it needs to do and then
unloads the first form, and shows the second form, and on and on through all
11 forms.  I have tried all kinds of combinations of what you and Benjamino
wrote, and still lose the value of the myDoc variable as I switch between
forms.  I put Public myDoc as Document in the General Declarations section of
an autoexec module, and in the Private Sub UserForm_Activate() procedure
entered Set myDoc = ActiveDocument; I tried all kinds of other combinations.  
So knowing how my code works, is there a way I can still use that global
variable throughout, instead of having to rewrite the whole thing?  

Thanks again!  MarieJ

> > Great!  Where do I put that procedure, though, so it will keep that
> > variable
[quoted text clipped - 20 lines]
> Now, in routines or userforms which you call from the initial macro,
> wherever you used ActiveDocument, use myDoc instead.
Jean-Guy Marcil - 12 Mar 2008 18:01 GMT
> OK, I think you need to save me from myself. lol
>
[quoted text clipped - 11 lines]
>
> Thanks again!  MarieJ

I am a bit confused.... If the first userform has a "Next" button that calls
the next userform and so on, then how can the user regain control of the Word
environment before they get to the end? Are your userfom modeless (I.e. users
can interact with the document while the userform is displayed)?
If so, it means that all your code is self contained in each userfrom.
In such a case, the first userfrom should declare a document object as was
suggested in other posts, then when you use the "Next" button, you pass the
doc object as a reference, for example:

(In the ThisDocument module)
Option Explicit

Private Sub Document_New()

Dim ufFirst As UserForm1

Set ufFirst = New UserForm1

ufFirst.Show False

End Sub

Sub SecondForm(doc As Document)

Dim ufSecond As UserForm2

Set ufSecond = New UserForm2

ufSecond.Show False
Set ufSecond.docMain = doc

End Sub

(The code behind the first userform)
Option Explicit

Public docMain As Document

Private Sub CommandButton1_Click()

Me.Hide

'Do stuff in the doc, e.g.:
docMain.Range.Paragraphs(1).Range.Text = Me.TextBox1.Text & vbCrLf

ThisDocument.SecondForm docMain

Unload Me

End Sub

Private Sub UserForm_Initialize()

Set docMain = ActiveDocument

End Sub

(The code behind the second userform)
Option Explicit

Public docMain As Document

Private Sub CommandButton1_Click()

Me.Hide

'Do stuff in the doc, e.g.:
MsgBox docMain.Range.Paragraphs(1).Range.Text

Unload Me

ThisDocument.ThirdForm docMain

End Sub

etc.
MarieJ - 12 Mar 2008 20:53 GMT
Users can't interact with the document the forms are used with, but they can
click on other documents on their taskbar and access those, and create new
documents from there, etc. and that's what is causing the problem.  I did at
one point try to make it modal so they couldn't do that, but was requested to
make it modeless so if interrupted, users can work on other things while this
document is being created.

I'll try your code.  Thanks so much for the reply!

MarieJ

> > OK, I think you need to save me from myself. lol
> >
[quoted text clipped - 88 lines]
>
> etc.

Rate this thread:






 
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.