Contar líneas en un cuadro de texto

Como amenazaba hace un momento, aquí estoy otra vez con otra cuestión:

Resulta que, en la bd que estoy haciendo, introduzco los datos a través de formularios por resultar más cómodo para el usuario. Entre estos datos, están los de las cartas que tenemos que enviar a nuestros clientes. En ellas hay campos que ya están definidos. Es decir son datos fijos (por ejemplo características de un determinado producto, que siempre son las mismas). Para ello creé una tabla de apoyo llamada tproductos con cuatro campos que son:

Idproducto - campo autonumérico sin duplicados

Nombreproducto - campo texto

Características - campo memo

Líneas - campo número 'añadido después

Y la rellené con los datos correspondientes, poniendo en el campo líneas el número de líneas que ocupa el campo características. Añadí al final un registro en el que pone "otros productos" para casos en los que se trata de productos que no trabajamos habitualmente y sobre los que nos piden alguna información, en el que, lógicamente, no hay descripción de características ni nº de líneas.

Creé un formulario Fintroduccióndatos, en el que, aparte de los datos de los clientes, hay un combobox basado en la tabla tproductos, y un cuadro de texto llamado otrosproductos (que, en principio no es visible) para introducir el nombre y las características de aquellos que no están definidos en la tabla. Si el producto está en la tabla se selecciona del desplegable. En caso contrario, se selecciona "otros productos" del desplegable. Este evento provoca que la propiedad visible de otrosproductos quede establecida en True y así puede introducirse una descripción del producto. Por último, coloqué un botón de comando para mandar imprimir la carta y listo... Pues no. Mis jefes quieren ver una previsualización antes de enviar la carta, y además quieren poder modificarla en caso de que no les convenza. Así que en lugar de imprimir, lo que hace el botón de comando es abrir otro formulario "previsualización" en el que aparecen todos los datos. Ahora bien, estos datos los cargo en cuadros de texto en previsualización, por lo que, o tengo que poner cuadros muy grandes (y entonces queda fatal a la vista) o, como me ocurre más de una vez, se quedan cortos y no se ve todo el texto. Por ello se me ocurrió condicionar el tamaño al nº de líneas del texto (por eso añadí el campo líneas a tproducto) y funciona bien cuando conozco ese número, pero en los casos en los que tengo que rellenarlo a mano por no estar en la tabla, desconozco el nº de líneas que ocupará y, claro, no puedo condicionar el tamaño. Puedo utilizar Len(otrosproductos) y me cuenta los caracteres (basta luego con dividir el total por el nº de caracteres que entra en cada línea -que son 91 en mi caso- y me da el nº de líneas) hasta allí bien. Pero si utilizo la tecla Enter para cambiar de línea, o si alguna línea tiene menos de 91 caracteres el resultado ya no es el deseado lógicamente, pues da menos líneas de las que en realidad son.

¿Habría alguna forma de conseguir que me cuente las líneas? Da igual que sea compleja, yo he intentado varias cosas y se aproxima, pero no sale bien del todo.

1 respuesta

Respuesta
1

Me picó el gusanillo con esta consulta, y se me ocurrió esta idea:

1º/ En un módulo independiente (lo llamaré mdlCodigos) copias esta función pública (si sólo la vas a usar en ese formulario, la puedes copiar en el propio modulo del formulario como Private en vez de Public):

Public Function fncNumeroLineas(elTexto As String) As Long
Dim lineas() As String
Dim numLineas As Long, temp As Long
Dim i As Integer
'Creas un array con las lineas del texto
'entendiendo por linea el texto hasta un salto de carro (Chr(13)
lineas = Split(elTexto & Chr(13), Chr(13))
'Cuentas los elementos del array para saber las lineas
numLineas = UBound(lineas) + 1
'Ahora miras si las lineas tienen más de los 91 caracteres
'Uso el divisor entero "\" para ir acumulando el número
'El divisor siempre dará una linea menos de las que realmente son
'pero lo compensas con el recuento de arriba
For i = 0 To UBound(lineas)
temp = Len(lineas(i)) \ 91
numLineas = numLineas + temp
Next i
fncNumeroLineas = numLineas
End Function

2º/ Luego en el evento "Al activar registro" del formulario, le pones este otro, para que te rellene automáticamente el campo "lineas" con el número de lineas:

Private Sub Form_Current()

Me.Lineas=fncNumeroLineas(Nz(Me.Caracteristicas,""))

End Sub

3º/ Y con esto ya puedes establecer tus condiciones para tener contentos a tus jefes... XD

Fíjate bien en los nombres de tus controles, pues si realmente los tienes con acentos, deberás encerrarlos entre corchetes, por ejemplo: Me.[Líneas]

Hola. Muchas gracias por tu pronta respuesta Sveinbjorn

Perdoname pero no entiendo muy bien. Te comento:

Yo lo que tengo en el formulario es entre otras cosas:

Un cuadro de texto llamado otrosproductos en el que introduzco los datos (este es el cuadro del que quiero contar las líneas.

Otro cuadro de texto, llamado caracteres (este cuadro tiene la propiedad visible establecida a no, y es el cuadro en el que aparece el nº de caracteres que hay en el textbox otrosproductos)

Uno más llamado líneas (tampoco visible, en el que, en principio sale el resultado de dividir el valor de caracteres entre 91, es decir, debería dar el nº de líneas)

Por último tengo un botón de comando llamado mostrar.

La idea es la siguiente, escribo los datos que necesite en el cuadro de texto otros productos.

Le doy al botón de comando y me saca los caracteres y el nº de líneas. El código del botón mostrar, situado en el evento "al hacer click" es:

caracteres = Len(otrosproductos)

líneas = caracteres/91

Si consiguiera que me mostrara esto, ya después lo podría cargar a otro formulario...

Entonces, no entiendo cómo utilizar la función que me explicas, ya que no sé si debo substituir algo por lo que yo tengo en el formulario (no sé, ElTexto, líneas, numlíneas... son expresiones que yo no tengo y que no sé a qué corresponderían en mi caso.

Por otro lado, una vez creado el módulo, ¿Cómo debo llamar a la función? ¿Bastaría con Call fncNumeroLineas? Lo he intentado y me daba error, claro que seguro que he hecho algo mal.

¿Podrías indicarme cómo adaptar ese código a este formulario concreto que te comento?

Perdona mi ignorancia, pero es que soy muy, pero que muy novato.

Muchas gracias por tu atención.

Si copiaste la función a un módulo, en el código de tu botón pon:

caracteres = Len(otrosproductos)
líneas = fncNumeroLineas(Nz(caracteres,""))

Dicho esto, te explico la función:

Public Function fncNumeroLineas(elTexto As String) As Long

Public: indica que es un función pública, accesible a toda la BD (consultas, formularios...)

Function: indica que es una función, es decir, un procedimiento que devuelve un valor

FncNumeroLineas: es el nombre que le di a la función

ElTexto as string: es el parámetro que le pasas a la función y que es de tipo texto(string),, es decir, el texto del que quieres saber las lineas que tiene.

As Long: indica el tipo de datos que devuelve la función.

Las lineas que empiezan por Dim, son para declarar distintas variables y su tipo, que se usan en los cálculos intermedios.

Y el resto de la función está explicada en los comentarios. Si quieres más ayuda para saber de las funciones, coloca el cursor sobre ellas y pulsa F1.

hola otra vez. Muchísimas gracias por la explicación. Me queda claro, pero lo he probado y, en lineas saca siempre 2, independientemente de que ha escrito 4 o 500 caracteres y de que haya pulsado la tecla enter o no, siempre me da dos líneas. No sé, estoy pensando en poner alguna sentencia del tipo

Select Case caracteres

case 0 to 91

líneas = 1

case 92 to 182

líneas = 2

...

pero esta solución, aunque supongo que sí que funcionaría, tampoco es muy práctica. En primer lugar añado una cantidad de líneas de código que tal vez con otro tipo de función no sería necesario, y además esto tiene un límite de líneas (¿Cuántas pongo, hasta 100? ¿más de 100? no me convence mucho, la verdad...)

En fin, dejo abierta la cuestión por si se te ocurre dónde me he podido equivocar...

Muchas gracias otra vez.

Que te puse mal el código por escribir desde el móvil con prisas...

Sería así:

caracteres = Len(otrosproductos)
líneas = fncNumeroLineas(Nz(otrosproductos,""))

La función funciona razonablemente. Si se te diera el caso de que te da una linea de más, prueba a cambiar esta linea:

lineas = Split(elTexto & Chr(13), Chr(13))

por esta otra:

lineas = Split(elTexto, Chr(13))

Pues... ¡Sí Señor! funciona de maravilla.

En efecto da una línea más, pero si modifico el código, cuando tengo que pulsar la tecla Enter por ser una línea más corta que otra, entonces no me cuenta esa línea. Así que lo que hago es dejar el código como está, le añado al formulario otro textbox llamado totallineas y al botón de comando le añado la línea de código totallineas = lineas -1 y listo. Funciona como un reloj y me ha sido de gran ayuda.

Muchísimas gracias. Ya no sabía cómo salir y me iba a poner a meter líneas de código a lo bestia...

Ah! por cierto, soy yo quien tiene que pedir disculpas por ser tan cansino y no tú, que además de ayudarme (utilizando tu saber y, sobre todo tu tiempo) lo has hecho con muchísima amabilidad.

Gracias otra vez. Volveré a preguntar, seguro, para ver si voy aprendiendo un poco... Ojalá algún día pueda yo echar una mano a otros también.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas