Globals Go "Poof!": Workarounds?

P

PeteCresswell

In Workbook_Open() I'm capturing a couple of global variable values:
the workbook's name, and it's full path.

Naturally, when code is interrupted, the globals go "Poof!".

This is expected.... but I'm unable to make Workbook_Open a public
routine and call it as needed.

Seems like I need an alternative to global variables.

First thing that comes to mind is an invisible "System" or
"Application" worksheet that gets populated by Workbook_Open. Then I
write a couple of functions to grab the desired values from that
invisible sheet.

Does this sound like good practice?

Alternatives?
 
D

Dave Peterson

First, if all you're doing is saving the workbook's name and its path, you could
use something like:

Thisworkbook.name
Thisworkbook.fullname
Thisworkbook.path

ThisWorkbook is the workbook that owns the code. And you can use that in any of
your routines.

But for other stuff, you may want to set up an initialization routine. Then you
can run that initialization routine whenever you need to:

Sub Workbook_Open()
Call InitialVars
End sub

========
In a general module:
Sub InitializeVars()
public VarsAreInitialized as boolean
public var1 as long
public var2 as string
public var3 as worksheet

varsareintialized = true
var1 = 323
var2 = "Ok"
set var3 = thisworkbook.worksheets("sheet1")
End sub

Then in any routine, you can check to see if your variables are ok:

Sub anyroutine()
if varsareintialized then
'perfect, do nothing!
else
call initializevars
end if
'stuff that does some real work
end sub

==========
If those variables change in other procedures, then this wouldn't be the way to
go--since it's just setting them back to their initial state.
 
P

PeteCresswell

First, if all you're doing is saving the workbook's name and its path, you could
use something like:

Thisworkbook.name
Thisworkbook.fullname
Thisworkbook.path

I should have mentioned this in the OP: problem is that when a user
double-clicks a .XLS, Windows has this nasty habit of opening up
the .XLS in whatever instance of Excel already happens tb running.

Hence, at any given time "ThisWorkBook" could be something besides the
one I'm working in. Also, some of my routines open up "Temp"
spreadsheets and copy worksheets from them into my "Real" workbook.

Bottom line is that I want (need?) to make all my object references
explicit - by name - instead of by number. e.g.
".WorkBooks("Whatever") instead of ".WorkBooks(2)".

I'm pretty sure the business of opening into an existing Excel
instance could be altered via some registry entry or another.... but I
want this thing tb portable without any OS customization.

So I'm back to the question of whether squirreling away those intially-
acquired values in an invisible "System" worksheet is good practice.

Haven't seen anything to the contrary. Once I get on top of some
other issues I'll go that route if nobody gives a reason not to.
 
C

Charles Williams

Dave's solution works:
Thisworkbook ALWAYS refers to the workbook that contains the VBA statement:
it does not matter how many workbooks are open or which workbooks are
active.

The usual way of handling all this is to use Workbook object variables:

Set oRealBook=Thisworkbook
set oTempBook=Workbooks("Temp.xls")

regards
Charles
__________________________________________________
The Excel Calculation Site
http://www.decisionmodels.com
 

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