martes, 18 de septiembre de 2018

Textbox (u otro control) flotante

Ya en una entrada anterior comenté cómo inmovilizar paneles para dejar rangos siempre visibles a medida que nos vamos moviendo por la hoja Excel.

El caso de hoy no tiene que ver con rangos o celdas sino con algunos controles, como puede ser un TextBox (o algún otro control) que necesitamos tenerlos visibles a medida que avanzamos por la hoja.

Ejemplo 1:
Veamos la siguiente imagen: a medida que vamos completando la columna se nos oculta el control donde ingresamos la información.

Una solución sería colocar el control por encima de una línea que inmovilice las primeras filas. En la siguiente imagen notamos que la fila 1 está inmovilizada y debiéramos colocar entonces allí el control.

Y la otra solución, que es el motivo de este tema, es que el control 'acompañe' el avance por las filas de la hoja. O sea que el control sea flotante.


Lo que haremos entonces es indicar que la propiedad Top del control es la misma que la de la celda que recibe el dato.
                 ActiveSheet.TextBox1.Top = Range("A" & x).Top

Nota: estos ejemplos presentan controles dibujados con la barra ActiveX.

Ejemplo 2:
En este segundo ejemplo contamos con 2 controles: un TextBox que nos permite ingresar la información y un Label que nos va mostrando la sumatoria del rango ocupado.


El código completo presenta estas instrucciones:
      Private Sub TextBox1_Change()
      'al limpiar el control no se ejecuta
      If TextBox1 = "" Then Exit Sub
     'al llegar a 11 caracteres vuelca el contenido a la hoja
      largo = Len(TextBox1.Text)
     If largo = 10 Then
         'busca la primer fila libre
          x = Range("A" & Rows.Count).End(xlUp).Row + 1
         Range("A" & x) = TextBox1.Text
        ' se acumula en el label el total
         totx = totx + Range("B" & x).Value
         Label1.Caption = Format(totx, "0.00")
        'limpia el control y permite una nueva entrada
        TextBox1 = "": TextBox1.Activate
        'ubicar el control en la línea de la celda
        ActiveSheet.TextBox1.Top = Range("A" & x).Top
        ActiveSheet.Label1.Top = Range("A" & x).Top
       'mover también el scroll
       ActiveWindow.SmallScroll Down:=1
    End If
    End Sub


Descargar el ejemplo desde aquí.

Ver VIDEO N° 13,


No hay comentarios.:

Publicar un comentario