Billy Pang
tuxedoman888 at gmail.com
Wed Sep 13 14:04:11 CDT 2006
Thanks A.D. My original code did included the activesheet reference (only
because it was easier to write) so I rewrote the code but it appears that
excel application still refuses to die.
I have also noticed that this phenomenon also occurs when I (via automation)
create a new excel application and do nothing but insert a new worksheet
from a second excel template (eg. Sheets.Add Type:="C:\myTemplate.xlt").
Billy
On 9/13/06, A.D.TEJPAL <adtp at hotmail.com> wrote:
>
> Billy,
>
> Apparently you wish to create a new excel workbook, copy some data into
> the first worksheet and then create a copy of this worksheet, followed by
> positioning of newly copied sheet at the very end. It also seems you wish to
> implement this job in the background, and quit excel in a clean manner.
>
> For executing jobs with hidden instance of excel, reference to active
> state of objects MUST BE AVOIDED. Otherwise, you might encounter error and
> the excel application might refuse to die, despite using explicit Quit
> command.
>
> Sample code as given below, carries out the jobs listed in first para,
> in a hidden manner and ensures clean termination of excel application,
> saving the workbook as Test.xls.
>
> If it is desired that the new workbook becomes available for further
> direct action by the user, statement (A) should be enabled, at the same time
> disabling statement (D). In such a situation, you do have the option of
> using statement (C) with ActiveSheet style, instead of statement (B), if
> desired. However as already stated, (B) is considered the preferred style.
>
> Best wishes,
> A.D.Tejpal
> ---------------
>
> =====================================
> Sub P_NewWbCopySheet()
> Dim exp As Excel.Application
> Dim wb As Excel.Workbook
> Dim ws As Excel.Worksheet
>
> Set exp = New Excel.Application
> 'exp.Visible = True ' (A)
> Set wb = exp.Workbooks.Add
>
> Set ws = wb.Worksheets(1) ' (B)
> 'Set ws = wb.ActiveSheet ' (C) - Avoid ActiveSheet
> ' (See Note
> Below)
> ws.Cells(1, 1) = "ABC"
>
> ws.Copy After:=wb.Worksheets(wb.Worksheets.Count)
> Set ws = wb.Worksheets(wb.Worksheets.Count)
> ws.Name = "Ws_FreshCopy"
>
> On Error Resume Next
> Kill "C:\Temp\Test.xls"
> wb.SaveAs "C:\Temp\Test.xls"
>
> Set ws = Nothing
> Set wb = Nothing
> exp.Quit ' (D)
> Set exp = Nothing
>
> ' Note - (a) For background work, where Excel is
> ' required to do its job & then quit unseen,
> ' use of ActiveSheet object MUST BE
> ' AVOIDED.
> ' (b) If statement (C) is to be used in lieu of (B),
> ' statement (A) must be kept enabled.
> ' Otherwise, scope for error and the
> ' application may refuse to die
> ' (despite presence of statement (D))
> End Sub
> =====================================
>
> ----- Original Message -----
> From: Billy Pang
> To: Access Developers discussion and problem solving
> Sent: Wednesday, September 13, 2006 03:10
> Subject: Re: [AccessD] copying worksheets
>
>
> Thanks Marty and may the force be with you. I tried the different
> copy method but I still get the same result (error message).
> However, I noticed that the excel app still exists after I destroyed it.
> That is...
>
> Dim xlApp As Excel.Application
> Set xlApp = CreateObject("Excel.Application")
>
> some code for adding data to the the worksheet
> some code for copying the worksheet
> xlApp.Quit
> Set xlApp = Nothing
>
> (that is, after stepping through set xlApp = nothing, I can still see
> Excel.exe in my windows task manager)
>
> However, if I remove the code that copies the worksheet, excel.exe is
> properly removed after set xlApp = nothing.
>
> Billy
>
> On 9/12/06, MartyConnelly <martyconnelly at shaw.ca> wrote:
> >
> > Use the Object Browser Luke!
> > There is more than one copy method
> > or it maybe you haven't set the activesheet
> > in your method
> >
> > Sub CopyAndName()
> > ' This creates a new sheet,
> > ' copies the data from the first sheet,
> >
> > Dim sName As String, sht1 As Worksheet, sht2 As Worksheet
> > Set sht1 = ActiveSheet
> > Set sht2 = Worksheets.Add(after:=ActiveSheet)
> > sht2.Name = "MyNewName "
> > sht1.UsedRange.Copy Destination:=sht2.Range("A1")
> > End Sub
> >
> >
> > Billy Pang wrote:
> >
> > >Hello:
> > >
> > >>From Access, I'm trying to make a copy of a worksheet within an
> instance
> > of
> > >Excel that is created at runtime in VBA.
> > >
> > >xlsheet.copy after:=activesheet
> > >
> > >However, I get the following error message.
> > >
> > >Run-time error '5'
> > >
> > >Invalid procedure call or argument
> > >Any ideas?
> > >
> > >Many thanks in advance,
> > >Billy
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>
--
Billy Pang
http://dbnotes.blogspot.com/
"Once the game is over, the King and the pawn go back in the same box." -
Italian proverb