Cadena de texto en archivo de texto

08/03/2012 - 00:21 por El Nazgûl | Informe spam
Hola a todo el mundo.
Hacía ya mucho que no me pasaba por este foro (veo que aún sigue "la
vieja guardia").

Al asunto:
Estoy desarrollando una macro en Excel (con vba) para realizar unas
tareas administrativas y enviar las cartas; todo esto se realiza a
través de otra aplicación (desarrollada por terceros y que no puedo
modificar en absoluto) que permite la ejecución de las macros de
Excel. En cierto momento he de poner el motivo concreto por el cual se
envía la carta, con datos concretos almacenados en variables.
Os pongo un ejemplo de como sería el código:

"Le comunicamos que su " & familiar & " tiene la obligación de "

Hasta aquí todo bien. Lo complicado es que el texto tiene como máximo
80 caracteres por línea y tengo que incorporarlos en el texto de la
aplicación. Además, ese mismo archivo de texto contiene más motivos,
pues en ocasiones tengo que poner más de uno (no puedo dar datos más
concretos por el carácter de mi trabajo, lo siento).

Mi pregunta es: ¿Cómo puedo crear el archivo de texto poniendo una
referencia para cada motivo y según el ejemplo de más arriba?
 

Leer las respuestas

#1 Leonardo Azpurua
09/03/2012 - 05:06 | Informe spam
Hola,

Lo que normalmente se hace en esos casos es colocara "marcadores".

Imagino que la apicación tiene algo que ver con la emisión de documentos
mercantiles. En esetipo de documento, es dificil encontrar un caracter como
"\", de modo que podrías usarlo como el delimitador de los marcadores.

Luego, enprimer lugar usas expresiones regulares para extraer los
marcadores:

Por ejemplo:

Dim rex, match, matches

Set rex = CreateObject("VBScript.RegExp")
rex.Pattern = "\\.+\\" ' cualquier secuencia de caracteres delimitada
por"\"
' el caracter \ se pone doble porque
es el indicador de caracteres especiales en las regexp

Set matches = rex.Execute(textoDeLaCarta)
For each match In matches
Dim idVar As String
idVar = match.Value
idVar = Mid(idVar, 2, Len(idVar) - 2) ' eliminas los
delimitadores.
textoDeLaCarta = Replace(textoDeLaCarta , match.value,
valorCorrespondiente(idVar))
Next

La funcion valorCorrespondiente(idVar) recibe una variable e implementa la
"logica secreta" de tu aplicación para devolver el contenido correspondiente
(motivo, parentesco, etc).

Tu texto de ejemplo, debería estar escrito así:

Le comunicamos que su /familiar/ tiene la obligación de ...

A partir de aquí, solo te queda dividir textoDeLaCarta en un array de no mas
de 80 caracteres de longitud. y esta función lo hace (fue de las primeras
cosas que escribí en VB: estoy seguro de quepuede hacerse mucho mejor):

Public Function Convert2Lines(sTexto As String, nMaxWidth As Integer) As
Variant
Dim nextLine As String, sCopia As String, posSep As Long, cSep As String
Dim RetBuffer() As String, isBreak As Boolean
Dim n As Integer

If nMaxWidth <= 0 Then
Err.Raise 5
End If

If sTexto = "" Then
ReDim RetBuffer(1 To 1)
RetBuffer(1) = ""
Convert2Lines = RetBuffer
Exit Function
End If

sCopia = sTexto: n = 0
Do While sCopia <> ""
nextLine = Left(sCopia, nMaxWidth)
posSep = InStr(1, nextLine, Chr$(13))
If posSep Then ' Corte "natural" de línea
nextLine = Left(nextLine, posSep - 1)
Do
cSep = Mid(nextLine, posSep, 1)
If cSep <= Chr$(32) Then
posSep = posSep + 1
End If
Loop While posSep <= Len(nextLine) And cSep <= Chr$(32)
sCopia = Right(sCopia, Len(sCopia) - posSep)
Else
posSep = Len(nextLine)
If posSep > 0 Then
If posSep >= nMaxWidth Then
Do
cSep = Mid(nextLine, posSep, 1)
isBreak = InStr(1, ",.:;?¿!¡ ", cSep)
If Not isBreak Then
posSep = posSep - 1
End If
Loop While Not isBreak And posSep > 0
Else
isBreak = False
End If

If isBreak Then
Select Case cSep
Case " "
nextLine = Left(nextLine, posSep - 1)
Case ",", ".", ":", ";", "?", "!"
nextLine = Left(nextLine, posSep)
Case "¿", "¡"
nextLine = Left(nextLine, posSep - 1)
posSep = posSep - 1
End Select
Else
posSep = Len(nextLine)
End If
End If
sCopia = Right(sCopia, Len(sCopia) - posSep)
End If

n = n + 1
ReDim Preserve RetBuffer(1 To n)
RetBuffer(n) = Trim(nextLine)
Loop

Convert2Lines = RetBuffer

End Function

Salud!




"El Nazgûl" escribió en el mensaje
news:
Hola a todo el mundo.
Hacía ya mucho que no me pasaba por este foro (veo que aún sigue "la
vieja guardia").

Al asunto:
Estoy desarrollando una macro en Excel (con vba) para realizar unas
tareas administrativas y enviar las cartas; todo esto se realiza a
través de otra aplicación (desarrollada por terceros y que no puedo
modificar en absoluto) que permite la ejecución de las macros de
Excel. En cierto momento he de poner el motivo concreto por el cual se
envía la carta, con datos concretos almacenados en variables.
Os pongo un ejemplo de como sería el código:

"Le comunicamos que su " & familiar & " tiene la obligación de "

Hasta aquí todo bien. Lo complicado es que el texto tiene como máximo
80 caracteres por línea y tengo que incorporarlos en el texto de la
aplicación. Además, ese mismo archivo de texto contiene más motivos,
pues en ocasiones tengo que poner más de uno (no puedo dar datos más
concretos por el carácter de mi trabajo, lo siento).

Mi pregunta es: ¿Cómo puedo crear el archivo de texto poniendo una
referencia para cada motivo y según el ejemplo de más arriba?

Preguntas similares