sábado, 17 de febrero de 2018

Atajos de teclado

En esta segunda entrada del blog Aplica_Excel hablaremos de los distintos atajos para realizar tareas desde una aplicación Excel.

Seguramente muchos acostumbrarán a manejarse dentro de la hoja Excel con los atajos propios de la aplicación. Desde las combinaciones con tecla CTRL, pasando por las teclas de función (F1 a F12) hasta combinaciones con otras teclas como ALT y MAYUSC.
Las habituales que seguramente la mayoría utiliza: CTRL C (copiar), F1 para acceder a la Ayuda, y tantas otras. Pueden descargar una lista bastante completa desde aquí.

Pero también podemos utilizar atajos de teclado para ejecutar botones dibujados en una hoja o dentro de un Userform.
  •       En una hoja:
En la siguiente imagen contamos con un menú de opciones y lo hemos presentado con botones de la barra Formularios
Para ejecutar cada botón u opción le asignamos atajos de teclado con tecla CTRL y una letra que nos relacione con la tarea.
Esto lo logramos desde la ficha Desarrollador, Macros, seleccionándola y desde el botón Opciones le asignamos la letra deseada.





   
















Por ejemplo, para la Gestión de Usuario utilicé la letra U (mayúsculas o minúscula será lo mismo). 
Y al botón Cerrar Sesión le asigné la letra S.


También una macro asociada a una imagen puede ser ejecutada haciendo clic sobre la imagen o con un atajo de teclado, como en este caso donde le asocié el atajo CTRL R.


Si tenemos botones ActiveX dibujados en una hoja también podemos asignarle atajos, pero en éstos necesitamos asociar la letra desde la propiedad Acelerator del control.
- Desde la ficha Desarrollador, pasaremos a Modo Diseño.
- Seleccionamos el control con clic derecho, Ver Propiedades.
- En la propiedad Acelerator introducimos la letra para ese atajo.
- Desactivamos el Modo Diseño.


  • Atajos dentro de un formulario: 
Al activar un formulario podremos ejecutar cada botón de comando con teclas aceleradoras, asignándole una letra que aparecerá subrayada. Nuevamente aquí tratamos de relacionar la letra con la tarea a realizar o texto del botón.


Para asignar estas teclas trabajaremos desde el Editor.
Se selecciona cada CommandButton y desde su propiedad Acelerator se establece la letra a utilizar.
Para ejecutarlo se presionarán juntas las teclas ALT y la letra elegida. Para este caso: ALT R


 Otro ejemplo con ALT N


Las teclas aceleradoras pueden ser asignadas a cualquier tipo de control. Veamos el caso de los OptionButton. Nuevamente aquí les he asignado una letra que tenga relación (en lo posible) con el texto. Al avanzar con la tecla aceleradora ( ALT T) automáticamente se marcará esa opción.


De este modo, avanzando con Enter Tab y llamando a diferentes comandos con sus teclas asociadas, la carga de un formulario será muy ágil.

  • Formulario diseñado en hoja Excel:

Este último ejemplo no es exactamente sobre atajos de teclado, sino en cómo avanzar por los distintos campos sin utilizar el ratón cuando tenemos un formulario diseñado en una hoja.

Como Excel trae de modo predeterminado, todas las celdas bloqueadas debemos seleccionar aquellas donde vayamos a ingresar o modificar datos y las dejaremos desbloqueadas desde el menú Formato, Protección
En este ejemplo seleccionamos solo las celdas de color considerando que aquí ingresaremos datos. El resto se completará con fórmulas.


Solo resta proteger la hoja (la clave es opcional) para observar su funcionamiento. De este modo el avance con Enter o Tab se realizará solo por las celdas desbloqueadas.


Descargar archivo Excel con ejemplos desde aquí





viernes, 16 de febrero de 2018

Autoajuste de filas


Una de las tareas que más dificultad presenta en Excel es la de ajustar el alto de fila según datos ingresados. En especial si se trata de celdas combinadas.

Son muchas las situaciones que pueden presentarse ….. trataré de ejemplificar la mayor cantidad de casos posibles, ya sea que se trabaje con una columna única o columnas combinadas.

En estos VIDEO 1 y VIDEO 2 se muestra la ejecución de todos los casos que a continuación resumo:

a- Tabla de datos donde una columna x debe ser autoajustada para mostrar todo el texto en una fila. La columna tendrá activada su propiedad Ajustar Texto. De ese modo al escribir en una celda de esa columna elegida automáticamente se autoajustará el alto de fila.

b- Tabla de datos con columnas combinadas. El alto de las filas se autoajusta mediante código que se coloca en el objeto HOJA donde se trabajará.

Private Sub Worksheet_Change(ByVal Target As Range)
'se controla lo ingresado en celdas D:E, a partir de fila 3
If Intersect(Target, Range("D:E")) Is Nothing Then Exit Sub
If Target.Row < 3 Then Exit Sub

'autoajuste celda en col D:E
fily = Target.Row
'ancho de columnas combinadas
    anchocol = Range("D" & fily).ColumnWidth + Range("E" & fily).ColumnWidth
'alto normal de la fila
    alto = 15
'se evalúa cuántos saltos de renglón existen en texto
Set c = Range("D" & fily)
saltos = Len(c) - Len(Application.WorksheetFunction.Substitute(c, Chr(10), vbNullString))
'si no hay saltos de renglón utiliza un método de cálculo, sino otro
If saltos = 0 Then
    anchotexto = Len(Target.Text)
    If anchotexto <= anchocol Then
        Target.RowHeight = 15
        Exit Sub
    End If
    dif = (anchotexto - anchocol) / anchocol
    If Round(dif) < 2 And anchotexto > anchocol Then
        dify = 2
    ElseIf dif > Int(dif) Then
        dify = Round(dif) + 1
    Else
        dify = Int(dif)
    End If
    cantfilas = alto * dify
Else
    'evalua cuantos renglones utiliza el párrafo
    Z = 1: canti = 0
    For x = 1 To saltos + 1
        salto1 = InStr(Z, c, vbLf)
        If salto1 > anchoCol Then
            canti = Int(salto1 / anchoCol) + canti
        End If
        Z = salto1
    Next x
    cantfilas = alto * (saltos + 1 + canti)
End If
'se asigna el alto obtenido
With Range("D" & fily)
    .RowHeight = cantfilas
    .WrapText = True
    .HorizontalAlignment = xlLeft
End With
End Sub


c- Datos obtenidos desde un formulario o Userform. Nuevamente aquí ya podemos dejar asignada la propiedad Ajustar Texto en la columna de Descripción.
Si no configuramos de antemano esta columna con la propiedad Ajustar Texto, lo podremos indicar para cada celda al momento de guardar datos en la columna D con esta instrucción:

Range("D" & fily).WrapText = True

d- Datos obtenidos desde un formulario o Userform, desde un control con varias líneas.

En primer lugar, se ajustará la propiedad MultiLine en True para el control que recibirá el texto.
Para pasar al renglón siguiente al momento de introducir el texto, se presionarán juntas las teclas Mayúsc + Enter.

Al realizar el guardado, la instrucción indicará que se trata de una celda con Ajuste de texto tal como hemos visto en el punto anterior, con la instrucción:

Range("D" & fily).WrapText = True


e- Celdas combinadas. 
Al igual que en los ejemplos anteriores, podemos trabajar con un campo textbox de una sola fila (sin saltos de renglón) o en modo columna.

En este ejemplo contamos con columnas combinadas (D:E) para contener el texto de la Descripción. Y el control textbox del formulario tendrá su propiedad MultiLine en True














La diferencia en el código tratándose de celdas combinadas, es que aquí se necesita calcular cuántas filas son necesarias para mostrar el texto completo considerando el total de columnas utilizadas para el texto. En el ejemplo utilizamos las columnas D:E

         'ancho de columnas combinadas 
anchoCol = Range("D" & fily).ColumnWidth + Range("E" & fily).ColumnWidth 

Las instrucciones para pasar a la hoja el campo Descripción y llamar a la macro que calcula filas necesarias, serán las siguientes:

       Range("D" & fily) = TextBox6        'descripción
       'autoajuste celda en col D:E
       Call calcula_AltoFila

Y en un módulo dentro del mismo formulario se encontrará la subrutina.

        Sub calcula_AltoFila()
       ‘instrucciones
       End Sub



NOTA: la variable fily que se utiliza en las 2 subrutinas debe estar declarada al inicio del formulario o Userform con esta instrucción:

        Dim fily As Long


Por último, solo quedaría agregar una instrucción para que los textos de toda la fila ajustada se presenten de modo centrado, con esta instrucción que se agrega al botón de guardado (ACEPTAR) al finalizar todo el pase de datos:

Range("A" & fily).EntireRow.VerticalAlignment = xlCenter

              VIDEO 1     VIDEO 2
    

              (descargar modelo completo en Excel desde aquí)