Pasar recordset/query de access a calc con VBA

Hola a todos.
¿Es posible exportar una consulta o recordset desde Access (con VBA) a Calc?

He encontrado algunos ejemplos para pasar cadenas de texto a una celda determinada en Calc, pero no encuentro nada para poder pasar un conjunto de registros.

Muchas gracias.

No se si con VBA se podrá, pero LibreOffice no usa VBA, sino otros lenguajes (varios) diferentes para hacer macros.

Si lo que quieres es pasar los datos resultado de la consulta, lo que puedes hacer es ejecutar la consulta con Access y copiar los datos, a continuación vas a Calc y los pegas.

También hay posibilidades de conectar un archivo de Access a Base y desde Base es fácil obtener los datos en Calc.

Si explicas un poco mejor tus intenciones, quizá te podamos dar mejores soluciones.

Si el query lo puedes obtener como CSV, este último lo abres en Calc (puede ser por código) y listo, ya tienes tu consulta en Calc.

Hola.
Con el código que pongo a continuación, que está en VBA y ejecuto desde Access, creo un documento de Calc e inserto “Hello world!” y “¡Funciona!” en dos celdas determinadas:

Public Sub fExportaCalc()
'vbscript - How to use VBS to manage LibreOffice Calc files? - Super User

Dim oSM2 As Object
Dim oDesk As Object
Dim wb As Object
Dim oSheet As Object

Set oSM2 = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM2.createInstance("com.sun.star.frame.Desktop")
Dim arg()
Set wb = oDesk.LoadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
Set oSheet = wb.CurrentController.ActiveSheet
oSheet.getCellByPosition(1, 2).String = "Hello world!"
oSheet.getCellByPosition(3, 4).String = "¡Funciona!"

End Sub

Lo que estoy intentando es hacer algo parecido, pero con el resultado de varias consultas de Access que pueden tener 15 o 20 campos y varios cientos de registros, por lo que hacerlo con el código que he puesto puede ser algo muy largo.

Hasta ahora lo hago de Access a una plantilla de Excel, pero por temas corporativos, tenemos que pasar los datos a Calc.

Muchas gracias.

Creo que he encontrado una solución en VB6, voy a ver si mañana lo puedo adaptar a VBA:

Hola a todos. Ya he solucionado lo que quería, pero como pasa siempre, luego surge otra cosa.

El nuevo problema es que los campos tipo fecha, que en la consulta original aparecen bien formateados (fecha corta dd/mm/aaaa), una vez hecha la exportación, en los que se puede confundir/intercambiar dd/mm por mm/dd (por ejemplo 01/01/yyyy) los exporta como número. Una fecha 27/10/aaaa la exporta bien.

Tengo que probar a exportar a una plantilla que tenga esa columna formateada como fecha a ver si no ocurre esto.

Os dejo el código que he adaptado por si a alguien le sirve.
El recordset que he probado es una tabla de 3 o 4 campos de texto y fecha con 4 registros. A la función se le pasa el nombre de la consulta como parámetro.

Saludos.

Public Function fExportaRstCalc(ByRef sSQL As String, Optional sNombrePestaña As String = "Hoja1")
'http://www.vbforums.com/showthread.php?558179-Exporting-to-OpenOffice-Calc
'USO: fExportaRstCalc("qryPrueba")
On Error GoTo fExportaRstCalc_Error
    Dim oServicio, oEscritorio, oDocumento, oHoja As Object
    Dim aNoArgs()
    Dim fldCount As Integer
    Dim iCol As Integer
    Dim nFila As Long
    Dim rsTemp As DAO.Recordset

    Set rsTemp = CurrentDb.OpenRecordset(sSQL)

    If rsTemp.EOF = False Then
        rsTemp.MoveFirst
    Else
        Exit Function
    End If

    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set oEscritorio = oServicio.createInstance("com.sun.star.frame.Desktop")
    Set oDocumento = oEscritorio.loadComponentFromURL("private:factory/scalc", "_blank", 0, aNoArgs())

' Cambia el nombre de la primera hoja
    Set oHoja = oDocumento.getSheets().getByIndex(0)
    oHoja.Name = sNombrePestaña

' Inserta los nombres de los campos del recordset a la primera fila de la hoja de cálculo
    fldCount = rsTemp.Fields.Count
    nFila = 0
    For iCol = 1 To fldCount
        Call oHoja.getCellByPosition(iCol - 1, nFila).setFormula(rsTemp.Fields(iCol - 1).Name)
        Call oHoja.getCellByPosition(iCol - 1, nFila).setPropertyValue("HoriJustify", 2)    'Justificar Centro fila encabezados
    Next

' Inserta los valores de los campos del recordset en las filas sucesivas de la hoja de cálculo
    nFila = 1
    Do While Not rsTemp.EOF
        For iCol = 0 To fldCount - 1
            Call oHoja.getCellByPosition(iCol, nFila).setFormula("" & rsTemp.Fields(iCol).Value)
        Next
        nFila = nFila + 1
        rsTemp.MoveNext
    Loop
    
    rsTemp.Close
    Set rsTemp = Nothing
    Set oHoja = Nothing
    Set oDocumento = Nothing
    Set oEscritorio = Nothing
    Set oServicio = Nothing

done:
    Exit Function

fExportaRstCalc_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") en fExportaRstCalc, Módulo basOpenOffice."
    rsTemp.Close
    Set rsTemp = Nothing
    Set oHoja = Nothing
    Set oDocumento = Nothing
    Set oEscritorio = Nothing
    Set oServicio = Nothing
    Resume done
End Function

Usa setFormula, solo si quieres meter una formula, si quieres meter, texto, numeros y fechas, usa:

    texto = "Maldito Mundo"
    numero = 100
    fecha = Now()

    doc = ThisComponent
    sheet = doc.CurrentController.ActiveSheet

    cell = sheet.getCellRangeByName("B1")
    cell.String = texto

    cell = sheet.getCellRangeByName("B2")
    cell.Value = numero

    cell = sheet.getCellRangeByName("B3")
    cell.Value = fecha

Ok. Muchas gracias.
Con setString funciona perfectamente.

Gracias de nuevo. Un saludo.

Solo por aclarar, no metas fechas con setString

Hola ¿qué puede provocar, cuál es la diferencia?

El problema que se me presenta, es que necesito usar ese código para pasar diferentes recordsets a hojas de Calc, y casi todos contienen texto y fechas, pero en diferentes campos.

No veo la forma de automatizar que use setValue en vez setString cuando el campo sea fecha, porque no estoy pasando los campos uno a uno “a mano”, si no recorriendo el rst automáticamente.

Lo único que se me ocurre es que en cada iteración del For..Next haya una forma de comprobar de qué tipo es cada campo, ¿es eso posible?

Un saludo y gracias.

por favor, NO te autorespondas… edita tu mensaje original o usa los comentarios…

No veo otra forma de pasar datos que iterar entre todos los campos y todos los registros, a menos, que uses algún método como doImport que no recuerdo si todavía esta presente.

Ok, muchas gracias.
Un saludo.