[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:
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...




Je, sencilla. Bienvenido al apasionante mundo de los módulos de clase...

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?





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)


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")




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

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, ...





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


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




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


Fernando Arroyo
MS MVP - Excel

Un saludo,
Nilo
Respuesta Responder a este mensaje
#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


















"Nilo" escribió en el mensaje
news:
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...




Je, sencilla. Bienvenido al apasionante mundo de los módulos de
clase...

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?





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)


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")




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

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, ...





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


En fin, ya veis que son lagunas de principiante y agradezco de


antemano
cualquier sugerencia que me podais hacer.




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


Fernando Arroyo
MS MVP - Excel

Un saludo,
Nilo
Respuesta Responder a este mensaje
#3 Fernando Arroyo
20/11/2003 - 16:23 | Informe spam
"Nilo" escribió en el mensaje news:
"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





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
Respuesta Responder a este mensaje
#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.


Fernando Arroyo
MS MVP - Excel
Respuesta Responder a este mensaje
#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:
"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.
>
>
> Fernando Arroyo
> MS MVP - Excel

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida