stoneycurtis
asked on
CreateObject("Excel.Application") Failure
Hello,
Using VBA in Access 2007, I'm trying to create an Excel workbook with 2 sheets. The first sheet is created from a query, the second sheet "Result" requires a lot of formatting.
The problem is that the second sheet does not get created, the following code executes from the Event Procedure of a button:
Then there is a lot of formatting that I won't bore you with, ending with:
No error is thrown.
I appreciate any help,
Thanks
Using VBA in Access 2007, I'm trying to create an Excel workbook with 2 sheets. The first sheet is created from a query, the second sheet "Result" requires a lot of formatting.
The problem is that the second sheet does not get created, the following code executes from the Event Procedure of a button:
Private Sub Command0_Click()
On Error GoTo errHdl
Dim xlApp As Object, path As String, fileName As String
Dim xlWB As Object, xlWS As Object, xlRes As Object
Dim lst As Integer, ctr As Integer, arr() As String, arrCtr As Integer, arrObj() As String
arrCtr = 0
start:
Set xlApp = CreateObject("Excel.Application")
path = Mid(CurrentDb.Name, 1, InStrRev(CurrentDb.Name, "\"))
If radAll.Value = -1 Then
fileName = "All Clients"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qryAcct_Pos_All_Client", path & fileName & ".xls", True
Else
fileName = cmbClient.Value
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qryAcct_Pos_Client", path & fileName & ".xls", True
End If
xlApp.Visible = True
xlApp.workbooks.Open path & fileName & ".xls"
If radAll.Value = -1 Then
Set xlWB = xlApp.workbooks(fileName)
Set xlWS = xlWB.Worksheets("qryAcct_Pos_All_Client")
If radAll.Value = -1 Then
With xlApp
.workbooks(fileName).Worksheets.Add After:=xlApp.Worksheets(1)
.activesheet.Name = "Result"
.workbooks(fileName).Worksheets(1).Select
End With
lst = xlApp.worksheetfunction.counta(xlWS.Range("A:A")) - 1
Then there is a lot of formatting that I won't bore you with, ending with:
xlWB.Save
xlApp.screenupdating = True
Set xlApp = Nothing
Exit Sub
errHdl:
If Err.Number = 1004 Then
k = MsgBox("All Clients file already exist in the folder. Do you want to replace it", vbYesNo)
If k = 6 Then
xlWB.Close False
Kill path & fileName & ".xls"
GoTo start
ElseIf k = 7 Then
xlWB.Close False
Exit Sub
End If
End If
End Sub
The code creates the 'qry' sheet correctly and then the Excel window pops-up but without the second 'Result' sheet.No error is thrown.
I appreciate any help,
Thanks
ASKER
@imnorie
radAll is a radio checkbox and its value is -1.
The workbook 'All Clients.xls' is created with one sheet, 'qryAcct_Pos_All_Client'.
(The code stops working here)
radAll is a radio checkbox and its value is -1.
The workbook 'All Clients.xls' is created with one sheet, 'qryAcct_Pos_All_Client'.
xlApp.Visible = True
xlApp.workbooks.Open path & fileName & ".xls"
If radAll.Value = -1 Then
(The code stops working here)
When it stops working what's happening with Excel?
Also, are there any error messages?
PS Why are you checking radAll multiple times?
Also, are there any error messages?
PS Why are you checking radAll multiple times?
ASKER
@imnorie
When the code stops, an Excel window pops-up displaying the 'All Clients' workbook and showing the only sheet.
There are no error messages.
I tried to eliminate the number of times the code checked for radAll values but it didn't make any difference. The workbook still only printed with one sheet.
When the code stops, an Excel window pops-up displaying the 'All Clients' workbook and showing the only sheet.
There are no error messages.
I tried to eliminate the number of times the code checked for radAll values but it didn't make any difference. The workbook still only printed with one sheet.
Here's the order to open and close Excel:
Dim xls As Excel.Application
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set xls = New Excel.Application
Set wkb = xls.Workbooks.Open("c:\tes t\workbook 1.xlsx")
Set wks = wkb.Worksheets(1)
wks.Name = "My New Name"
wkb.Close True
Set wks = Nothing
Set wkb = Nothing
xls.Quit
Set xls = Nothing
You _MUST_ be very specific to this. If you set your xlApp to Nothing, its feet are kicked away.
/gustav
Dim xls As Excel.Application
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set xls = New Excel.Application
Set wkb = xls.Workbooks.Open("c:\tes
Set wks = wkb.Worksheets(1)
wks.Name = "My New Name"
wkb.Close True
Set wks = Nothing
Set wkb = Nothing
xls.Quit
Set xls = Nothing
You _MUST_ be very specific to this. If you set your xlApp to Nothing, its feet are kicked away.
/gustav
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I am with @cactus_data on this one, I think the organization of your sub plays into a bit of your problems.
I'd get the xlApp, xlWB and xlWS declared and set FIRST
I'd then walk through adding the additional sheets you want
Being an Access guy, I like
Add data to each sheet in turn
Then format each sheet in turn.
You may find that when you think about re-factoring your code, you could break it into chunks: a sub to create the workbook and add the required sheets, a sub to add data to the sheets, and a sub to format the sheets.
It might be more maintainable and easier to read and de-bug
I'd get the xlApp, xlWB and xlWS declared and set FIRST
I'd then walk through adding the additional sheets you want
Set xlWS = obook.Worksheets.Add
osheet.Move After:=obook.Worksheets(3) 'or whatever number
Once you have your sheets, add data to themBeing an Access guy, I like
Dim db as database
Dim rs as recordset
Set db = Currentdb
Set rs = db.OpenRecordset("Some SQL string, or the name of a saved query",dbOpenDynaset, dbSeeChanges)
xlWS.Range("A2").CopyFromRecordset rs
much better than TransferSpreadsheet, but your mileage may varyAdd data to each sheet in turn
Then format each sheet in turn.
You may find that when you think about re-factoring your code, you could break it into chunks: a sub to create the workbook and add the required sheets, a sub to add data to the sheets, and a sub to format the sheets.
It might be more maintainable and easier to read and de-bug
Have you tried stepping through the code with F8 and checking what's happening?
Is the code to add the worksheet actually being executed?