[AYUDA EXCEL] Optimizar codigo vb

19/11/2003 - 11:47 por Nilo | Informe spam
Hola,

Tengo un par de problemas en Excel, que seguro tienen una solución muy
sencilla... Pero "el que no sabe es como el que no ve" :( y este es mi
caso...

1.- Tengo un formulario de Excel que tiene un monton de TextBox (120)
pero en realidad solo 6 son diferentes, los demás repiten las mismas
instrucciones para cada TextBox en particular.

Pongo un ejemplo (en mi caso los TextBox estan renombrados como TOTx):

Private Sub TOT1_Change()

End Sub


Lo que quiero es escribir este argumento una sola vez y no 20 veces
(para TOT1,TOT2...TOT20)

¿Como puedo hacer para que el numero que identifica a mi textbox TOT sea
una variable del 1 al 20 valida en todo el formulario?


2.- Como puedo hacer referencia a un rango de TextBox. Es decir si
quiero sumar sobre un textbox TOTTOTAL los textbox TOT1 a TOT20???

Supongo que no tendre que mencionarlos uno a uno ¿no?...(
TOTTOTAL.BoundValue = Format((CDec(TOT1) + CDec(TOT2) + CDec(TOT3) +
CDec(TOT4) + CDec(TOT5) + CDec(TOT6) + CDec(TOT7) + CDec(TOT8) + CDec
(TOT9) + CDec(TOT10) + CDec(TOT11) + CDec(TOT12) + CDec(TOT13) + CDec
(TOT14) + CDec(TOT15) + CDec(TOT16) + CDec(TOT17) + CDec(TOT18) + CDec
(TOT19) + CDec(TOT20)), "#,##0.00;[Red]-#,##0.00")

3.- Y la ultima cosa, al confirmar mi formulario se tienen que llenar
unos rangos con el contenido de mis textbox... Algo así como...

For lineas = 1 To 20
Range("Importe_Ud" & lineas).Select
ActiveCell.Value = CDec(TOT & lineas)
Next lineas

Los rangos los encuentra sin problema pero no logro que interprete "TOT
& lineas" como mi textbox... Tal como esta me pone 1, 2, ...



En fin, ya veis que son lagunas de principiante y agradezco de antemano
cualquier sugerencia que me podais hacer.

Un saludo,
Nilo

Preguntas similare

Leer las respuestas

#1 Fernando Arroyo
19/11/2003 - 17:54 | Informe spam
"Nilo" escribió en el mensaje news:
Mostrar la cita
Je, sencilla. Bienvenido al apasionante mundo de los módulos de clase...

Mostrar la cita
He subido un ejemplo a la red:

www.excelsp.com/ejemplos/ejemplo_modulo_clase_formulario.xls

Si te fijas en el código que hay en el módulo de clase, los cuatro cuadros de texto del formulario se controlan mediante un solo evento Change y un solo evento DblClick. Es posible usar algún evento más, pero algunos, como Enter o Exit, no funcionan (o al menos a mí no me funcionan)


Mostrar la cita
En el formulario que he puesto de ejemplo hay un botón para sumar los cuadros de texto usando un bucle For...Next.

Mostrar la cita
Intenta:
ActiveCell.Value = CDec(Me(TOT & lineas))

Mostrar la cita
¿De principiante? Pues nos podemos preparar para cuando lleguen las de experto :-))
Un saludo.


Fernando Arroyo
MS MVP - Excel

Mostrar la cita
#2 Nilo
19/11/2003 - 21:36 | Informe spam
"Fernando Arroyo" wrote in
news:##EF$:


Muchas gracias Fernando por tu respuesta. Te cuento empezando por el
final:

Lo del bucle para rellenar la hoja ha funcionado añadiendo a TOT (nombre
de mi TextBox) unas comillas, es decir, ActiveCell.Value = CDec(Me
("TOT" & lineas)) es lo correcto. Mil gracias, de verdad :)). Le había
dado mil vueltas.

En cuanto a los módulos de clase me he quedado "pasmao" :(. He intentado
llevarlo a mi código pero no me pita (cada vez dice que no he definido
alguna variable... es curioso que proteste por un codigo que ejecutaba
sin problemas antes de añadir el modulo de clase...). Además, en mi
caso, el evento Exit es mayoritario y solo tengo (entre 120) 20 que sean
Change. Para rematarla la suma de los textBox (que yo necesito que se
haga en otro TextBox, no al pulsar un botón) es la de esos 20
"Changes"... Un lío, la verdad... y para no ahorrarme apenas código...

En fin, que yo creía que la cosa era más facil y provechosa pero veo que
nanainas :(

Prometo que pensé que preguntaba una tontería... Es el problema de ser
autodidacta: nunca sabes si has llegado... Y es que no me cuadraba que
no pudiera, simplemente, definir una variable (x= 1 to 20) y luego un
unico evento Change (o Exit) dirigido a TOT(x) o lo que yo quisiera...
(y me sigue sin cuadrar ;) eso por no hablar de sumar un rango de
TextBox (¿por qué no SUME(TOT1:TOT20)?)...

Quizás lo intente con más tiempo y si saco algo en claro lo comentaré en
el grupo. Por cierto, ¿hay documentación publicada sobre los módulos de
clase?

Gracias de nuevo. Me está quedando un código bonito de verdad ;)

Un saludo para todos.
Nilo


















Mostrar la cita
#3 Fernando Arroyo
20/11/2003 - 16:23 | Informe spam
"Nilo" escribió en el mensaje news:
Mostrar la cita
El libro de John Walkenbach Excel 2002 con VBA tiene, si mal no recuerdo, algo sobre los módulos de clase desde un punto de vista específico para formularios de Excel, pero desde el punto de vista general hay montones de artículos en la red.

Sobre el evento Exit, he estado haciendo algunas averiguaciones y todo apunta a que no funciona en los módulos de clase. Si lo que necesitas es validar un conjunto de cuadros de texto, quizás te sirva la técnica consistente en evaluarlos todos juntos mediante un bucle al terminar la entrada de datos y si alguno no supera la validación mostrar un mensaje y devolver el foco al control problemático usando el método SetFocus.
Un saludo.


Fernando Arroyo
MS MVP - Excel
#4 Nilo
20/11/2003 - 19:42 | Informe spam
"Fernando Arroyo" wrote in
news::

¿Es posible volver a un TextBox de forma automática si no es validado?

¿Cómo? Porque la instrucción TextBox1.SetFocus a mi no me "enfoca" nada :(

Gracias de nuevo por todas las molestias que te has tomado.

Saludos,
Nilo


Si lo que necesitas es validar un conjunto de cuadros de texto,
<quizás te sirva la técnica consistente en evaluarlos todos juntos mediante
<un bucle al terminar la entrada de datos y si alguno no supera la
<validación mostrar un mensaje y devolver el foco al control problemático
<usando el método SetFocus. Un saludo.
Mostrar la cita
#5 Fernando Arroyo
21/11/2003 - 12:45 | Informe spam
A mí sí me funciona el método SetFocus. Por ejemplo, este código (que está asociado al botón CommandButton1), hace lo que debe, sin problemas:

Private Sub CommandButton1_Click()
Dim n As Integer
For n = 0 To Me.Controls.Count - 1
If Left(Me.Controls(n).Name, 7) = "Validar" Then
If Me.Controls(n) = "" Then
MsgBox "El control " & Me.Controls(n).Name & " está vacío."
Me.Controls(n).SetFocus
End If
End If
Next n
End Sub


El código recorre todos los controles del formulario y si alguno de los cuadros de texto cuyo nombre empieza por "Validar" está vacío, muestra un mensaje y vuelve a él.

Si sigues sin conseguir que te funcione SetFocus, puedo mandarte un libro con el formulario del ejemplo, y si no te funciona sabremos que es algún problema del equipo o de la versión que tienes.
Un saludo.


Fernando Arroyo
MS MVP - Excel

"Nilo" escribió en el mensaje news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida