Página 1 de 2

[RESUELTO] Llamar a Writer desde Access VBA

NotaPublicado: Lun Feb 23, 2015 1:11 pm
por maserrano
Buenas.
Tengo una base de datos en access y me gustaría saber como llamo a la aplicación writer de OpenOffice para que me genere un documento de writer a través de una plantilla en la que sustituyo los valores.
Gracias de antemano.

Re: llamar a Writer desde Access VBA

NotaPublicado: Lun Feb 23, 2015 10:34 pm
por fornelasa
Hola maserrano, bienvenido al foro .....
Creo, me parece una consulta demasiado escueta, ojala podamos dar mayores detalles al respecto.
Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 12:10 am
por maserrano
Eso no es problema alguno.
Bien, tengo una base de datos relacional en red en una administración autonómica (varias provincias). La base está realizada con Officce 2000.
A partir de ya mismo, los usuarios finales de la base dejarán de tener el officce en sus máquinas. Para seguir ussando la base les instalarán un runtime de access y un visor de word (wordviewer) para generar los distintos documentos (oficios, resoluciones, propuestas, etc.). Ambos no necesitan licencia por lo que se pueden instalar sin problema.
En las pruebas que estoy haciendo, el runtime no me genera el documento de word en ausencia de éste programa; se ve que le faltarán librerías y demás que el visor no le aporta. De hecho, no me extraña que así sea de la gente de Microsoft...
Una de las opciones que manejo es intentar llamar a una aplicación OpenOfficce/LibreOfficce writer desde VBA de Access pero no tengo ni idea siquiera si se puede hacer...
Ya me comentarán si se puede o alguna solución alternativa.
Muchas gracias por adelantado.

Si quieren más detalles no tengo ningún problema. Salu2

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 12:25 am
por fornelasa
No sé, sería bueno aclarar más .....
De entrada ésta macro abre un archivo nuevo de Writer desde VBA Access (según yo)
Código: Seleccionar todo   Expandir vistaContraer vista
Sub LlamarWriter()
    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oServicio.createInstance("com.sun.star.frame.Desktop")   
    Dim args(1) As Object
    Set args(0) = oServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True   
    Set Document = Escritorio.loadComponentFromURL("private:factory/swriter", "_blank", 0, args)             
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)   
    Set Document = Nothing
    Set Escritorio = Nothing
    Set oServicio = Nothing
End Sub

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 12:37 am
por maserrano
Gracias por contestar tan rápido.
Ahora para mi es tarde, pero mañana a primera hora en el trabajo aporto los detalles necesarios para intentar solucionar este "problemilla".
Muchísimas gracias y hasta dentro de un ratito.
Salu2

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 9:47 am
por maserrano
Buenas de nuevo.
Intento aclarar el procedimiento que uso.
Desde un formulario con determinados campos y a través de un comando (botón) que ejecuta una acción (evento al hacer click) me llama a un procedimiento que ahora describo; básicamente busca en una tabla de sustituciones y los combina con una plantilla de word (.dot). Veamos
Código: Seleccionar todo   Expandir vistaContraer vista
Private Sub boton_Click()
Dim dbLocal As Database
   Dim snpReplaceCodes As Recordset
   Dim strCurrAppDir As String
   Dim strFinalDoc As String
   Dim varReplaceWith As Variant
   Dim docWord As Word.Document
   
   On Error GoTo Error_boton_Click
   Set dbLocal = CurrentDb()
   strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name, "\"))
         
   strFinalDoc = strCurrAppDir & "plantilla1.dot"
     
   On Error GoTo Error_boton_Click
   Set appWord = New Word.Application
   Set docWord = appWord.Documents.Add(strFinalDoc)
   appWord.Visible = True
   'abro ahora la tabla de las sustituciones
   Set snpReplaceCodes = dbLocal.OpenRecordset("ReemplazaCodigos", _
         dbOpenSnapshot)
   
   Do While Not snpReplaceCodes.EOF
     
     
      varReplaceWith = Eval(snpReplaceCodes!ReplaceWithFieldName)
      varReplaceWith = IIf(IsNull(varReplaceWith), " ", CStr(varReplaceWith))
           
      With docWord.Content.Find
         
         If snpReplaceCodes!CodeToReplace = "{MOVIETITLE}" Then
            With .Replacement
               .ClearFormatting
               .Font.Bold = True
               .Font.Italic = True
            End With
         End If
         
         .Execute FindText:=snpReplaceCodes!CodeToReplace, _
               ReplaceWith:=varReplaceWith, Format:=True, _
               Replace:=wdReplaceAll
       
       End With
             
       snpReplaceCodes.MoveNext
   
   Loop
   
   snpReplaceCodes.Close
   docWord.SaveAs FileName:="C:\Documentos\Datos.doc"
docWord.Close
appWord.Quit
   Exit Sub
   
Error_boton_Click:

   Beep
   ' MsgBox "Ha ocurrido el error:" & vbCrLf & _
   ' Err.Description, vbCritical, "OLE Error!"
   Exit Sub
     
End Sub

Qué es lo que hace:
-Al pulsar boton, busca la plantilla1.dot y le aplica la tabla ReemplazaCodigos;
-Hace las sustituciones hasta que termina todos los reemplazos.
-Guarda el documento en la ruta: C:\Documentos\Datos.doc
-Cierra el documento.

Ahora, lo que quiero es que en vez de llamar al programa word, llame a writer;
en su defecto ahora lo invoca así:
Código: Seleccionar todo   Expandir vistaContraer vista
Set appWord = New Word.Application
   Set docWord = appWord.Documents.Add(strFinalDoc)
   appWord.Visible = True

..., no sé cómo debe ser con writer. Espero haber aclarado un poco más la consulta. De todas formas ante cualquier duda, me lo comunicáis.
Gracias de nuevo.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 5:42 pm
por fornelasa
Me parece que ademas de llamar a Writer necesitamos traducir la mayor parte del codigo VBA que tienes. Se ve que llamar a Writer desde VBA no bastará.
Considero que para intentar ayudarte nos hace falta estar ahí en tu lugar y ver los archivos y el proceso detenidamente con lujo de detalles, algo que parece no estamos dispuestos a hacer.

Doy un ejemplo de lo que es detallar claramente un proceso.

Tengo un archivo de Excel, desde aqui, desde Excel, usando codigo VBA quiero abrir un archivo nuevo de Calc, ahí en Calc controlado desde VBA, en la primera hoja del archivo nuevo en la celda A1 escribir el texto "fornelasa" y en la celda A2 introducir el texto el "ElForo, ademas el fondo de ambas celdas quiero pintarlas de color verde (cualquier verde).

Me parece que la redacción anterior es clara y ni codigo hay, aqui la solución:
Desde Excel con codigo VBA

Código: Seleccionar todo   Expandir vistaContraer vista
Sub Ejemplo53()
    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oServicio.createInstance("com.sun.star.frame.Desktop")
   
    Dim args(1) As Object
    Set args(0) = oServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
   
    Set Document = Escritorio.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)
   
     
    Set oHoja = Document.getSheets().getByIndex(0)
     
    Call oHoja.getcellbyposition(0, 0).setFormula("fornelasa")
    Call oHoja.getcellbyposition(0, 0).SetPropertyValue("CellBackColor", RGB(100, 250, 100))
    Call oHoja.getcellbyposition(0, 1).setFormula("El Foro")
    Call oHoja.getcellbyposition(0, 1).SetPropertyValue("CellBackColor", RGB(100, 250, 100))
     
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)
   
    Set oHoja = Nothing
    Set Document = Nothing
    Set Escritorio = Nothing
    Set oServicio = Nothing

End Sub



Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mar Feb 24, 2015 7:32 pm
por maserrano
No tengo ningún problema en aportar los detalles que se quieran. Es que realmente no sé que quieren que aporte.
Mis necesidades son las siguientes: Dispongo de un formulario en el que hay varios subformularios incluidos relacionados por campos claves. Todos, lo que contienen son datos y lo que pretendo es generar documentos. Estos documentos están hechos en plantillas como la que muestro (una parte):

Vista la solicitud presentada por {aban2} con CIF/NIF {aban12}, examinados los documentos obrantes en el expediente antes citado y, teniendo en consideración los siguientes

ANTECEDENTES DE HECHOS

I.- Con fecha {aban13} tuvo entrada en esta Delegación Territorial solicitud de autorización para el abandono y clausura del/ de los depósito/s descrito/s a continuación, conforme a lo previsto en el Decreto 281/2002, de 12 de noviembre, por el que se regula el régimen de autorización y control de los depósitos de efluentes líquidos o lodos procedentes de actividades industriales, mineras y agrarias:

Matrícula Depósitos Situación Clase Riesgo Objeto Superficie del vaso m2 Superficie de Evap. m2 Volumen Máximo m3
Coord. X Coord. Y Huso
{aban14} {aban15} {aban16} {aban17} {aban18} {aban19} {aban20} {aban21} {aban22} {aban23}

II.- A dicha solicitud se acompañó la documentación preceptiva comprobándose que cumple con los requisitos establecidos en la normativa reguladora y, especialmente, el “{aban24}”, redactado por D/Dª. {aban25}, con visado nº {aban26} del {aban27}.

etc..


Bien; lo que está entre llaves son campos a sustituir del registro en el que estemos.
La tabla de sustituciones tiene los siguientes campos:

CodeToReplace tipo memo
ReplaceWithFieldName tipo memo
numerador tipo numero


Para este ejemplo la tabla queda así:

CodeToReplace ReplaceWithFieldName numerador
{aban0} Forms!REGISBAL!DELEGACIONES!ref 0
{aban1} Forms!REGISBAL!DELEGACIONES!reftec 1
{aban2} Forms!REGISBAL!INDUSTRIASI!titsi 2
{aban3} Forms!REGISBAL!INDUSTRIASI!notsi 3
{aban4} Forms!REGISBAL!subdocumento!idexpe 4
{aban5} Forms!REGISBAL!DELEGACIONES!servicio 5
{aban6} Forms!REGISBAL!DELEGACIONES!jefeservicio 6
{aban7} Forms!REGISBAL!supmax 7
{aban8} Forms!REGISBAL!volum 8

etc.


REGISBAL, es el formulario principal y DELEGACIONES, INDUSTRIASI, subdocumentos, etc. son formularios (subformularios) vinculados con el formulario principal.
Los datos se cogen del registro en el que estemos situado del documento principal y del que nos situemos del subformulario.

El código que puse anteriormente hace los cambios en la plantilla y el evento (al hacer clic) lanza el documento.

Comentarme si me explico bien o por el contrario qué debo hacer. ..., nunca pregunté en un foro.

Gracias a todos.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 5:55 pm
por maserrano
Buenas.
Alguna ayuda??
Necesito dar algún detalle más??
Gracias por adelantado

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 7:59 pm
por fornelasa
Una posible opción:
Me imagino que hasta esta linea de codigo VBA llamas a la plantilla de Word
Código: Seleccionar todo   Expandir vistaContraer vista
appWord.Visible = True


Tu consulta dice
llamar a Writer desde Access VBA
es decir, hasta ahi llegamos :mrgreen:

Parece que en realidad la consulta significa: ¿como abrir archivo de Word guardado como plantilla (plantilla1.dot) en Writer desde Access VBA?

Parece que el codigo de abajo lo hace, (copiemoslo y peguemoslo sustituyendo tu VBA desde Dim dbLocal As Database hasta appWord.Visible = True)
Código: Seleccionar todo   Expandir vistaContraer vista
   Dim dbLocal As Database
   Dim snpReplaceCodes As Recordset
   Dim strCurrAppDir As String
   Dim strFinalDoc As String
   Dim varReplaceWith As Variant
   Dim docWord As Word.Document
   
   On Error GoTo Error_boton_Click
   Set dbLocal = CurrentDb()
   strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name, "\"))
             
   strFinalDoc = strCurrAppDir & "plantilla1.dot"
   On Error GoTo Error_boton_Click
   strFinalDoc = Replace(strFinalDoc, "\", "/")
   strFinalDoc = "file:///" + strFinalDoc
     
   Dim args(1) As Object
    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oServicio.createInstance("com.sun.star.frame.Desktop")
    Set args(0) = oServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    Set Document = Escritorio.loadComponentFromURL(strFinalDoc, "_blank", 0, args())
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)

pero ......
http://superalumnos.net/abrir-plantillas-dot-en-writer

¿Iremos por el camino correcto?

Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 8:13 pm
por xiseme
@fornelasa ¿podría abrirse una plantilla de writer desde VBA?
Me explico, maserrano parece poder obtener los valores de los campos. sería rellenarlos (como has hecho con las celdas para Calc)
Ya me hago cargo que «..traducir la mayor parte del codigo VBA» requerirá saber manejarse bien con Basic-OpenOffice.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 8:23 pm
por fornelasa
Hola xiseme:
primero y antes de todo coincido con lo que dice ifanlo en el link de arribita, sobre todo en esta parte:
"Si necesitas coexistir con ambas suites, deberías tener las plantillas por duplicado; una para MS Office y otra para OpenOffice.org."
xiseme escribió:@fornelasa ¿podría abrirse una plantilla de writer desde VBA?

Si, si se puede ..... de hecho en el ejemplo que nos ocupa solo sería cambiar plantilla1.dot por plantilla1.ott
es decir , ejemplo desde VBA
Código: Seleccionar todo   Expandir vistaContraer vista
Sub LlamarPlantillaWriter()
    Dim args(1) As Object
    archivo = "file:///C:/Users/Federico/Documents/AAAAAAA/plantilla1.ott" 'OJO OJO aqui va tu carpeta
    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oServicio.createInstance("com.sun.star.frame.Desktop")
    Set args(0) = oServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    Set Document = Escritorio.loadComponentFromURL(archivo, "_blank", 0, args())
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)
   End Sub

Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 8:38 pm
por xiseme
Pues entonces ya casi está, porque realmente creo que maserrano no necesita abrir nada con Word.

[modo broma on]
Más bien no puede, se lo han quitado :mrgreen: y el muy "vagoneta" ;) :) por lo que sea, porque es muy grande, compleja o porque él domina VBA, no quiere rehacer esa base de datos en ...

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 8:47 pm
por maserrano
Pues ese detalle no lo he pensado porque todo ésto se me ha venido encima de pronto.
Para mi no es ningún problema hacer las plantillas en OpenOfficce.
Si parto de ahí, sería abrir un documento de OpenOfficce en su propio medio; ¿ y eso es complicado de hacer en VBA Access?
(lo digo porque todavía no he revisado lo que me habéis remitido).
Por cierto, mi nombre es Miguel.
Gracias.

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 8:50 pm
por maserrano
Por cierto, cómo funcionan las bases de datos en LibreOfficce?
Nunca me paré a investigar..., siempre me decían que era endeble, con menos posibilidades y eso; pero nunca lo comprobé por mi mismo y tampoco me paré a aprender un tanto de su lenguaje de programación.

..., nunca es tarde...

Re: llamar a Writer desde Access VBA

NotaPublicado: Mié Feb 25, 2015 11:24 pm
por mauricio
Tiene como 10 años que no uso Access, pero en comparación con Base, Base si es por ahora un poco más limitada, solo un poco, puedes mejorar su desempeño si lo enlazas con una base de datos de verdad, MySQL, PostgreSQL, hasta el mismo SQLite dependiendo de tus necesidades... solo que manejar BD desde Basic para mi es algo caotico, pero desde Python es una belleza...

nunca es tarde...

Saludos

Re: llamar a Writer desde Access VBA

NotaPublicado: Jue Feb 26, 2015 10:09 am
por maserrano
Buenas a todos.
Estoy haciendo pruebas y parece que va genial;
cuando sustituyo el código propuesto por Federico me pide que defina las variables siguientes:
Código: Seleccionar todo   Expandir vistaContraer vista
OServicio
Escritorio
Document

Sin saber bien, las defino como objetos:
Código: Seleccionar todo   Expandir vistaContraer vista
   Dim OServicio As Object
   Dim Escritorio As Object
   Dim Document As Object

El resultado es que me abre LibreOfficce y me abre el documento plantilla (dot), pero no me hace las sustituciones.
Qué hago mal?
El código al final queda así:
Código: Seleccionar todo   Expandir vistaContraer vista
[color=#BF0080]Private Sub Comando367_Click()
Dim dbLocal As Database
   Dim snpReplaceCodes As Recordset
   Dim strCurrAppDir As String
   Dim strFinalDoc As String
   Dim varReplaceWith As Variant
   Dim docWord As Word.Document
   Dim OServicio As Object
   Dim Escritorio As Object
   Dim Document As Object
   
   
   On Error GoTo Error_Comando367_Click
   Set dbLocal = CurrentDb()
   strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name, "\"))
             
   strFinalDoc = strCurrAppDir & "certificado.dot"
   On Error GoTo Error_Comando367_Click
   strFinalDoc = Replace(strFinalDoc, "\", "/")
   strFinalDoc = "file:///" + strFinalDoc
     
   Dim args(1) As Object
    Set OServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = OServicio.createInstance("com.sun.star.frame.Desktop")
    Set args(0) = OServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    Set Document = Escritorio.loadComponentFromURL(strFinalDoc, "_blank", 0, args())
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)

   'abro ahora la tabla de las sustituciones
   Set snpReplaceCodes = dbLocal.OpenRecordset("ReemplazaCertificado", _
         dbOpenSnapshot)
   
   Do While Not snpReplaceCodes.EOF
     
     
      varReplaceWith = Eval(snpReplaceCodes!ReplaceWithFieldName)
      varReplaceWith = IIf(IsNull(varReplaceWith), " ", CStr(varReplaceWith))
           
      With docWord.Content.Find
         
         If snpReplaceCodes!CodeToReplace = "{MOVIETITLE}" Then
            With .Replacement
               .ClearFormatting
               .Font.Bold = True
               .Font.Italic = True
            End With
         End If
         
         .Execute FindText:=snpReplaceCodes!CodeToReplace, _
               ReplaceWith:=varReplaceWith, Format:=True, _
               Replace:=wdReplaceAll
       
       End With
             
       snpReplaceCodes.MoveNext
   
   Loop
   
   snpReplaceCodes.Close
   
   Exit Sub
   
Error_Comando367_Click:

   Beep
   ' MsgBox "Ha ocurrido el error:" & vbCrLf & _
   ' Err.Description, vbCritical, "OLE Error!"
   Exit Sub
End Sub[/color]

He realizado una plantilla de prueba en ott. Cómo debo de cambiar el código si quiero que todo vaya por LibreOfficce desde el principio?

Gracias por su colaboración.

Re: llamar a Writer desde Access VBA

NotaPublicado: Jue Feb 26, 2015 12:14 pm
por xiseme
Es preferible utilizar las etiquetas CODE para encerrar el código de macros así me ahorras hacerlo a mí.

No me hagas mucho caso, pero mientras llegan los expertos (hay una diferencia horaria considerable) ...
Si no me equivoco ese RecordSet es una tabla de registros de Access y que lógicamente, solo Acces entiende. También me parece que tiene al menos dos campos uno con el valor y otro que implica formato.
Idea de bombero: : convertir el RecordSet a dos matrices (o una de 2 dimensiones)
MatrixValores(valor1,valor...valor_n) MatrixFormatoEspecial(0,1,0,0,... n)
Una vez que consigas la lista de los campos de la plantilla ott sería ... campo1=valor1 (con/sin formato especial) campo2=...

Sugiero ojees en particular los 2 primeras indicaciones de este enlace: el libro de Mauricio y el de Andrew Pitonyak
Soluciones no, pero trabajo si sé dar :mrgreen:

Re: llamar a Writer desde Access VBA

NotaPublicado: Jue Feb 26, 2015 5:58 pm
por maserrano
Sí realmente los dos campos de la tabla de sustituciones son uno de valor (colocado en la plantilla) y otro que mas que formato diría yo ruta, de dónde se sitúa el valor (colocado en el formulario).

Lo que no tengo ni idea es lo de las matrices...

Veré lo que me has sugerido; me tengo que poner al día en LibreOfficce!!

..., mientras tanto una ayudita no me viene nada nada mal...

Salu2 Gracias a todos

Re: llamar a Writer desde Access VBA

NotaPublicado: Jue Feb 26, 2015 10:30 pm
por fornelasa
maserrano escribió:El resultado es que me abre LibreOfficce y me abre el documento plantilla (dot)

¡perfecto tema solucionado!, así dice el encabezado de tu consulta.

maserrano escribió:pero no me hace las sustituciones.
Qué hago mal?

Es obvio que no te hace las sustituciones porque lo único que fue traducido de tu codigo VBA a codigo oooBasic fue la parte de tu consulta "llamar a Writer desde Access VBA".

Para que haga las sustituciones hay que traducir toda la macro, esto nos lleva a una consulta mas generalizada que pudo haber sido "tengo esta macro de VBA Access, necesito que me la traduzcan toda a programación oooBasic y ademas ni les mando la base de datos y ni les mando la plantilla y los "chamaqueo" diciendo "llamar a Writer desde Access VBA", ..... :super: :lol: obvio ni te hubiera contestado.

 Editado: Toma en cuenta que este es un foro de OpenOffice y no de VBA, Access, Word y compañia :lol: 


Si en una plantilla de Write insertamos campos y luego aplicamos el asistente para combinar correspondencias tal vez eso ayude pero ......

No obstante lo anterior, ¿como creas la plantilla de Word, podrías explicarlo, es decir, como insertas esa cosas {aban14} {aban15} {aban16} {aban17} {aban18} ? ¿son nombres de campo? ¿como se llama tu tabla?
¿podrías con palabras detallar que haces?

Tal vez así pudiera yo ayudarte un poco mas o tal vez alguien más de la comunidad pudiera hacerlo.

Insisto, jejejejeje, "llamar a Writer desde Access VBA"
¡Tema solucionado! :mrgreen:

Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Jue Feb 26, 2015 11:47 pm
por maserrano
Bueno, bueno... Todo cierto. Insisto en que soy u novato en esto de consultar en un foro y que igual no supe plantear bien la pregunta, pero no más lejos de eso.

La plantilla de word es simplemente un texto tipo donde insertaremos campos (entre llaves, que son los datos que necesito); los distintos "aban" son campos de una tabla (que hace referencia a una resolución de abandono de una balsa de efluentes) La tabla se llama "ReemplazaAbandono" ( y tengo otras, ReemplazaCertificado, etc.); todas tienen la misma estructura: dos campos, a saber

-CodeToReplace (de tipo memo): Hace referencia a los campos a sustituir de la plantilla que están entre llaves, como {aban1}, {aban2}...
-ReplaceWithFieldName (de tipo memo): Hace referencia a la situación del campo en el formulario. Si está en el formulario principal es simple
· Forms!REGISBAL!volmax Se llama al formulario principal, en este caso REGISBAL "Registro de balsas" y llama al campo volmax "volumen máximo" y da el dato
· Forms!REGISBAL!DELEGACIONES!servicio Aquí hay un segundo formulario vinculado al primero y el campo siempre es del último formulario

El código lo que hace es que llama a la plantilla, la lee y cuando encuentra un campo entre llaves que identifica con uno suyo de la tabla, cambia ese valor entre llaves por el valor que tiene esa ficha del formulario en ese campo. Así continúa hasta el final. Le añadí una rutina para que guardara el documento generado con un nombre en una ruta y lo cerrara para comodidad del usuario (aunque eso no era necesario).

De verdad que en ningún momento he querido "confundir" a nadie. Se me planteó un reto y ante el desconocimiento llegué hasta aquí, hasta este foro (estupendo, por cierto).
No sé si me podrán terminar de ayudar en "ésto", lo que si aseguro es que tengo que aprender bastante OppenOfficce .
Sinceramente, gracias.

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 12:12 am
por fornelasa
ok bien, por el momento déjame asimilar lo que escribiste,
Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 1:12 am
por fornelasa
Ummmm no, lo lamento, no te alcanzo a comprender.
Intentemos empezar de nuevo y olvidémonos de todo codigo.
Intentemos explicar o construir un ejemplo practico pequeño, manda los archivos que sean necesarios, tanto de Access como de Word ya con la plantilla creada, algo sencillo, haz de cuenta que no existe codigo y no lo relaciones tampoco con tu trabajo actual.

¿se podrá?

Saludos, Federico.

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 1:47 am
por maserrano
Perfecto.
Me pongo a ello.
Creo que no sabré cómo agradecerlo...

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 1:49 am
por maserrano
cómo puedo adjuntar documentos en el foro??

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 1:59 am
por fornelasa
Puedes usar "Subir adjunto" en Respuesta rápida - Editor Completo - Pestaña Subir adjunto

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 2:57 am
por maserrano
Es un ejemplo simple pero creo que responde a lo solicitado.
Tanto la base como el documento de word deben estar en la misma carpeta; es el único requisito.
Ahora, si me perdonáis voy a descansar un poco. Aquí son las tres de la madrugada...

Muuuchas gracias de nuevo

Re: llamar a Writer desde Access VBA

NotaPublicado: Vie Feb 27, 2015 11:23 pm
por maserrano
Hola a tod@s.
Parece ser que hemos dado con la solución definitiva, a falta de hacer más pruebas: Ya abre LibreOfficce y realiza los reemplazos.
Incluso, he cambiado la plantilla de word (.dot) por la plantilla de writter (.ott), y obviamente también la llama y reemplaza. Así me evito las pérdidas y cambios de estilos entre programas diferentes.
Por si a alguien le interesa o por si tiene un problema similar, a continuación pongo el código final (como digo, a falta de retoques y pruebas)

Código: Seleccionar todo   Expandir vistaContraer vista
Public Sub utilizaopenoffice_Click()
Dim dbLocal As Database
   Dim snpReplaceCodes As Recordset
   Dim strCurrAppDir As String
   Dim strFinalDoc As String
   Dim varReplaceWith As Variant
  '++++++++++++++
  Dim mibusqueda As Object
  Dim oservicio As Object
  Dim Escritorio As Object
  Dim document As Object
 
  '++++++++++++++++
   On Error GoTo Error_utilizaopenoffice_Click
   Set dbLocal = CurrentDb()
   strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name, "\"))
             
   strFinalDoc = strCurrAppDir & "plantilla1.dot"

  'también puede ser plantilla1.ott

   On Error GoTo Error_utilizaopenoffice_Click
   strFinalDoc = Replace(strFinalDoc, "\", "/")
   strFinalDoc = "file:///" + strFinalDoc
     
   Dim args(1) As Object
    Set oservicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oservicio.createInstance("com.sun.star.frame.Desktop")
    Set args(0) = oservicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    Set document = Escritorio.loadComponentFromURL(strFinalDoc, "_blank", 0, args())
    Call document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call document.getCurrentController.getFrame.getComponentWindow.setVisible(True)
    Set mibusqueda = document.createReplaceDescriptor

'abro ahora la tabla de las sustituciones
   Set snpReplaceCodes = dbLocal.OpenRecordset("ReemplazaCodigos", _
         dbOpenSnapshot)

   Do While Not snpReplaceCodes.EOF


      varReplaceWith = Eval(snpReplaceCodes!ReplaceWithFieldName)
      varReplaceWith = IIf(IsNull(varReplaceWith), " ", CStr(varReplaceWith))

    mibusqueda.setsearchstring (snpReplaceCodes!CodeToReplace)
    mibusqueda.setreplacestring (varReplaceWith)
    Call document.replaceall(mibusqueda)


       snpReplaceCodes.MoveNext

   Loop
'
  snpReplaceCodes.Close
   Exit Sub
   
Error_utilizaopenoffice_Click:

   Beep
   ' MsgBox "Ha ocurrido el error:" & vbCrLf & _
   ' Err.Description, vbCritical, "OLE Error!"
   Exit Sub
     
End Sub


Muchísimas gracias a todos.
Si están interesados pueden poner más propuestas.
Gracias de veras.

Re: llamar a Writer desde Access VBA

NotaPublicado: Sab Feb 28, 2015 12:11 am
por xiseme
Entiendo entonces que es reemplazar texto normal y corriente (encerrado entre {} pero sin más) Se me había metido en la cabeza :knock: que los [aban1] etc... de la plantilla eran campos de texto.

:super: y :super: Uno por lograrlo y otro por poner la solución.

Los enlaces que puse antes creo que están desactualizados. El libro de Mauricio creo que ya lo has visto re-pongo los enlaces de Pitonyak y su libro actualización 2015 que tiene macros para Writer.

Re: llamar a Writer desde Access VBA

NotaPublicado: Sab Feb 28, 2015 1:12 am
por fornelasa
xiseme escribió: :super: Uno por lograrlo y otro :super: por poner la solución.

+1
Saludos, Federico