[RESUELTO] Llamar a Writer desde Access VBA

Discute sobre el procesador de textos

[RESUELTO] Llamar a Writer desde Access VBA

Notapor maserrano » Lun Feb 23, 2015 1:11 pm

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.
Última edición por SLV-es el Jue Abr 02, 2015 7:00 pm, editado 1 vez en total
Razón: Marcar como [RESUELTO] por los comentarios del usuario
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Lun Feb 23, 2015 10:34 pm

Hola maserrano, bienvenido al foro .....
Creo, me parece una consulta demasiado escueta, ojala podamos dar mayores detalles al respecto.
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mar Feb 24, 2015 12:10 am

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
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Mar Feb 24, 2015 12:25 am

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
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mar Feb 24, 2015 12:37 am

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
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mar Feb 24, 2015 9:47 am

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.
Última edición por xiseme el Mar Feb 24, 2015 11:38 am, editado 2 veces en total
Razón: Poner etiquetas [Code]
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Mar Feb 24, 2015 5:42 pm

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.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mar Feb 24, 2015 7:32 pm

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.
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mié Feb 25, 2015 5:55 pm

Buenas.
Alguna ayuda??
Necesito dar algún detalle más??
Gracias por adelantado
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Mié Feb 25, 2015 7:59 pm

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.
Última edición por fornelasa el Mié Feb 25, 2015 9:34 pm, editado 1 vez en total
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor xiseme » Mié Feb 25, 2015 8:13 pm

@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.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
xiseme
 
Mensajes: 1888
Registrado: Lun Nov 24, 2008 1:13 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Mié Feb 25, 2015 8:23 pm

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.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor xiseme » Mié Feb 25, 2015 8:38 pm

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 ...
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
xiseme
 
Mensajes: 1888
Registrado: Lun Nov 24, 2008 1:13 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mié Feb 25, 2015 8:47 pm

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.
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Mié Feb 25, 2015 8:50 pm

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...
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor mauricio » Mié Feb 25, 2015 11:24 pm

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
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5878
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: llamar a Writer desde Access VBA

Notapor maserrano » Jue Feb 26, 2015 10:09 am

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.
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor xiseme » Jue Feb 26, 2015 12:14 pm

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:
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
xiseme
 
Mensajes: 1888
Registrado: Lun Nov 24, 2008 1:13 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Jue Feb 26, 2015 5:58 pm

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
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Jue Feb 26, 2015 10:30 pm

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.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Jue Feb 26, 2015 11:47 pm

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.
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Vie Feb 27, 2015 12:12 am

ok bien, por el momento déjame asimilar lo que escribiste,
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Vie Feb 27, 2015 1:12 am

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.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Vie Feb 27, 2015 1:47 am

Perfecto.
Me pongo a ello.
Creo que no sabré cómo agradecerlo...
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Vie Feb 27, 2015 1:49 am

cómo puedo adjuntar documentos en el foro??
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Vie Feb 27, 2015 1:59 am

Puedes usar "Subir adjunto" en Respuesta rápida - Editor Completo - Pestaña Subir adjunto
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: llamar a Writer desde Access VBA

Notapor maserrano » Vie Feb 27, 2015 2:57 am

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
Adjuntos
Documents.rar
(28.55 KiB) 172 veces
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor maserrano » Vie Feb 27, 2015 11:23 pm

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.
LibreOffice 4.3
maserrano
 
Mensajes: 16
Registrado: Lun Feb 23, 2015 1:04 pm

Re: llamar a Writer desde Access VBA

Notapor xiseme » Sab Feb 28, 2015 12:11 am

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.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
xiseme
 
Mensajes: 1888
Registrado: Lun Nov 24, 2008 1:13 pm

Re: llamar a Writer desde Access VBA

Notapor fornelasa » Sab Feb 28, 2015 1:12 am

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

+1
Saludos, Federico
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3223
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Siguiente

Volver a Writer

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 10 invitados