el usar un ciclo for para recorrer la grilla (datagrid, flexgrid, spreadsheet, otra) es demasiado lento si hay muchos registros.
me parece mejor, copiar el contenido de la grilla y pegar en excel.
Código:
'ESTE CODIGO VA EN UN MODULO ESTANDAR
'DECLARA API QUE PERMITE BUSCAR DONDE ESTA EXCEL EN EL SISTEMA
Declare Function SearchTreeForFile Lib "imagehlp" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
Sub CopiarGrilla(Sp As vaSpread)
'COPIA CONTENIDO DE SPREADSHEET AL PORTAPAPELES
'EL CONCEPTO ES COPIAR LA SELECCION
Clipboard.Clear
Sp.Row = 0
Sp.Col = 1
Sp.Row2 = Sp.MaxRows
Sp.Col2 = Sp.MaxCols
Clipboard.SetText Sp.Clip
End Sub
Sub AbrirExcel()
'BUSCA Y ABRE EXCEL
Dim tempStr As String, Ret As Long, xx
tempStr = String(260, 0)
Ret = SearchTreeForFile("c:\", "excel.exe", tempStr)
If Ret <> 0 Then
'SI "RET" ES DISTINTO DE CERO, ENCONTRO EXCEL Y LO ABRE MAXIMIZADO
xx = Shell(Left$(tempStr, InStr(1, tempStr, Chr$(0)) - 1), vbMaximizedFocus)
End If
End Sub
'ESTE CODIGO VA EN EL FORMULARIO EN EL EVENTO CLICK DE UN BOTON
CON CAPTION "EXPORTAR A EXCEL"
sub cmd_exportaexcel_click()
'COPIA EL CONTENIDO DE LA GRILLA
Call CopiarGrilla(Sp_datos)
'BUSCA Y ABRE EXCEL
Call AbrirExcel
'LE DICE A EXCEL QUE PEGUE EL CONTENIDO DEL PORTAPAPELES
SendKeys "^(v)", True
end sub