Heenan, Lambert
Lambert.Heenan at AIG.com
Thu Dec 8 14:53:24 CST 2005
I think that your problem is something to do with the fact that you are
using New Excel.Application instead of the CreateObject function that MS
recommend be used for Office Automation. Though I'm not certain, it's
probably also because you are not doing anything with the Excl object's
UserControl property, here is what help has to say on that...
"
UserControl Property
True if the application is visible or if it was created or started by the
user. False if you created or started the application programmatically by
using the CreateObject or GetObject functions, and the application is
hidden. Read/write Boolean.
Remarks
When the UserControl property is False for an object, that object is
released when the last programmatic reference to the object is released. If
this property is False, Microsoft Excel quits when the last object in the
session is released.
Example
This example displays the status of the UserControl property.
If Application.UserControl Then
MsgBox "This workbook was created by the user"
Else
MsgBox "This workbook was created programmatically"
End If
"
Here is the code I use to open Excel files, and I don't have any problems
with it leaving instances behind.
The code uses a few helper functions (IsDirectory etc.) and the code for
those is shown at the end.
First I have a function that opens the workbook as hidden. Useful if you
want to open a file and extract data without showing the worksheet for a
blink of an eye....
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 into the function 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 a call to your own error reporting routine.
'@@@@@@@@@@@@@@@@@@@@@@@
ReportError Err.Number, Err.Description, "Excel_OpenWorkBookHidden",
"Excel_mod", "File Name=" & Path
Set Excel_OpenWorkBookHidden = Nothing
Resume Excel_OpenWorkBookHidden_exit
End Function
Then, if you want to open the workbook visibly the corresponding function is
simply...
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 a call to your own error 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 the all important routine to close the workbook...
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
' here just to force an error if an invalid object is passed in
End If
If Err.Number <> 0 Then Exit Sub ' give up
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 are the helper functions...
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
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
'===============================
As a brief example of usage...
Sub TestExcel(strFile As String)
' strFile is the full path to an Excel File
Dim xlObj As Excel.Application
Dim xlWs As Excel.Worksheet
Set xlObj = Excel_OpenWorkBookHidden(strFile)
If Not xlObj Is Nothing Then
Set xlWs = xlObj.Worksheets(1)
' Do stuff with the worksheet object
Debug.Print xlWs.Cells(1, 2)
' Now we are ready to close it
Set xlWs = Nothing ' release the worksheet object
' and then close the workbook object (without saving changes in this
example)
Excel_CloseWorkBook xlObj
Else
MsgBox "Invalid file:" & strFile
End If
End Sub
HTH
Lambert
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Paul Hartland
\(ISHARP\)
Sent: Thursday, December 08, 2005 5:36 AM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Access Function To Create Spreadsheet Fails On 2nd
Run
That's exactly the old code I had in place still getting the same
error....but I will try changing it back and running it again with Jim Hales
code in between and see what I get....
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock
Sent: 08 December 2005 10:19
To: accessd at databaseadvisors.com
Subject: Re: [AccessD] Access Function To Create Spreadsheet Fails On 2nd
Run
Hi Paul
No, you may not be closing the workbook properly. Try this:
objWB.Close
Set objWB = Nothing
/gustav
>>> paul.hartland at isharp.co.uk 08-12-2005 09:57:32 >>>
I used the code and I get the Excel Running message, the basis of my code is
Dim objExcel As Excel.Application
Dim objWB As Excel.Workbook
Set objExcel = New Excel.Application
Set objWB = objExcel.Workbooks.Open(strProd) ' strProd is a string
containing the path to the workbook template.
objExcel.Workbooks.Close
Set objWB = Nothing
objExcel.Application.Quit
Set objExcel = Nothing
And I have really tried every way I could think of of closing the workbook
and the application. Anyone know if I am closing the workbook and the
application incorrectly..
Paul Hartland
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com