Asignar un valor a un textbox mediante VBA

Me encuentro con una pequeña dificultad. Me explico:

He creado una función para cerrar y abrir de nuevo un formulario de modo que me actualice unos datos de un listbox (si no lo cerraba y lo volvía a abrir, no me los actualizaba...)

El código utilizado es el siguiente:

Public Function cierraabrehorarioespecialcambiar()
Unload horarioespecial  'cierro el formulario
horarioespecial.Show    'vuelvo a mostrarlo
[horarioespecial].[ACCIÓN] = "cambiar"   'asigno a un textbox (de nombre "ACCIÓN") el valor "cambiar"

End Function

Pero no funciona.

Para probarlo sin necesidad de abrir constantemente el formulario, he copiado el código en un botón de comando (quitando la primera línea que es la que lo cierra, ya que, en caso contrario, me daba error) y lo que he comprobado es que, cuando lo pulso por primera vez, no funciona. Si vuelvo a pulsar el botón de comando con el código, entonces funciona.

El problema se repite a la inversa, es decir, cuando abro el formulario desde el botón que creé específicamente para ello, la primera vez que lo pulso aparece con el valor "cambiar" en el textbox "ACCIÓN", y las sucesivas ocasiones en que lo pulso aparece en blanco, que es como debería aparecer...

¿Me podéis informar del motivo por el que ocurre esto?

1 Respuesta

Respuesta
1

En la propiedad del textbox donde dice text pones el valor que quiere que siempre apararesca

Lo Bueno es que lo puedes cambiar y con la opción que tiene de carga el userform de Nuevo vuelve el valor que le agregues

Recuerda valorar si te silve

Hola, gracias por tu pronta respuesta.

Verás, el problema no es ese. No me he explicado bien. Yo tengo un botón llamado "Verhorarioespecial" con el que abro el formulario "horarioespecial". Al pinchar en ese botón, el textbox "ACCIÓN" aparece en blanco (que es como debe aparecer). Hasta ahí, sin problemas. Ahora bien, en determinadas ocasiones, el formulario debe cerrarse y volverse a abrir para actualizar un listbox. Es en esos casos cuando el textbox "ACCIÓN" debe aparecer con la expresión "cambiar" (o "quitar", dependiendo desde dónde lo cierro y lo abro...), ya que, dependiendo de lo que aparezca en el textbox "ACCIÓN", en el formulario se muestran unos controles u otros.

Para probar cómo hacerlo, coloqué otro botón de comando (llamado "prueba") con el siguiente código:

Private Sub prueba_Click()
horarioespecial.Show
[horarioespecial].[ACCIÓN].Text = "cambiar"

End Sub

(en realidad esto se haría a través de una función que se invoca desde el mismo formulario y que, en primer lugar cerraría el formulario, para luego volver a abrirlo, pero para no tener que abrir el formulario cada vez que quiera probarlo, le puse el código en el botón "prueba", eliminando la línea que cierra el formulario y que es: "Unload horarioespecial")

El problema es que, al hacer click en "prueba", me abre el formulario pero no le asigna al textbox "ACCIÓN" el valor "cambiar", sino que lo deja en blanco. Ahora bien, si cierro el formulario y vuelvo a pinchar en "prueba", entonces sí que asigna el valor deseado a "ACCIÓN" y no entiendo el motivo por el que lo hace así.

Espero haberme explicado bien ahora.

Muchas gracias por tu respuesta y atención.

¿1 - es cargar el listbox cada ves que cierres un formulario para que se actualize?

2- ¿Es qeu te aparesca te active sierto botono o commando dependiento de una situacion?

¿3 - es que unicie el formulario cada por tiempo?

La parte de cerrar y abrir el formulario la podemos corregir

Y la de cargar el listbox cada ves que cierre un formulalio también

Lo que no entiendo mucho es por que el valor cambiar en el textbox

Es porque el mismo formulario se utiliza para distintas cosas, por ejemplo:

1. - Para ver en el listbox los períodos de días con horario especial que he tenido en un año determinado sin realizar ningún cambio

2.- Para cambiar cualquiera de esos períodos. En este caso, el formulario muestra, además del listbox, seis combobox para introducir el día de inicio del nuevo período (recordemos que queremos cambiar un período del listbox por otro nuevo...), el mes de inicio, el año de inicio, el día de fin del nuevo período, el mes final y el año final...

3.- Por último, también puede utilizarse, simplemente, para eliminar algún período, bien porque se haya producido algún error al introducirlo, o bien porque los jefes decidan no conceder dicho período...

En cualquier caso, aparte de mostrar esos controles cuando se pretende cambiar algún período, los botones de comando del formulario también reaccionarán de distinta forma en función del valor del textbox "ACCIÓN". 

Por ejemplo:

Private sub continuar_click()

If ACCIÓN = "cambiar" then

  Call cambioperiodo()

Elseif ACCIÓN = "quitar" then

  Call quitaperiodo()

...

End if

donde cambioperiodo y quitaperiodo son funciones que previamente he definido y que realizan las acciones oportunas en cada caso.

Lo que ocurre es que no quiero que el formulario muestre más controles de los necesarios en cada caso, ya que este programa lo utilizaremos, con toda probabilidad varios compañeros, y muchos de ellos todavía tienen MENOS idea que yo, que ya es decir...

Espero haber podido aclarar un poco tus dudas. Una vez más, muchas gracias por tu atención.

Para poder entender mejor tendría que ver tu archivo este es mi correo [email protected] así ver donde estas la falla

¡Gracias! Perdón por no haber respondido antes, pero estaba buscando la solución por mi cuenta :)

y ¡la he encontrado! El problema se planteaba al intentar asignar un valor directamente al textbox. La solución:

El valor no se lo asigno al textbox del formulario, sino a una celda de la hoja de datos. Este valor varía según las acciones que realice con el formulario, p. ej. :

Si pulso el botón "cambiar" en el formulario, la celda A100 (por poner un ejemplo) toma el valor "Cambiar", si pulso "quitar", toma el valor "Quitar"... Cuando pulso en "Finalizar", toma el valor "" (vacia o en blanco, para mi caso, da lo mismo)

Una vez hecho esto, en el evento "initialize" del formulario pongo

Private Sub UserForm_Initialize()
Me.ACCIÓN.Text = Worksheets("calendario").Range("A100").Value

'Donde ACCIÓN es el textbox que necesito que refleje el cambio y "calendario" es la hoja de datos a cuya celda le he cambiado previamente el valor.
End Sub

Después, en el evento "activate" del formulario doy las instrucciones para que me muestre unos u otros controles, p. ej.:

Private Sub UserForm_Activate()

Me.horarioespeciallist.RowSource = Worksheets("calendario").Range("cu20").Value

'actualizo el listbox
If ACCIÓN = "" Then
 dia1.Visible = False: diainicio.Visible = False: mes1.Visible = False: mesinicio.Visible = False...
'donde dia1, diainicio, mes1, mesinicio serían los controles que deben verse o no dependiendo del valor de ACCIÓn
ElseIf ACCIÓN = "cambiar" Then
 dia1.Visible = True: diainicio.Visible = True: mes1.Visible = True: mesinicio.Visible = True ...
' como veis, aquí se muestran unos controles que no se mostraban antes...
... 'aquí podemos poner las instrucciones que queramos y el formulario las ejecutará sin problemas...
End If
End Sub

Y listo, problema solucionado. Tal vez no sea la mejor opción, pero a mí me ha servido...

Muchísimas gracias por tu interés y ayuda.

Un saludo.

Me.horarioespeciallist.RowSource = Worksheets("calendario").Range("cu20").Value
If ACCIÓN = "" Then
quefechas.Visible = False: din.Visible = False: diainicio.Visible = False: min.Visible = False: mesinicio.Visible = False
ain.Visible = False: añoinicio.Visible = False: horaetiqueta.Visible = False: horas.Visible = False
dfin.Visible = False: diafin.Visible = False: mfin.Visible = False: mesfin.Visible = False: afin.Visible = False: añofin.Visible = False
continuar.Caption = "Cambiar" & vbCrLf & "Período"
finalizar.Caption = "Quitar" & vbCrLf & "Período"
ElseIf ACCIÓN = "cambiar" Then
quefechas.Visible = True: din.Visible = True: diainicio.Visible = True: min.Visible = True: mesinicio.Visible = True
ain.Visible = True: añoinicio.Visible = True: horaetiqueta.Visible = True: horas.Visible = True
dfin.Visible = True: diafin.Visible = True: mfin.Visible = True: mesfin.Visible = True: afin.Visible = True: añofin.Visible = True
continuar.Visible = True: finalizar.Visible = True
continuar.Caption = "Continuar"
finalizar.Caption = "Finalizar"
intro.Caption = "Estos son los períodos de horario especial con especificación de horas a realizar por día. Para cambiar alguno haz 'click' en la entrada correspondiente de la lista."
ElseIf ACCIÓN = "quitar" Then
quefechas.Visible = False: din.Visible = False: diainicio.Visible = False: min.Visible = False: mesinicio.Visible = False
ain.Visible = False: añoinicio.Visible = False: horaetiqueta.Visible = False: horas.Visible = False
dfin.Visible = False: diafin.Visible = False: mfin.Visible = False: mesfin.Visible = False: afin.Visible = False: añofin.Visible = False
continuar.Visible = True: finalizar.Visible = True
intro.Caption = "Estos son los períodos de horario especial con especificación de horas a realizar por día. Si deseas eliminar alguno haz 'click' en la entrada correspondiente de la lista."
continuar.Caption = "Continuar"
finalizar.Caption = "Finalizar"
End If

Perdón como veréis, después de la despedida se ha vuelto a volcar el código que tengo puesto en el evento "activate" del formulario. No hacer caso del mismo... :)

Me alegrfa sabe que pudiste solucionar jajajaaja

Saludos y nomolvides que estasmos para ayudar ejejejejje

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas