[AccessD] Setting objects to nothing

Heenan, Lambert Lambert.Heenan at AIG.com
Wed Oct 5 16:20:57 CDT 2005


Re your comment about 14 and y: this strongly suggests that y is not being
set to the correct value in the first place (or is being altered later on).
In any case, where the number of elements in an array is (potentially) in
doubt I always use..

For x = lBound(SomeArrayName) to uBound(SomeArrayName)

... The next thing that confuses me (very easy to do!) is...

If blState = True Then .ActiveWorkbook.SaveAs FileName:=strFileSave

.ActiveWorkbook.Close SaveChanges:=False
End With

I'm not sure why you are trying to save the workbook to some specific file
name, but I assume that your code has changed the excel file that was opened
and you want to then save it to a *new* file with a different path/name. If
not, then why does the next line close the workbook without saving the
changes?

For what it's worth here is how I open and close excel workbooks...

I have a routine that opens files invisibly...

**************code starts *******************

Function Excel_OpenWorkBookHidden(Path As String, Optional UpdateLinks As
Boolean = False, Optional password As String = "") As Excel.Application
    Dim xlObj As Excel.Application
       
    On Error GoTo Excel_OpenWorkBookHidden_err
    'Check to see if the file name passed in to the procedure is valid
    If IsNull(Path) Or isDirectory(Path) Or Not FileExists(Path) Then
        MsgBox Path & " isn't a valid path!", vbCritical, "Open Excel
Workbook"
        Set Excel_OpenWorkBookHidden = Nothing
        Exit Function
    Else
        Set xlObj = CreateObject("Excel.Application")

        xlObj.Workbooks.Open Path, UpdateLinks, , , password
        Set Excel_OpenWorkBookHidden = xlObj
    End If
Excel_OpenWorkBookHidden_exit:
    Exit Function
Excel_OpenWorkBookHidden_err:
   ' replace with your own error logging/reporting routine
    ReportError Err.Number, Err.Description, "Excel_OpenWorkBookHidden",
"Excel_mod", "File Name=" & Path
    Set Excel_OpenWorkBookHidden = Nothing
    Resume Excel_OpenWorkBookHidden_exit
End Function

And another one for opening them and show them on screen...


Function Excel_OpenWorkBook(Path As String, Optional UpdateLinks As Boolean
= False, Optional password As String = "") As Excel.Application
    Dim xlObj As Excel.Application
    On Error GoTo Excel_OpenWorkBook_err
    
    Set xlObj = Excel_OpenWorkBookHidden(Path, UpdateLinks, password)
    
    If xlObj.Name > "" Then xlObj.Visible = True
    
    Set Excel_OpenWorkBook = xlObj
Excel_OpenWorkBook_exit:
    Exit Function
Excel_OpenWorkBook_err:
   ' replace with your own error logging/reporting routine
    ReportError Err.Number, Err.Description, "Excel_OpenWorkBook",
"Excel_mod", "File Name=" & Path
    Set Excel_OpenWorkBook = Nothing
    Resume Excel_OpenWorkBook_exit
End Function

... And for closing the workbook I use...

Sub Excel_CloseWorkBook(xlApp As Excel.Application, Optional bSaveChanges As
Boolean = False)
Dim wb As Excel.Workbook
    On Error Resume Next
    If xlApp.Name > "" Then
    End If
    If Err.Number <> 0 Then Exit Sub
    On Error GoTo 0
        For Each wb In xlApp.Workbooks         'Close all open workbooks
            wb.Close bSaveChanges
        Next wb
    xlApp.UserControl = False
    Set xlApp = Nothing
End Sub

And here is the isDirectory function...
Function isDirectory(sDir As String) As Boolean
    On Error Resume Next
    isDirectory = (GetAttr(sDir) And vbDirectory) <> 0
    If Err.Number <> 0 Then isDirectory = False
    On Error GoTo 0
End Function

And the FieExisit function...

Function FileExists(strFile As String) As Boolean
  ' Comments  : Determines if the file exists
  '             Works for hidden files and folders
  ' Parameters: strFile - file to check
  ' Returns   : True if the file exists, otherwise false
  Dim intAttr As Integer
  Dim errnum As Long
  On Error Resume Next
  'GET THE FILE ATTRIBUTE INSTEAD OF THE LENGTH OF THE FILE NAME
  intAttr = GetAttr(strFile)
  errnum = Err.Number
  FileExists = (Err.Number = 0)
End Function

**************code ends *******************

Now these routines do not allow you to open one file and save it under a
different name, but then I would instead copy the file to a new name first,
open the copy and change it any way I want, and then close the copy, saving
the changes.

One other comment, you have...

 If blState = False Then GoTo Err_Load_Financials

<soap box mode> 
The only time I ever need to use Goto is in setting up an error handler,
because that's the only way you can do it in VB/VBA. Otherwise I've never
needed to code anything using Goto. Plus, in your code it looks like the
Goto target really is an error handler, which means that if blState IS false
and your code jumps there, you will get another error when the Resume line
executes, because you did not enter the error handler legally (by raising an
error).
</soap box mode> 

Hope some of this helps.

Lambert

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Hale, Jim
Sent: Wednesday, October 05, 2005 4:42 PM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Setting objects to nothing


Here is the bottom part of the function. BTW if I change "For x = 1 To y" to
"For x = 1 To 14" Excel seems to go away. Strange Jim Hale

If blState = True Then .ActiveWorkbook.SaveAs FileName:=strFileSave

.ActiveWorkbook.Close SaveChanges:=False
End With
 If blState = False Then GoTo Err_Load_Financials
If Err.Number <> 0 Then
    Load_Financials = False
Else
    Load_Financials = True
 End If
fm.lblFilename.Visible = False

The_End:
    Set fm = Nothing
    For x = 1 To 14 'y
        If Not (rs(x) Is Nothing) Then rs(x).Close: Set rs(x) = Nothing
    Next x
    
    If Not (dbs2 Is Nothing) Then dbs2.Close: Set dbs2 = Nothing
    Set Wsheet = Nothing
    appExcel.Quit
    Set appExcel = Nothing
     If Excel_is_running = True Then MsgBox "Excel still running"
    
DoCmd.Hourglass False
Exit Function

Err_Load_Financials:
    Load_Financials = False
    If Not Err.Description = "" Then MsgBox Err.Description
    Resume The_End
End Function

-----Original Message-----
From: Heenan, Lambert [mailto:Lambert.Heenan at aig.com]
Sent: Wednesday, October 05, 2005 3:09 PM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Setting objects to nothing


What's the code for setting the Excel instance, and the code you are using
to close it?

Lambert




More information about the AccessD mailing list