Is anybody there?
Según voy averiguando cosas, las incorporo a la BD de ejemplo que empezó Mónica (adjunto mi cuarta versión):
| Code: |
Option Compare Database
Option Explicit
Private Sub BotonWord_Click()
Const plantilla As String = "\miplantilla.dot"
Const maxToReplace As Integer = 255
Dim appWord As Word.Application
Dim wordDoc As Word.Document
Dim formField As DAO.Field
Dim allDocument As Range
Dim lenPending As Long
Dim labelToBeReplaced, nextStr, pendingStr As String
Dim maxLeftByLabel As Integer
'falta el tratamiento de errores'
Set appWord = New Word.Application
With appWord
.Visible = False
End With
Set wordDoc = appWord.Documents.Add(CurrentProject.Path & plantilla)
With appWord.Selection.Find
For Each formField In Me.Recordset.Fields
'MsgBox "Tratando el campo: " & formField.Name'
labelToBeReplaced = "<<" & formField.Name & ">>"
If wordDoc.Content.Find.Execute(FindText:=labelToBeReplaced) Then
maxLeftByLabel = maxToReplace - Len(labelToBeReplaced)
.Text = labelToBeReplaced
pendingStr = Me(formField.Name).Value & "" 'para prevenir nulos'
lenPending = Len(pendingStr)
Do 'incluso si el campo está vacío hay que sustituir una vez...'
If lenPending > maxToReplace Then
nextStr = Left(pendingStr, maxLeftByLabel) & labelToBeReplaced
lenPending = lenPending - maxLeftByLabel
pendingStr = Right(pendingStr, lenPending)
Else
nextStr = pendingStr
lenPending = 0
pendingStr = ""
End If
.Replacement.Text = nextStr
Call .Execute(Replace:=Word.WdReplace.wdReplaceAll)
Loop While lenPending > 0
End If
Next formField
End With
With appWord
.Visible = True
.Activate
.WindowState = wdWindowStateMaximize
End With
Set appWord = Nothing
Set wordDoc = Nothing
Set formField = Nothing
Exit Sub
End Sub
|
(He cerrado con una comilla simple innecesaria cada comentario del código, para que el visualizador del foro no se líe.)
Algunas novedades:
1. Ya voy recorriendo automáticamente todos los campos del formulario. Utilizo un objeto Recordset para ello, pero no uno que tenga que crear mediante una consulta, sino el Recordset propio del formulario, al que accedo mediante una propiedad de éste.
2. Por cada uno de los campos, antes de intentar incorporarlo a la plantilla Word, compruebo que realmente haya alguna marca de ese campo en la plantilla.
3. Siempre que haya marca, entraré al menos una vez en el bucle que sustituye "trozo a trozo". Si no me asegurara de ello (con Do/Loop en vez de While/Wend), en el caso de campos vacíos me quedaría con la marca del campo en la plantilla.
4. Me aseguro de que, una vez hechas las correspondientes sustituciones sobre las marcas de la plantilla, el documento resultante se muestre maximizado en la pantalla. Para ello, antes de la asignación sobre appWord.WindowState, necesito appWord.Activate.
Lo que me falta todavía es:
1. Un tratamiento de errores decente.
2. Averiguar por qué los párrafos del campo "texto" se muestran en el documento Word con sangría de primera línea (excepto el primer párrafo).
Cualquier ayuda será bienvenida.
Un saludete.
Fede
File Attachment: File Name:
V4.zipFile Size: 31836