COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL EJEMPLOS DE MACROS OMAR ALBEIRO CARMONA SOSA CC.Nro. 71172622 DE CISNEROS ANT. APRENDIZ TECNICO EN SISTEMAS FICHA Nro. 299550 INSTRUCTOR: JHON JAIRO ALBA NORIEGA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL CISNEROS – ANTIOQUIA AÑO: 2012 OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL TABLA DE CONTENIDO INSERTAR UNA FUNCIÓN CON MACROS....................................................................................... 3 FUNCION SUMAR.SI EN UNA MACRO ........................................................................................... 5 NUEVA FUNCIÓN SUMAR.SI.CONJUNTO ...................................................................................... 6 FUNCION ENCONTRAR ................................................................................................................ 10 SUMAR VALORES EN NEGRITA EN EXCEL. ................................................................................... 13 OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL INSERTAR UNA FUNCIÓN CON MACROS. Para insertar una función en una macro realizamos el siguiente proceso: Si tengo la formula ActiveCell.Formula = "=SUBTOTAL(9,I3,I500)" , resulta que quiero cambiar en el valor I500 , el 500 por el valor que traiga una variable, (I&variable) si variable tiene el valor de 501, quedaría I501, me funciona en los rangos la siguiente formula Range("A" & variable).Select, pero en la anterior formula no he podido cambiar el 500 por el valor de una variable.... Efectivamente es posible incluir funciones o fórmulas en nuestras hojas de cálculo, a través de una macro, de esta manera tan directa. Lo único que hacemos realmente es determinar que queremos que se escriba en la celda deseada; todo lo que vaya entrecomillado se añadirá simplemente en esa celda elegida. Si tenemos claro esta clave, será fácil hacer el procedimiento. ActiveCell.Formula = "=SUBTOTAL(9,I3:I" & variable & ")" Desarrollémoslo con un ejemplo muy sencillo. Disponemos en nuestra hoja de cálculo de un listado de importes en el rango A1:A11, aunque sabemos que éste variará según crezca nuestra base de datos. Queremos conocer en cada momento cuál es la suma del rango vivo con el que trabajamos, en la celda C1. Nuestros valores actuales: OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL el código VBA de nuestra macro: 'macro que calcula la suma de todas las entradas de datos para el rango vivo A1:A??. Sub introducir_formula() 'con UsedRange determinamos el rango empleado actual en nuestra hoja de calculo. 'con .Rows.Count conocemos el total de filas del rango. ultfil = ActiveSheet.UsedRange.Rows.Count '¡¡cuidado ya que las funciones incluidas deben ir en Inglés!! Range("C1").Formula = "=SUM(A2:A" & ultfil & ")" End Sub 'macro que calcula la suma de todas las entradas de datos para el rango vivo A1:A??. Sub introducir_formula() 'con UsedRange determinamos el rango empleado actual en nuestra hoja de calculo. 'con .Rows.Count conocemos el total de filas del rango. ultfil = ActiveSheet.UsedRange.Rows.Count '¡¡cuidado ya que las funciones incluidas deben ir en Inglés!! Range("C1").Formula = "=SUM(A2:A" & ultfil & ")" End Sub Muy importante, no olvidar que las funciones empleadas dentro de este código deben aparecer escritas como en su versión en inglés!!!; ya que si no nos devolvería un error de #¿NOMBRE?. Al emplear, en este caso .UsedRange nos debemos asegurar que no existe ningún otro valor de en la hoja de cálculo, además de los necesarios para la suma. Si fuera así, tendríamos que emplear alguna otra instrucción o variable para determinar cual es la última celda de nuestro rango. OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL FUNCION SUMAR.SI EN UNA MACRO La función SUMAR.SI permite sumar valores de un rango de acuerdo a un criterio o condición. La función SUMAR.SI tiene 3 parámetros: 1. El primero es la referencia o el rango que contiene los valore sobre los que se evaluará la condición. 2. El segundo es el que contiene el criterio a aplicar con el objeto de determinar que se suma y que no 3. El tercero es opcional, esto quiere decir que si la condición esta en el mismo rango donde se efectúa la suma, no hace falta el tercer parámetro, pero si el criterio esta en un rango y donde se hace la suma en otro (u otros )rangos, entonces tiene que colocarse el tercer parámetro. Para aclarar las cosas que mejor que un ejemplo: Supongamos que una inmobiliaria tiene un listado con el valor de las propiedades que se vendieron en Enero y quiere saber la suma de aquellas que superaron los $160.000, para obtener la respuesta se emplea la función SUMAR.SI como se muestra en el gráfico En este caso con dos parámetros alcanza puesto que el criterio esta en la rango E2:E5, que el mismo rango donde se efectúa la suma con la condición dada y no hace falta poner =SUMA(E2:E5;">160000";E2:E5)...Si en cambio tenemos esta otra tabla OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Aquí si hace falta el tercer parámetro ya que el rango donde se efectúa el criterio (D2:D5) no es el mismo que el rango donde se efectúa la suma (E2:E5). NUEVA FUNCIÓN SUMAR.SI.CONJUNTO La función =SUMAR.SI.CONJUNTO que permite una suma condicional en base a varios criterios. Es similar a la función SUMAR.SI, pero en el caso de la nueva función se pueden utilizar hasta 127 nuevos criterios simultáneamente. =SUMAR.SI.CONJUNTO(rango_suma; rango_criterios1; criterios1; [rango_criterios2; criterios2]; …) El orden de los argumentos no es similar al de la función SUMAR.SI, por lo que se ha de tener cuidado si se reutiliza la fórmula antigua para introducir nuevos criterios. Veamos un caso práctico donde pretendemos determinar el importe comprometido en avales en el día de hoy. Disponemos de 25 proyectos de inversión o de ejecución de obra. Por cada proyecto pueden existir tres tipos de avales (A, B y C), y por cada uno de ellos existe una fecha de inicio, una fecha de finalización del aval y su importe. Puesto que cada día varía la fecha actual, se ha de recalcular diariamente. OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL La fórmula aplicada en I4 es: =SUMAR.SI.CONJUNTO(E14:E38;C14:C38;"<="&B8;D14:D38;">="&B8) Contestaré hoy a una petición curiosa que me ha llegado a través del mail. Un usuario quería que en una tabla definida en un rango concreto (A2:C5) se fueran acumulando cantidades según introducía entradas de datos: ...Quiero que en cada fila de concepto, pueda meter una cantidad y que se sume en acumulado, luego, en una 2ª entrada meter en otra cantidad y que acumule la de la 1ª entrada y la de la 2ª y así sucesivamente. Y todo esto que se pueda hacer en cada fila de conceptos. Como puedes ver en el siguiente ejemplo en la fila leche en la primera entrada meto 20 y acumula 20. En la segunda entrada en la misma casilla borro 20 y meto 30 y en acumulado debe quedar 50. En la tercera entrada en el concepto leche, en la misma casilla borro 30 y meto 40, acumulándose en la misma fila de acumulado 90. Así con el resto de filas: pan, tomate... Entrada 1 Concepto cantidad acumulado Leche 20 20 Pan 10 10 OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Tomate 40 40 Entrada 2 Concepto cantidad acumulado Leche 30 50 Pan 15 25 Tomate 25 65 Entrada 3 Concepto cantidad acumulado Leche 40 90 Pan 25 50 Tomate 5 70 Veamos cuál es la plantilla sobre la que volcaremos nuestra programación: La idea es que cada vez que el usuario introduzca los nuevos valores para la Leche, Pan y Tomate, podamos ejecutar nuestra macro, para que automáticamente genere la suma acumulada de esta entrada con todas las anteriores. Para ello he construido una macro muy sencilla, que ejecutaremos tras la introducción de los nuevos datos para los distintos conceptos de cada entrada. OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Abrimos el Editor de VBA (Alt+F11) e insertamos un nuevo Módulo, en el cuál incluiremos el siguiente código: 'macro que calcula el acumulado de todas las entradas de datos. Sub acumular() Dim iAs Integer x=1 For i = 3 to 5 'realiza la suma acumulada del valor anterior mas el nuevo 'para cada concepto (Leche, Pan, Tomate). Cells(i, 3).Formula = Cells(i, 3).Value + Cells(i, 2).Value 'limpia los campos para poder introducir los nuevos valores 'para cada concepto (Leche, Pan, Tomate). Cells(i, 2).ClearContents Next i 'Da formato personalizado, añadiendo el texto Entrada Range("A1").NumberFormat = """Entrada ""0" 'genera un autonumérico en la celda A1 'que nos indicará qué entrada es la última introducida. Range("A1").Value = Range("A1").Value + x End Sub Para ejecutar de manera cómoda nuestra macro, la asignaremos a un botón. Al ejecutar nuestra macro acumular conseguimos identificar la última entrada editada (celda A1), así como el último valor acumulado (rango C3:C5). OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Tras 5 entradas de valores hemos obtenido un acumulado de Leche 50, Pan 100 y Tomate 150, quedando lista la tabla para la edición de los valores de la siguiente entrada. FUNCION ENCONTRAR La función ENCONTRAR la puedes hallar dentro del grupo de las funciones de Texto como se ve en la imagen anexa: Importante tener en cuenta para su consideración: ENCONTRAR se utiliza con idiomas que emplean un conjunto de caracteres de un byte (SBCS) (SBCS) Single Byte Character Set: se utiliza para referirse a conjuntos de caracteres que utilizan exactamente un byte por cada carácter gráfico. ENCONTRAR siempre cuenta cada carácter como 1, ya sea de un byte o de doble byte, independientemente de la configuración predeterminada de idioma. En la imagen anexa se encuentra en detalle la sintaxis de la función ENCONTRAR: OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Texto_buscado: se refiere al texto que se desea encontrar. Dentro_del_texto: es el texto que a su vez contiene el texto que desea encontrar. Núm_inicial: especifica el carácter a partir del cual comenzará la búsqueda. El primer carácter de dentro_del_texto es el carácter número 1. Si omite núm_inicial, se supone que es 1. Importante para su consideración Las función ENCONTRAR distingue entre mayúsculas y minúsculas y no permiten el uso de caracteres comodín. Texto_buscado no puede contener ningún carácter comodín. Si texto_buscado no aparece en dentro_del_texto, ENCONTRAR devuelve el valor de error #¡VALOR!. Si núm_inicial no es mayor que cero, ENCONTRAR devuelve el valor de error #¡VALOR!. Si núm_inicial es mayor que la longitud de dentro_del_texto, ENCONTRAR y devuelve valor de error #¡VALOR!. Para que tengan un mejor entendimiento de la función ENCONTRAR planteamos el siguiente ejemplo: Supongamos que tenemos agrupados un cierto número de datos en una tabla y queremos encontrar la posición de un carácter en especifico dentro de una celda, los caracteres a encontrar son los siguientes: “ ; ”, “ , ”, “ . ”, “ / “, “ < “, “ ‘ “ , en la siguiente imagen anexa se detalla la tabla de datos donde se van a encontrar los datos: OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL En este caso como se observa en la imagen la sintaxis de la función quedaría de la siguiente manera: =ENCONTRAR(C11;B11;1) C11: Corresponde al texto buscado que en este caso es el carácter. B11: Corresponde a la celda donde se está buscando el texto a encontrar. 1: Corresponde al carácter a partir del cual comenzará la búsqueda. El resultado obtenido para este caso es 16 ya que esa es la posición en donde se encuentra el carácter. Cuando se ejecuta la función para todos los caracteres a encontrar en efecto se obtienen los resultados requeridos. OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL La función ENCONTRAR puede ser anidada con otras funciones de Excel esto va a depender de los resultados que ustedes requieran, no duden en practicar y utilizar esta función en casos en que lo amerite. SUMAR VALORES EN NEGRITA EN EXCEL. En la entrada de hoy veremos cómo realizar la misma operación empleando las macrofunciones de Excel 4.0 o funciones GET. (INDICAR.). Para esta labor utilizaremos la función: =INDICAR.CELDA(58;celda) que nos indica el tipo de estilo de la fuente de la celda seleccionada. Partimos del siguiente rango de celdas, donde tenemos algunos valores en negrita: Para poder trabajar con estas macrofunciones de Excel4.0 deberemos Crear un nombre definido, que llamaremos rngnegrita: OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL Si aplicamos esta macrofunción a nuestros elementos del rango A2:A11 obtendríamos Ya sólo nos quedaría trabajar sobre el conjunto de datos obtenidos mediante una función SUMAR.SI o bien sobre una suma condicional matricial: OMAR ALBEIRO CARMONA SOSA COMPLEJO TECNOLOGICO MINERO AGROEMPRESARIAL OMAR ALBEIRO CARMONA SOSA