Muy buenas noches.
Tengo una duda desde
hace bastante tiempo que no sé cómo resolver. Espero explicarme más
o menos bien. Veamos...
En una base de datos
de mi trabajo (curro para la Administración) que yo suelo hacerme
para facilitar la tarea, tengo un código dentro de un formulario que
realiza la acción de abrir un documento World (plantilla) y coger
campos de ese formulario y rellenarlo en la plantilla. Tira de una
tabla donde se identifican las campos del formulario y hace las
sustituciones. Esta tabla tiene dos campos:
CodeToReplace
({Cambia1}, es lo que ponemos en la plantilla)
ReplaceWithFieldName
(Forms!Formulario!campo_txt, es el valor en el formulario
El código es un
poco largo pero lo transcribo:
Private Sub
Comando306_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_cmdCreateLetter_Click
Set dbLocal =
CurrentDb()
strCurrAppDir = Left$(dbLocal.Name,
InStrRev(dbLocal.Name, "\"))
strFinalDoc = strCurrAppDir &
"documento1.dot"
On Error GoTo Error_cmdCreateLetter_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
Exit
Sub
Error_cmdCreateLetter_Click:
Beep
' MsgBox "Ha ocurrido el error:" &
vbCrLf & _
' Err.Description, vbCritical, "OLE
Error!"
Exit Sub
End Sub
La plantilla,
(documento1.dot) debe estar en la ruta de la base de datos (o se
puede cambiar indicándoselo). Hace una llamada a la tabla
(ReemplazaCodigos) para hacer las sustituciones y, poco más.
Pues bien, ocurre lo
siguiente. Abre la plantilla y hace sustituciones hasta que se
encuentra un campo en el formulario sin datos y, a partir de ahí, no
hace más sustituciones y deja los campos en la plantilla sin
cambiar. No tengo ni idea de dónde dice eso en el código o porqué
lo hace.
La solución más
"estúpida" por mi parte, es rellenar los campos del
formulario con un guión, espacio, punto o "algo", pero no
es lo suyo.
Aparte de todo esto
(me estoy extendiendo demasiado), el código lo adapté con ayuda de
un foro de OpenOfficce, para abrir un documento de LibreOfficce
Writer en vez de World (cosas de la Administración) y funcionaba
igual de bien abriendo la plantilla de Writer pero haciendo lo mismo:
Se paraban las sustituciones al encontrar un campo vacío en el
formulario. Pongo también el código:
Public Sub
Comando413_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_Comando413_Click
Set dbLocal = CurrentDb()
strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name,
"\"))
strFinalDoc = strCurrAppDir &
"Plantillas/documento1.ott"
On Error GoTo
Error_Comando413_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("ReemplazaPropuesta",
_
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_Comando413_Click:
Beep
' MsgBox "Ha ocurrido el error:" & vbCrLf & _
' Err.Description, vbCritical, "OLE Error!"
Exit Sub
End Sub
Bueno, ustedes sois
los "máquinas", por si veis algo… y lo queréis comentar
Muchas gracias de
antemano.