Vamos con la segunda parte, ya que un lector me ha dado pié a través de una muy interesante consulta: "cuando llamo a un formulario desde VBA (con el método Formulario.Show) este siempre aparece en el mismo lugar, en el centro de la pantalla. Por otra parte, y si el formulario está en pantalla, no puedo hacer click sobre ninguna celda, menú o barra de herramientas". Je, tiene razón. Al momento de presentar un UserForm en la pantalla... listo, perdimos "contacto" con Excel, hasta que lo descarguemos y volvamos a la hoja. ¿Se puede cambiar esto? Por supuesto, y a eso vamos.
vamos a enseñarle a este tipo que se en realidad se podría comportar un poco mejor.
[+/-] Ver el resto / OcultarOtra cosa, que agrego por cuenta propia: ¿notaron alguna vez que necesitaban que el usuario seleccione un rango para luego llamar al formulario y actuar sobre dicho rango? Es un poco pesado, por que si el usuario no seleccionó nada... ¿con que funciona nuestra macro? Veremos que es posible mostrar un UserForm en pantalla y que, a la vez, nos sea posible trabajar con las celdas de la planilla.
Tema x Tema:
1) Como cambiar la posición del formulario en pantalla.
En realidad es fácil, digamos que es lo mismo que cambiar la posición de casi cualquier objeto dentro de Excel: utilizando las propiedades Top (arriba) y Left (izquierda). Incrementando dichos valores iremos "corriendo" el formulario hacia donde lo necesitamos:
Vamos a suponer que necesito presentarlo sobre la esquina superior izquierda:
Private Sub UserForm_Activate() form1.Left = ActiveWindow.Left + 30 form1.Top = Range("a1").Top + 100 End Sub
Me fuí al evento Activate (cuando se activa) del Form y le ordené que se coloque 30 unidades mas a la derecha, por sobre la posición que ocupa la ventana activa (ActiveWindow). Luego le indico que tome como referencia el valor Top del rango A1, colocándolo 100 unidades por debajo. El resultado:
perfecto: donde yo quiero, y no donde lo coloca siempre Excel: en el centro de la pantalla
Dejo a la inquietud de mis lectores jugar con los valores de Left y Top para lograr distintas posiciones en la pantalla. No olviden usar las propiedades Left y Top de ActiveWindow y así tener un buen punto de referencia. Tambien con el Width (ancho) y Height (alto) de ActiveWindow poseeremos números para situarnos bien en la pantalla, "mirando" esos valores para saber en donde colocar los formularios.
Por ejemplo: "achicamos" o "agrandamos" la ventana activa de Excel, por lo que nuestro formulario aparecería fuera de la aplicación.... pero podríamos hacer esto:
form1.Left = ActiveWindow.Width - (form1.Width - 10)
para solucionar el problema y que el UserForm aparezca siempre dentro de la ventana. Idem para el Top.
(los valores son referenciales y cada uno deberá adaptarlo a su proyecto)
a esto me refiero: reducí considerablemente el tamaño de la ventana... pero al Form lo sigo teniendo "adentro" de Excel.
Existen algunas Apis de Windows para controlar mejor estos aspectos, pero como si decimos Api hablamos de funciones del Sistema Operativo... ¿para que meternos con ellas si podemos trabajar solamente con Excel? Cualquier duda o consulta al respecto me avisan.
2) Modificar las celdas cuando el UserForm está en pantalla.
Pogan un UserForm en el proyecto y haganlo aparecer.... ahora intenten clickear sobre una celda. Nada, ni mu. Solo podrán acceder a la planilla si quitan ese formulario. Pero hay una forma de llamarlo que nos permitirá realizar ambas cosas; esta es:
Sub Main() form1.Show vbModeless End Sub
Ahá, luego del método Show (mostrar) agregamos vbModeless.
Repasemos un poco: los formularios en Visual Basic, por defecto, son Modales, es decir, que no podremos interactuar con "otra cosa" hasta que lo cerremos. Para una comparación, vendrían a ser como los MsgBox: Uds. han visto que hasta que no damos "aceptar" o "cancelar".... no podemos tocar nada mas.
Bien, ese vbModeless lo hace "no modal", o sea: lo tengo ahí, pero puedo trabajar con otros objetos.
Nada mejor que un ejemplo: supongamos que tenemos que mostrar el rango seleccionado por el usuario y sumar todos los valores presentes en sus celdas. De la forma tradicional, primero deberíamos pedirle que seleccione y luego que llame al UserForm, pero ahora no.
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) With ActiveSheet form1.lblRango.Caption= Target.Address End With End Sub
Fuí al Workbook y en evento SheetSelectionChange (cada vez que cambien la selección de rangos en la hoja) muestre su Address (dirección) en un label.
Nos quedaría:
a pesar de tener el formulario en pantalla, pude seleccionar un rango y que su dirección aparezca en una label (etiqueta). Perfecto
El código para el botón de suma sería:
Private Sub CommandButton1_Click() Dim Rng, Celda As Range If lblRango.Caption <> "" Then Set Rng = Selection For Each Celda In Selection If IsNumeric(Celda.Value) Then valor = valor + Celda.Value End If Next Celda End If Me.Caption = valor Set Celda = Nothing Set Rng = Nothing 'Nota: tambien hubiese podido usar una WorsheetFunction.Sum(Rng) en lugar de un bucle 'sería mucho menos código y mas rápido, por eso se los aclaro, para que diferencien ambas formas de 'trabajo End Sub
Lo que nos brinda el siguiente resultado:
Ya estarán imaginando que de esta forma, mas o menos, trabaja Excel al presentarnos sus formularios propios, así que ahora no quedan excusas para aumentar y enriquecer aún mas la experiencia de nuestros usuarios/proyectos.
Suerte y cualquier duda la vemos.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario