Copy to xls is almost useless. Here is a sample using ADO instead.
Select emp_id,First_Name,Last_Name,;
Title,Notes ;
from (_samples+'\data\employee') ;
into Cursor crsToExcel1 ;
nofilter
Select cust_id,company,contact,Title,country ;
from (_samples+'\data\customer') ;
into Cursor crsToExcel2 ;
nofilter
Select * ;
from (_samples+'\data\orders') ;
into Cursor crsToExcel3 ;
nofilter
lnSheets = 3 && we need 3 at least
oExcel = Createobject("Excel.Application")
With oExcel
.DisplayAlerts = .F.
.Workbooks.Add
.Visible = .T.
With .ActiveWorkBook
If .sheets.Count < m.lnSheets
.sheets.Add(,.sheets(.sheets.Count),;
m.lnSheets - .sheets.Count) && Add new sheets after old ones
Endif
VFP2Excel('crsToExcel1', .WorkSheets(1),"A1" )
VFP2Excel('crsToExcel2', .WorkSheets(2),"A1" )
VFP2Excel('crsToExcel3', .WorkSheets(3),"A1" )
Endwith
Endwith
Function VFP2Excel
Lparameters tcCursorName, toSheet, tcTargetRange
tcCursorName = Iif(Empty(m.tcCursorName),Alias(),m.tcCursorName)
tcTargetRange = Iif(Empty(m.tcTargetRange),'A1',m.tcTargetRange)
Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,;
lcTempRs, lcTemp, oExcel
lcTemp = Forcepath(Sys(2015)+'.dbf',Sys(2023))
lcTempRs = Forcepath(Sys(2015)+'.rst',Sys(2023))
Select (m.tcCursorName)
Copy To (m.lcTemp)
loConn = Createobject("Adodb.connection")
loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+Sys(2023)
loConn.Open()
loRS = loConn.Execute("select * from "+m.lcTemp)
loRS.Save(m.lcTempRs)
loRS.Close
loConn.Close
Erase (m.lcTemp)
loRS.Open(m.lcTempRs)
With toSheet
.QueryTables.Add( loRS, .Range(m.tcTargetRange)).Refresh()
Endwith
loRS.Close
Erase (m.lcTempRs)