En el grupo es.comp.bd.ms-access, con fecha 4/11/99 di la siguiente respuesta para la justificación de campos Memo, problema semejante al tuyo: Salvo que encuentres un control actveX que te permita solucionar el problema con fuentes proporcionales , la única solución que se me ocurre es que crees una función que te convierta los datos a cadenas de longitud constante con saltos de línea y retorno de carro entre ellas, para mostrarlas con una fuente de ancho fijo, como Courier ó MonoSpaced. Te adjunto un ejemplo de la función que he desarrollado para solucionar el problema; repito con fuentes de ancho fijo, no de ancho proporcional. Para ello deberás poner un cuadro de texto que no sea visible en la sección en la que quieras mostrar los datos, por ejemplo en la de detalle, teniendo como origen de datos el campo memo v.gr. txtMemo. También pondrás un cuadro de texto, esta vez visible v.gr. txtMemoFormateado, al que asignarás el resultado de la función en la que pasarás como parámetros el contenido del cuadro de texto oculto y la longitud de párrafo, en el evento "Al Imprimir". La función podría hacer lo siguiente. La cabecera podría ser: Public function TextoAParrafos ( _ byVal Texto as string, _ ByVal Parrafo as long) _ as string Por tanto si quisieras que el cuadro de texto txtMemoFormateado tuviera una achura de 60 caracteres harías If len(txtMemo)>0 then txtMemoFormateado= TextoAParrafos(txtMemo,60) end if '************************************************************************ ' TextoAParrafos(Texto,Parrafo) --> String ' Función desarrollada por Eduardo Olaz ' Primera versión 4/11/99 ' Última revisión 4/11/99 '************************************************************************ ' parámetros: Texto (por valor, string) Texto que se quiere convertir ' Parrafo (por valor, long) Longitud máxima del párrafo ' Valor devuelto (String) Cadena transformada ' Método: Recursivo ' Funciones auxiliares: SubParrafo(Texto,Parrafo) --> String ' PosicionCorte(Texto,Parrafo)--> Long ' Devuelve la cadena Texto transformada 'en párrafos de longitud igual a Parrafo ' salvo que se encuentre un salto de línea ó retorno de carro ' que hará que ese párrafo sea más corto. ' Para igualar los párrafos inserta espacios junto a cada espacio ' hasta completar una línea de longitud constante ' esta función se usa de forma recursiva cortando ' la cadena Texto hasta que el último trozo es ' de longitud <= que Parrafo Public Function TextoAParrafos(ByVal Texto As String, _ ByVal Parrafo As Long) _ As String Dim lngLongitudTexto As Long Dim lngPuntoCorte As Long 'punto por donde cortar la cadena Dim strTextoIzquierda As String 'cadena a la izquierda del corte Dim strTextoDerecha As String 'cadena a la derecha del corte Dim strCaracter As String * 1 lngLongitudTexto = Len(Texto) If lngLongitudTexto <= Parrafo Then TextoAParrafos = Texto Else lngPuntoCorte = PosicionCorte(Texto, Parrafo) strTextoIzquierda = RTrim(Left$(Texto, lngPuntoCorte)) strCaracter = Mid$(Texto, lngPuntoCorte) If (strCaracter = vbNewLine Or strCaracter = vbLf) Then ' Se ha detectado final de párrafo strTextoDerecha = Mid$(Texto, lngPuntoCorte + 1) TextoAParrafos = strTextoIzquierda & _ TextoAParrafos(LTrim$(strTextoDerecha), Parrafo) Else ' Añadir espacios en los huecos hasta longitud de parrafo strTextoIzquierda = SubParrafo(strTextoIzquierda, Parrafo) strTextoDerecha = Mid$(Texto, lngPuntoCorte + 1) TextoAParrafos = strTextoIzquierda & vbCrLf & _ TextoAParrafos(LTrim$(strTextoDerecha), Parrafo) End If End If End Function '************************************************************************ ' PosicionCorte(Texto,Parrafo) --> Long ' Función desarrollada por Eduardo Olaz ' Primera versión 4/11/99 ' Última revisión 4/11/99 '************************************************************************ ' parámetros: Texto (por valor, string) del que obtener pto. de corte ' Parrafo (por valor, long) Longitud máxima del párrafo ' Valor devuelto (Long) Punto por el que cortar la cadena Texto ' Método: Iterativo Public Function PosicionCorte(ByVal Texto As String, ByVal Parrafo As Long) As Long Dim lngLongitudTexto As Long Dim lngContador As Long Dim strCaracter As String * 1 Dim strIzquierda As String lngLongitudTexto = Len(Texto) ' Recorre carácter a carácter la cadena ' hasta la posición Parrafo. ' esta búscqueda se interrumpe si encuentra una carácter ' de retorno de carro o salto de línea o si se acaba la cadena Do While lngContador < Parrafo And _ lngContador <= lngLongitudTexto _ And strCaracter <> vbNewLine _ And strCaracter <> vbLf lngContador = lngContador + 1 strCaracter = Mid$(Texto, lngContador, 1) Loop If lngContador < Parrafo Then PosicionCorte = lngContador Else Select Case strCaracter Case vbNewLine, vbLf PosicionCorte = lngContador ' Si encuentra un espacio en blanco o un tabulador ' en la última posición recorre la cadena hacia la izquierda ' hasta encontrar un carácter Case " ", vbTab Do While (strCaracter = " " Or strCaracter = vbTab) lngContador = lngContador - 1 strCaracter = Mid$(Texto, lngContador, 1) Loop PosicionCorte = lngContador + 1 Case Else ' Busca un espacio en blanco o tabulador a la izquierda ' para efectuar el corte en un blanco PosicionCorte = lngContador Do While (strCaracter <> " " _ And strCaracter <> vbTab _ And lngContador > 1) lngContador = lngContador - 1 strCaracter = Mid$(Texto, lngContador, 1) Loop 'Extrae la cadena sin blancos a la derecha strIzquierda = RTrim(Left$(Texto, lngContador)) PosicionCorte = Len(strIzquierda) End Select End If End Function Public Function SubParrafo(ByVal Texto As String, _ ByVal Parrafo As Long) _ As String ' Devuelve una cadena contenida en la parte izquierda de Texto ' de longitud menor ó igual que el valor de parrafo Dim lngContador As Long Dim lngLongitudTexto As Long Dim lngBlancos As Long Dim lngBlancosPorEspacio As Long Dim lngEspacios As Long Dim lngPosicion As Long Dim strCaracter As String * 1 Dim strLadoIzquierdo As String Dim strLadoDerecho As String Dim lngEspacioActual As Long Dim astrEspacios() As String lngLongitudTexto = Len(Texto) If lngLongitudTexto = Parrafo Then SubParrafo = Texto Else lngBlancos = Parrafo - lngLongitudTexto ' Averiguar el nº de espacios en blanco que hay en texto For lngPosicion = 1 To lngLongitudTexto strCaracter = Mid$(Texto, lngPosicion, 1) If strCaracter = " " Then lngEspacios = lngEspacios + 1 End If Next lngPosicion If lngEspacios = 0 Then SubParrafo = Texto Else ' Uso la matriz dinámica astrEspacios para almacenar ' los blancos a añadir ReDim astrEspacios(1 To lngEspacios) lngBlancosPorEspacio = lngBlancos \ lngEspacios For lngContador = 1 To lngEspacios astrEspacios(lngContador) = Space(lngBlancosPorEspacio) Next lngContador For lngContador = 1 _ To lngBlancos - lngBlancosPorEspacio * lngEspacios astrEspacios(lngContador) = astrEspacios(lngContador) & " " Next lngContador For lngPosicion = 1 To lngLongitudTexto strCaracter = Mid$(Texto, lngPosicion, 1) strLadoIzquierdo = strLadoIzquierdo & strCaracter If strCaracter = " " Then lngEspacioActual = lngEspacioActual + 1 strLadoIzquierdo = strLadoIzquierdo _ & astrEspacios(lngEspacioActual) End If Next lngPosicion SubParrafo = strLadoIzquierdo End If End If End Function Lo he probado y funciona. Falta añadirle algún control de excepciones a las funciones y algún toque personal Pero eso para ti supongo que será fácil. Si quisieras hacer lo mismo con fuentes proporcionales, por ejemplo la Arial, la cosa se complicaría ya que deberías calcular la anchura ocupada por cada letra, asignándo esos valores a una matriz, por ejemplo que tomara como índice el ascii de cada carácter e ir comprobando carácter a carácter la anchura que va tomando el párrafo. En vez del número de caracteres por párrafo deberías definir la anchura del párrafo y modificar la función que te he desarrollado. Espero haberte ayudado. Saludos: Eduardo Olaz Con fecha 29/2/2000 Amazing, en ese mismo grupo añadió las siguientes respuestas RESPUESTA 2: En la siguiente dirección hay una utilidad que se llama Total Access Memo que en teoría permite hacer eso. www.fmsinc.com/free/demos/index.html Es una version demo y ocupa 2,7 Mb. Además el servidor es bastante lento yo he intentado traerla varias veces y todavía no he podido. Espero que os sirva. RESPUESTA 3 : si no recuerdo mal, en las paginas de Guille(Visual Basic) http://guille.costasol.net habia algun control (o similar) para hacer lo que estais diciendo Saludos: Eduardo Olaz Para contestar personalmente quitar las XXX de mi dirección Isidoro J. Casanova López escribió en el mensaje de noticias 38DA4547.608682FC@alu.um.es... Estoy realizando un informe que consiste en una carta comercial, la cual contiene campos de la base de datos. Pues bien, no escuentro como PODER JUSTIFICAR todo el texto que escriba. Solo encuentro alinear a la izquierda, derecha, o centrar. ¿Alguien sabe si se puede Justificar un texto? Gracias.