[dba-VB] C# Excel automation

Dan Waters df.waters at comcast.net
Mon May 9 12:02:24 CDT 2011


Hi John,

I've had this issue too.  It's almost certainly that somewhere in your code
you are missing an Excel object qualifier.  Also take a look at the sequence
of opening and closing the Workbook and the instance of Excel.

Another issue is that if the PC already has Excel open, then the workbook
you create will be contained within the instance of Excel, and it turns out
that it's about impossible for your code to loop through the different
workbooks.  The best plan is probably to look for an instance of Excel and
close it with save = true.  Then open your workbook and you should be fine.
You'll need to tell your users what's going to happen (and maybe ask by
message if they want to continue), and/or put up a message if you need to
close/save an already open instance of Excel.

See this code:

'-----------------
Private Sub FormatSpreadsheetDemo(stgPath As String)

    Dim objExcel As Object
    Dim objWorkbook As Object
'    Dim objExcel As Excel.Application  '-- TEST
'    Dim objWorkbook As Excel.Workbook  '-- TEST

    If IsNull(stgPath) Or stgPath = "" Then Exit Sub
    
    Set objExcel = CreateObject("Excel.Application")

    '-- for troubleshooting
'    objExcel.Visible = true  '-- TEST
'    objExcel.ActiveWindow.WindowState = xlMaximized  '-- TEST

    Set objWorkbook = objExcel.Workbooks.Open(stgPath)
    
    '-- Format
    objExcel.Rows("1:1").Select
    objExcel.Selection.Font.Bold = True
    objExcel.Cells.Select
    objExcel.Selection.Font.Name = "Tahoma"
    objExcel.Selection.Font.Size = 10
    objExcel.Cells.EntireColumn.AutoFit

    '-- Freeze rows
    If InStr(stgPath, "Backups") = 0 Then
        objExcel.Range("A2").Select
    Else
        objExcel.Range("B2").Select
    End If
    objExcel.ActiveWindow.FreezePanes = True
    objExcel.ActiveWindow.WindowState = xlMaximized
    
    '-- Change column format
    If InStr(stgPath, "Activity") <> 0 Then
        objExcel.Columns("E:E").Select
        objExcel.Selection.NumberFormat = "[$-409]h:mm AM/PM;@"
        objExcel.Columns("G:G").Select
        objExcel.Selection.NumberFormat = "[$-409]h:mm AM/PM;@"
    End If
    
    '-- Select upper left cell
    objExcel.Range("A1").Select

    '-- Save & Quit
    objWorkbook.Save
    objWorkbook.Close
    objExcel.Quit

    Set objWorkbook = Nothing
    Set objExcel = Nothing

    Exit Sub
    ErrEx.Bookmark = BOOKMARK_ONERROR

End Sub
'------------------

-----Original Message-----
From: dba-vb-bounces at databaseadvisors.com
[mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby
Sent: Monday, May 09, 2011 10:44 AM
To: VBA
Subject: [dba-VB] C# Excel automation

We are trying to automate Excel from C# but we are unable to correctly close
the excel object itself.  IOW it is still seen in the process list.

Paul has found information about marshal.releasecomobject and is doing that
for every object he is even touching but something is still not working.

Can anyone provide a simple example of opening a workbook, and reading a set
of cells out of a worksheet, then cleaning up and closing Excel.

TIA for your assistance.

--
John W. Colby
www.ColbyConsulting.com
_______________________________________________
dba-VB mailing list
dba-VB at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/dba-vb
http://www.databaseadvisors.com






More information about the dba-VB mailing list