miércoles, 1 de mayo de 2013

La desaparecida "Ficha Presentación" en Excel 2013


En Excel 2007 y 2010, cuando tenemos un gráfico seleccionado, obtenemos unas "Herramientas de gráficos" compuestas por 3 Fichas contextuales: Ficha Diseño, Ficha Presentación y Ficha Formato.


    La "Ficha Presentación" contenía botones y comandos para seleccionar cualquier parte de un gráfico, para insertar títulos, rótulos, leyendas, etc., para controlar la presentación de los ejes, para insertar líneas de tendencia, lineas de unión, etc.


    Un lector de este Blog me pregunta qué ha pasado con esta ficha en Excel 2013 y qué debe hacer para acceder a las funciones que contenía. Pues bien, el lector (y otros usuarios en su misma situación) no debe preocuparse, puesto que todas las funciones contenidas en la "Ficha Presentación" siguen existiendo. ¿Dónde?  .... no es difícil de averiguar.


    Cuando tenemos un gráfico seleccionado en Excel 2013, podemos ver varias etiquetas que flotan en la parte superior derecha del mismo. Si hacemos click en la primera de ellas (un signo + que corresponde a ELEMENTOS DE GRÁFICO), podemos ver que obtenemos un menú contextual en el que están prácticamente todas las herramientas que estaban en la "Ficha Presentación" :


    Si además hacemos click en cualquiera de las opciones de este menú, se despliega otro menú donde podemos "afinar" nuestras preferencias:



    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:













    lunes, 29 de abril de 2013

    Cómo añadir una serie de datos a un gráfico en 3 segundos


    Muchos de mis alumnos se sorprenden en los cursos que imparto, de un pequeño truco que explico en el módulo de "Gráficos y presentación de datos". Éste no es otro, que añadir a un gráfico (que ya tenemos hecho) una serie más de datos, tan sólo mediante copiar-pegar. Así de sencillo.

    Tenemos el siguiente gráfico, que representa sólo la primera de las series de la tabla (Línea 1):


    Si queremos agregar la serie de la "Línea 2", tan sólo tenemos que:

    PASO 1:

    Seleccionar y Copiar con CTRL-C el rango de celdas siguiente:



    PASO 2:

    Seleccionar el gráfico y hacer CTRL-V



    Si además queremos que en vez de columnas, sea una línea lo que represente a la Línea 2, debemos:

    • Hacer click con el botón derecho en cualquier columna de la Línea 2
    • Seleccionar la opción "Cambiar tipo de gráfico de series..."
    • Seleccionar uno de los gráficos de la galería de gráficos de línea y ACEPTAR.

    Obtendremos algo así:


    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:










    miércoles, 24 de abril de 2013

    Eliminar filas vacías en una hoja de Excel con VBA


    En el último curso de Excel que he impartido, durante la sesión que trataba de Visual Basic for Applications (VBA), un alumno me solicitaba un procedimiento (macro o subrutina) para automatizar la eliminación masiva de filas que estuvieran totalmente en blanco. Además, necesitaba indicar las filas primera y última de la zona donde era necesario el "rastreo" y eliminación.

    Voy a aprovechar la pregunta de este alumno para publicar en este post, una solución a dicho "problema".

    Comencemos:

    PASO 1:

    Presionar ALT+F11 para activar el editor de VBA y hacer click con el botón derecho en la carpeta "Microsoft Excel Objetos" del proyecto o libro que deseemos (si lo hacemos en la carpeta "Microsoft Excel Objetos" del libro de macros PERSONAL.XLSB ** que podremos ver en el explorador de proyectos, tendremos la macro disponible permanentemente en nuestro Excel... y no sólo disponible para un libro en concreto). En el menú contextual, seleccionamos "Insertar / Módulo":


    PASO 2:

    En la ventana de código del nuevo módulo, que se abre a la derecha, escribimos el siguiente código (o copiamos-pegamos del archivo que puede el lector descargarse al final de este artículo):

    Sub EliminarFilasVacías()

    'Variables y actualización de pantalla
        Dim FilaInicial As String
        Dim FilaFinal As Integer
        Dim Seguridad As Integer
        Application.ScreenUpdating = False


    'Introducción de fila inicial de rastreo
        On Error GoTo 1
        FilaInicial = InputBox("Introduzca nº de fila inicial para rastreo", "Fila inicial de rastreo")

        ActiveSheet.Range("A" & FilaInicial).Select

    'Introducción de fila final de rastreo
        FilaFinal = Val(InputBox("¿Hasta que nº de fila quiere rastrear?", "Última fila a rastrear"))
        If FilaFinal = 0 Then
            GoTo 1
        End If


    'Pregunta de seguridad
        Seguridad = MsgBox("¿Está seguro de eliminar todas las filas vacías?", vbYesNo, "¡Atención!")
        If Seguridad = vbNo Then
            Exit Sub
        End If

    'Rastreo y eliminación de filas vacías
        For I = ActiveCell.Row To FilaFinal
            If Application.WorksheetFunction.CountA(ActiveCell.EntireRow) <> 0 Then
                ActiveCell.Offset(1, 0).Select
            Else
                ActiveCell.EntireRow.Delete
            End If
        Next
    Exit Sub


    'Gestión de errores
    1 MsgBox "Ha introducido datos erróneamente o ha cancelado un cuadro de diálogo"

    End Sub

    Una vez hecho esto, cerramos el editor de VBA.

    PASO 3:

    Asignaremos la macro a una combinación de teclas. Para ello, en la Ficha Programador, hacemos click en el botón "Macros". Seguidamente, buscamos el nombre de nuestra macro (EliminarFilasVacías) TENIENDO SELECCIONADO EL LIBRO PERSONAL XLSB, y la seleccionamos. Después, hacemos click en el botón "Opciones..." y por último, introducimos la letra que deseamos acompañe a CTRL.




    Por supueso, también podemos asignar la macro a un botón (por ejemplo) o a una forma.
    Si desea ver en funcionamiento la macro y además poder copiarla a su libro de macros personal (en vez de escribirla), puede descargar el siguiente archivo:




    ** Recordamos que el libro de macros PERSONAL.XLSB es un libro que se abre de forma automática (en modo oculto) siempre y cuando exista en nuestro equipo. Para ello, tenemos que haber grabado alguna macro en él alguna vez, puesto que Excel lo crea automáticamente.


    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:













    lunes, 22 de abril de 2013

    Protegiendo celdas con "Validación de datos"



    Si queremos proteger una hoja o algunas celdas de una hoja de Excel, lo normal es acudir a las opciones de protección que tenemos en la ficha "Revisar", después de haber configurado el bloqueo de las celdas en las cuales deseamos restringir la escritura.

    Al hacer esto, muchos usuarios habrán comprobado los "efectos secundarios" que tiene el hecho de activar la protección de hojas y/o celdas: multitud de comandos y opciones de Excel quedan deshabilitados para la hoja que está protegida (aunque en el cuadro de diálogo en el que configuramos las opciones de protección y la contraseña seamos permisivos).

    Si lo que queremos es proteger el contenido de determinadas celdas (fórmulas, datos, etc), pero necesitamos mantener el resto de funcionalidades de Excel para esas celdas y para esa hoja, tenemos la opción de proteger mediante la herramienta "Validación de datos". Aunque es una protección de baja seguridad (sin posibilidad de contraseña), no tiene tantos "efectos secundarios", como decíamos anteriormente.

    Con "Validación de datos" podemos proteger los cambios que se producen en una celda siempre que estos se hagan mediante escritura (edición de la celda y escribiendo mediante teclado). Sin embargo, si una celda contiene una fórmula cuyo resultado cambia debido a que otras celdas cambian, se actualizará sin problemas. Esto nos sirve cuando tan solo deseamos evitar que alguien elimine o cambie fórmulas accidentalmente, pero queremos mantener el resto de funcionalidades de Excel (combinar celdas, agrupar filas o columnas, ordenar tablas, actualizar tablas dinámicas, etc.)

    ¿Cómo lo hacemos?

    PASO 1

    Seleccionamos todas las celdas que deseamos proteger, activamos la Ficha "Datos" y hacemos click en el botón "Validación de datos" que hay dentro del grupo de botones "Herramientas de datos". :

     


    PASO 2

    En el cuadro de diálogo "Validación de datos", concretamente en "Permitir", seleccionamos "Longitud del texto" y después en "Datos" elegimos "Igual a". Finalmente, en "Longitud" ponemos un número elevado, por ejemplo 9999:



    PASO 3

    A estas alturas, ya podemos "Aceptar" y en las celdas seleccionadas previamente en el PASO 1, no se podrán introducir datos mediante teclado, a no ser que la longitud de lo introducido sea de 9999 caracteres (altamente improbable).

    Lo que ocurre es que Excel nos muestra un mensaje por defecto:


    ... pero si queremos personalizarlo, tenemos algunas opciones interesantes:

    Opción 1:  El usuario obtiene un mensaje y NO puede cambiar el contenido de la celda escribiendo:


    Opción 2:  El usuario obtiene un mensaje, pero si lo desea SI puede cambiar el contenido finalmente:


    Opción 3:   El usuario obtiene un mensaje que sólamente advierte y el cambio en la celda se lleva a cabo.

    Para optar por una de estas opciones mostradas, lo debemos hacer desde la pestaña "Mensaje de error", cambiando el "Estilo· del icono y escribiendo nuestro mensaje personalizado:





    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:











    martes, 26 de marzo de 2013

    Declaración de variables en VBA para Excel (II)


    Si el lector ya está familiarizado con el concepto de variable en el primer artículo de la serie ¿Qué es una variable en VBA para Excel?  y también ha entendido el artículo Declaración de variables en VBA para Excel (I) , podría disponerse a leer este artículo que a buen seguro, le resultará interesante.

    En el anterior post hablábamos de variables que representaban a valores (ya sean fechas, números enteros, decimales, etc.). En este artículo veremos las variables que representan a objetos (debemos saber que en VBA llamamos objetos a cualquier elemento de Excel como hojas, celdas, gráficos, formas, tablas, etc.).



    Declarar variables de objeto está, si cabe, más justificado que declarar variables de valores, puesto que el ahorro en tiempo de escritura de código, en tiempo de ejecución del mismo, así como la organización y orden conseguidos en la estructura del procedimiento o macro, son espectaculares.

    ¿Cómo declarar una variable de objeto?

    La declaración de una variable de objeto sería:

    Dim Variable As TipoObjeto

    Que significa:

    Establecer Variable como TipoDeObjeto

    Una vez declarada la variable, se le puede asignar un tipo de objeto, pero en este caso (a diferencia de las variables asignadas a valores) debemos comenzar la línea con la palabra Set , como en esta macro:

    Sub VariableObjeto()

         Dim MiCelda As Range

         Set MiCelda = Worksheets("Hoja1").Range("A1")

         MiCelda.Value = 4560
         MiCelda.Interior.Color = RGB(166, 210, 241)
         MiCelda.Font.Italic = True
         MiCelda.Font.Bold = True

    End Sub

    La macro anterior declara la variable "MiCelda" como un rango, después asigna la variable a la celda A1 y posteriormente (en las últimas líneas) realiza varias acciones con la celda, nombrándola en todas las líneas siempre con el nombre de variable declarado al principio (en una línea inserta el valor 4560, en otra línea proporciona el color azul claro, en otra aplica cursiva y en la última aplica negrita).

    Si no hubiéramos utilizado una variable de objeto , el código de las 3 líneas que modifican la celda A1 podría  haber sido así de largo:

    Sub VariableObjeto()

         Worksheets("Hoja1").Range("A1")4560
         Worksheets("Hoja1").Range("A1").Interior.Color = RGB(166, 210, 241)
         Worksheets("Hoja1").Range("A1").Font.Italic = True
         Worksheets("Hoja1").Range("A1").Font.Bold= True

    End Sub

    El primer código se ejecuta de forma más rápida que este último, porque Visual Basic no tiene que buscar una y otra vez la ruta de la celda A1. Aunque aun podríamos perfeccionarlo (en cuanto a eficiencia) de la siguiente forma:

    Sub VariableObjeto()

         Dim MiCelda As Range

         Set MiCelda = Worksheets("Hoja1").Range("A1")

         With MiCelda

              .Value = 4560
              .Interior.Color = RGB(166, 210, 241)
              .Font.Italic = True
              .Font.Bold = True

         End With

    End Sub

    Siendo este el código más corto y rápido de todos.

    ¿Qué tipos de objetos pueden establecerse como variables?

    En el ejemplo anterior, el tipo de objeto era Range, puesto que se quería asignar la variable a una celda. También sería Range si quisiéramos asignarla a columnas, filas, etc.

    En el caso de querer asignar variables a un tipo de objeto "Hoja", deberíamos poner Worksheet . Otro ejemplo podría ser ListObject para referirnos a objetos tipo "Tabla de Excel". El usuario puede elegir el tipo de objeto al que refererirse en la lista que el editor de VBA ofrece mientras se escribre:


    Otras utilidades

    Declarar variables de objeto no sirve únicamente para acortar el código y hacerlo más eficiente, un ejemplo lo tenemos en el siguiente código, que utiliza una variable de objeto para que Excel vaya recorriendo una serie de hojas hasta que encuentra una que se llama "HojaClave" y la seleccione.

    Sub VariableObjeto()

         Dim MiHoja As Worksheet

         For Each MiHoja In Worksheets

              If MiHoja.Name = "HojaClave" Then
                   MiHoja.Select
              End If

         Next MiHoja

    End Sub

    Después de declarar la variable de objeto, utilizamos un bucle For Each - Next y dentro de él, utilizamos un condicional If - End If. Declarar una variable nos ha evitado tener que nombrar mediante código cada una de todas las hojas que tengamos para buscar la que deseamos.

    Si tradujéramos el código a lenguaje castellano, sería:

    Iniciamos Subrutina VariableObjeto()

         Establezco MiHoja como TipoDeObjetoHojaDeExcel

         Por Cada MiHoja En LaColecciónDeHojasDeMiLibro

              Si MiHoja.Nombre = "HojaClave" Entonces
                   MiHoja.Seleccionada
              FinalDelCondicionalSI

         ExaminarSiguiente MiHoja

    End Sub


    Recorrer hojas o celdas en busca de una que cumpla con una condición, es una de las utilidades mayores de la declaración de variables de objeto, puesto que permite utilizarse con bucles y condicionales que detectan si se cumple la condición que queremos y pueden actuar.

    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:








    Declaración de variables en VBA para Excel (I)


    Es conveniente leer el artículo ¿Qué es una variable en VBA para Excel? antes de abordar el actual, especialmente si el lector no conoce qué es una variable.

    Una vez que nos decidimos a utilizar una variable en nuestro código VBA de Excel, aunque no es obligatorio, lo ortodoxo es declararla previamente. Esto es, decirle a Excel de forma explícita que la vamos a utilizar.

    ¿Cómo declarar una variable?

    La forma por medio de la cual se declara una variable depende de varios factores. Uno de ellos es dónde la vamos a utilizar posteriormente (sólo en la macro actual o en otras macros). De momento nos vamos a referir a variables que se utilizan en una misma macro. Es decir, su vida y su ámbito de actuación es lo que tarda una macro en ejecutarse.

    Una declaración de variable sería:

    Dim Ventas As Double

    Que significa:

    Establecer Ventas como VariableTipoNúmeroDecimalDoble

    Una vez declarada, la variable se puede utilizar asignándole previamente un valor, como en esta macro:


    Sub Variable()

        Dim Ventas As Double

        Ventas = Hoja2.Range("A1").Value

        MsgBox ("Las ventas mensuales han sido " & Ventas * 0.03)
        Range("A2") = Ventas * 0.03
        MsgBox ("El promedio de ventas diarias ha sido de " & Ventas / 20)
        Range("A3") = Ventas / 20

    End Sub



    ¿Qué tipos de datos puede representar una variable?

    En el ejemplo anterior, era Double (tipo decimal que puede albergar valores con deimales desde +/- 5E-324 hasta 1.8E308 y nos ocupará 8 bytes en la memoria de nuestro ordenador) , pero por supuesto, existen otros que ocupan más o menos memoria y que tienen distintas características y posibilidades. Podemos ver un resumen en la web msdn de Microsoft.

    ¿Por qué declarar variables?

    Si no es obligatorio declarar variables, ¿por qué hacerlo?

    La ortodoxia en programación dice que las variables hay que declararlas, al igual que la ortodoxia en la creación de gráficos dice que es necesaria una leyenda para identificar las categorías representadas, al igual que la ortodoxia dice que nuestro hogar debe estar ordenado para vivir de forma más cómoda y eficiente.

    Si declaramos las variables:
    • Ocuparán menos espacio en memoria, que si no las declaramos (por defecto, Visual Basic asignaría el tipo variant que ocupa bastante memoria: 22 bits).
    • Nuestra macro será difícil de interpretar para otros usuarios que puedan necesitar leer el código VBA (incluso para nosotros mismos). Tener al principio de la macro una lista con las variables declaradas resulta muy util y aclarador.
    • Podríamos utilizar esa variable posteriormente en varias macros. En este caso, la forma de declarar la variable no es exactamente igual, sino que la línea  Dim Variable As TipoDato se debe colocar al principio de todo el módulo para que el ámbito de la variable sea precisamente de módulo y no a nivel de una macro concreta (ámbito local a nivel procedimiento):


    Está claro que si nuestra macro es muy pequeña y de uso totalmente particular quizá no sea necesaria la declaración de variables.

    Por último, decir que podemos hacer que el editor de VBA nos obligue a declarar las variables para evitar olvidos. Esto se hace desde el menú "Herramientas" y después seleccionando "Opciones..." y por último activar la siguiente casilla:


    Una vez hecho esto y a partir de ahora, veremos esto al principio de cada módulo que inciemos:


    ... y no funcionará cualquier variable que no haya sido declarada antes.

    En el siguiente artículo veremos la posibilidad y la forma de declarar variables objeto. Hasta ahora, las variables a las que nos hemos referido albergan valores (de un tipo u otro, pero valores), pero también las variables pueden representar a objetos.... como por ejemplo, celdas, hojas, etc. Veremos que en ocasiones son muy útiles las variables de objeto.

    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:








    lunes, 25 de marzo de 2013

    ¿Qué es una variable en VBA para Excel?


    Iniciamos con este artículo una serie dedicada a las variables en Visual Basic for Applications (VBA) para Excel.

    ¿Qué es una variable?

    En el ámbito de la programación en VBA, una variable es un nombre que hace las funciones de contenedor polivalente que puede albergar distintos valores o datos. De similar forma, en una ecuación todos sabemos que una X también hace las veces de contenedor que en un momento dado puede tener un valor, pero en otro momento o circunstancia puede tener otro distinto.


    Si queremos expresar la comisión que obtendrá un comercial (3%) en función de las ventas de pares de zapatos que hay en una empresa, podríamos hacerlo así:

    (Nº de pares de zapatos * 20 €)  * 0,03 = Comisión

    Pero si, por ejemplo, en un contrato o cualquier otro documento, repetidas veces debemos reflejar y dejar claro cómo se calcula la comisión del comercial sería mucho más eficiente representar el cálculo de las Ventas por una sola palabra... así:

    Ventas*0,03 = Comisión

    De esta última forma ahorramos tinta, papel,  tiempo de escritura y tiempo de lectura. Además, reducimos considerablemente el riesgo de faltas de ortografía y de olvidar el precio de venta por par de zapatos. Acabamos de utilizar la variable Ventas.

    Cuando estamos programando en Visual Basic ocurre lo mismo que en el ejemplo anterior. A veces necesitamos utilizar repetidas veces un valor que puede variar en algún momento dado y es conveniente asignarle un nombre que lo represente y que sea fácil recordar. Por ejemplo:

    Ventas = WorkSheets("Hoja1").Range("A1").Value

    Con la creación de la variable Ventas, cada vez que tengamos que hacer referencia e ella en nuestra macro o procedimiento, sólo tenemos que poner Ventas en vez de  WorkSheets("Hoja1").Range("A1").Value

    Un ejemplo de utilización


    Sub Variable()

        Ventas = Hoja2.Range("A1").Value

        MsgBox ("Las ventas mensuales han sido " & Ventas * 0.03)
        Range("A2") = Ventas * 0.03
        MsgBox ("El promedio de ventas diarias ha sido de " & Ventas / 20)
        Range("A3") = Ventas / 20

    End Sub


    ... en vez de haber escrito todo este código:


    Sub SinVariable()

        MsgBox ("Las ventas mensuales han sido " & Hoja2.Range("A1").Value * 0.03)
        Range("A2") = Hoja2.Range("A1").Value * 0.03
        MsgBox ("El promedio de ventas diarias ha sido de " & Hoja2.Range("A1").Value / 20)
        Range("A3") = Hoja2.Range("A1").Value / 20

    End Sub


    ... que es más ineficiente por ser más largo (más difícil de interpretar, lento alejecutarlo, susceptible de errores al escribirlo, etc.).

    Declaración de variables (introducción)

    Una vez dicho todo esto, debemos añadir que Excel interpreta de forma inteligente el tipo de variable a la que nos estamos refiriendo. Es decir, en los ejemplos anteriores la variable se refería a valores numéricos, pero en otros casos pueden ser textos, fechas, etc.

    Ese "reconocimiento inteligente" que hace Excel del tipo de variable, requiere la utilización de más memoria de nuestro ordenador (debido a que asigna por defecto un tipo de variable-comodín llamado "variant"y por lo tanto es conveniente facilitarle las cosas indicándolo nosotros en lo que se llama una "declaración de variable".

    Haciendo una analogía en otros ámbitos, cuando tenemos que interpretar un gráfico que tiene varias series o categorías, suele existir una leyenda que identifica cada serie con el tipo de gráfico. Pues esa leyenda sería la "declaración de series" similar a una declaración de variables en VBA.


    En el próximo artículo trataremos más a fondo el tema de la declaración de variables y por qué realizarla.


    Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company: