[AccessD] Excel Not Closing

Stephen Bateman stephenb at highimpactsolutions.com
Mon Apr 10 13:05:37 CDT 2023


I use this function from Christos Samaras at http://www.myengineeringworld.net

Attribute VB_Name = "modExportToExcel"
Option Compare Database
Option Explicit

Sub TestDataToExcel()
Dim strWkbPath As String
Dim strSource As String
Dim strSheet As String

    'Change the names according to your own needs.
    strWkbPath = "Destinaion path and File Name"
    strSource = Table or Query
    strSheet = Sheet Tab Name
    
    DataToExcel strSource, strWkbPath, strSheet
                
    'Just showing that the operation finished.
    MsgBox "Data export finished successfully!", vbInformation, "Done"
    
End Sub

 Function DataToExcel(ByVal strSourceName As String, Optional ByVal strWorkbookPath As String, Optional ByVal strTargetSheetName As String, _
                        Optional ByVal blnDisplay As Boolean) As Boolean
 
    'Use this function to export a large table/query from your database to a new Excel workbook.
    'You can also specify the name of the worksheet target.
    
    'strSourceName is the name of the table/query you want to export to Excel.
    'strWorkbookPath is the path of the workbook you want to export the data.
    'strTargetSheetName is the desired name of the target sheet.
    
    'By Christos Samaras
    'http://www.myengineeringworld.net
   
    Dim rst As DAO.Recordset
    Dim excelApp As New Excel.Application
    Dim Wbk As Excel.Workbook
    Dim sht As Excel.Worksheet
    Dim fldHeadings As DAO.Field
    Dim blnShowApp As Boolean
    Dim lCount As Long
    Dim FileName As String
    
'    On Error GoTo Errorhandler
     On Error Resume Next
     
    DataToExcel = False
    
    FileName = right(strWorkbookPath, Len(strWorkbookPath) - InStrRev(strWorkbookPath, "\"))
'Set the desired recordset (table/query).
    Set rst = CurrentDb.OpenRecordset(strSourceName)
    If Not rst.EOF Then
        rst.MoveLast
        rst.MoveFirst
        lCount = rst.RecordCount
        If lCount = 0 Then Exit Function
    Else
        DataToExcel = False
        Exit Function
    End If
    
    If IsNull(blnDisplay) Then
        blnShowApp = False
    Else
        blnShowApp = blnDisplay
    End If
    
    If FileExists(strWorkbookPath) Then
        If MsgBox("Overwrite existing file?" & vbCrLf & FileName, vbYesNo, "WARNING") = vbNo Then
            DataToExcel = False
            Exit Function
        Else
            Kill strWorkbookPath
        End If
    End If

    'Create a new Excel instance.
    Set excelApp = CreateObject("Excel.Application")
    excelApp.DisplayAlerts = False
'    On Error Resume Next
    
    'Try to open the specified workbook. If there is no workbook specified
    '(or if it cannot be opened) create a new one and rename the target sheet.
    If FileExists(strWorkbookPath) Then
        Set Wbk = excelApp.Workbooks.Open(strWorkbookPath)
    Else
'    If Err.Number <> 0 Or Len(strWorkbookPath) = 0 Then
        Set Wbk = excelApp.Workbooks.Add
        If Len(strTargetSheetName) > 0 Then
            Set sht = Wbk.Worksheets("Sheet1")
            sht.Name = Left(strTargetSheetName, 34)
        Else
            Set sht = Wbk.Worksheets("Sheet1")
        End If
    End If
    
    'If the specified workbook has been opened correctly, then in order to avoid
    'problems with other sheets that might contain, a new sheet is added and is
    'being renamed according to the strTargetSheetName.
    
    Set sht = Wbk.Worksheets.Add
    If Len(strTargetSheetName) > 0 Then
        sht.Name = Left(strTargetSheetName, 34)
    End If

    On Error GoTo 0
    
    Wbk.Save
    
    excelApp.Visible = blnShowApp

    'Write the headings in the target sheet.
    For Each fldHeadings In rst.Fields
        excelApp.ActiveCell = fldHeadings.Name
        excelApp.ActiveCell.offset(0, 1).Select
    Next
    
    'Copy the data in the target sheet.
        rst.MoveFirst
        sht.Range("A2").CopyFromRecordset rst
        sht.Range("1:1").Select

    'Format the headings of the target sheet.
    excelApp.Selection.Font.Bold = True
    With excelApp.Selection
        .HorizontalAlignment = -4108 '= xlCenter in Excel.
        .VerticalAlignment = -4108  '= xlCenter in Excel.
        .WrapText = False
        With .Font
            .Name = "Arial"
            .Size = 11
        End With
    End With
    
    'Adjusting the columns width.
    excelApp.ActiveSheet.Cells.EntireColumn.AutoFit
    
    'Freeze the first row - headings.
    With excelApp.ActiveWindow
        .FreezePanes = False
        .ScrollRow = 1
        .ScrollColumn = 1
    End With
    sht.Rows("2:2").Select
    excelApp.ActiveWindow.FreezePanes = True
    
    'Change the tab color of the target sheet.
    With sht
        .Tab.Color = RGB(255, 0, 0)
        .Range("A1").Select
    End With

    'Close the recordset.
    rst.Close
        
TempVars!ExcelPath = strWorkbookPath
Wbk.SaveAs (strWorkbookPath)
DoEvents

If blnShowApp = False Then excelApp.Quit

DataToExcel = True


ExitHandler:
    Set fldHeadings = Nothing
    Set excelApp = Nothing
    Set Wbk = Nothing
    Set sht = Nothing
    Set rst = Nothing
    Exit Function

ErrorHandler:
    DoCmd.Hourglass False
    DoCmd.SetWarnings True
    MsgBox Err.Description, vbExclamation, Err.Number
    Resume ExitHandler

End Function

Stephen Bateman

-----Original Message-----
From: AccessD <accessd-bounces+stephenb=highimpactsolutions.com at databaseadvisors.com> On Behalf Of Rocky Smolin
Sent: Monday, April 10, 2023 12:55 PM
To: Access Developers discussion and problem solving <accessd at databaseadvisors.com>
Subject: [AccessD] Excel Not Closing

Dear List:

I have an app which exports data to an Excel spreadsheet.  It is not amenable to using TransferSpreadsheet because of formatting problems, etc.
So I use the brute force method and it works well.

Problem is that at the end of the process the user wants the app to open the spreadsheet.

So I use Application.FollowHyperlink strFileName. Problem is that the spreadsheet opens blank.

When I go to the folder and open the spreadsheet it's there, all perfect.
So I put a breakpoint in at the statement Application.FollowHyperlink strFileName and looked at the Task Manager and sure enough there was an instance of Microsoft Excel still there in the list of background processes.

If I end that Excel process and then let the app execute the Follow Hyperlink it opens just fine. So it's that leftover instance of Excel that's hosing up the works.

 I set the objects like so:

Set objXLApp = New Excel.Application
Set objXLBook = objXLApp.Workbooks.Add
Set objXLWS = objXLBook.Sheets(1)

and at the end close up like so:

objXLBook.SaveAs strFileName
objXLBook.Close True

Set objXLWS = Nothing
Set objXLBook = Nothing

objXLApp.Quit
Set objXLApp = Nothing

How do I get rid of that instance of Excel in the background processes?


MTIA

Rocky
--
AccessD mailing list
AccessD at databaseadvisors.com
https://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com


More information about the AccessD mailing list