tag:blogger.com,1999:blog-79831884661683954842024-03-13T02:50:30.007+01:00Hojas de cálculo ExcelEl pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.comBlogger133125tag:blogger.com,1999:blog-7983188466168395484.post-62528404548657829342017-01-20T17:01:00.000+01:002017-01-25T09:28:02.677+01:00Aplicación en Excel para el cálculo de préstamos (todo en uno)En esta ocasión, no vamos a hacer ninguna nueva aplicación, ni ninguna utilidad que no hayamos visto antes en el blog. Lo que voy a presentaros es simplemente un libro de Excel, donde tendremos integradas las siguientes aplicaciones:<br /><br />- <b>Cálculo de préstamos e hipotecas mediante el método francés</b> (el común y usual en este tipo de operaciones): cuotas constantes, donde el capital que se amortiza va creciendo en cada cuota, y los intereses van decreciendo en cada cuota.<br /><br />- <b>Cálculo de préstamos según el método americano</b>: cuotas constantes excepto la última que es donde se amortiza el principal del préstamo. Las cuotas constantes sólo llevan cargo de intereses.<br /><br />- <b>Cálculo de préstamos con amortización de capital constante</b>: cuotas variables y decrecientes, con amortización de capital constante en cada cuota, e intereses decrecientes en cada cuota.<br /><br />- <b>Calcular una TAE</b> (tasa anual equivalente, o tasa anual efectiva) y <b>un interés nominal</b>.<br /><br />Todo esto ya lo hemos visto en el blog, en diferentes artículos, así que no volveremos a explicarlo. Simplemente he juntado todo en la misma aplicación, para tenerlo bien ordenadito, y no tener que abrir cuatro ficheros para calcular esas cuatro cosas diferentes.<br /><br />
De momento es la primera versión, con lo que no descarto ampliarla en un futuro.<br /><br />Aquí os dejo un pantallazo de lo que se os cargará al abrir el fichero Excel. Recordad habilitar las macros, para que la aplicación sea totalmente funcional:<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qehJ1ilExVvHuFDvK0LsrOIxqOfsGVEBsPC29OjviQguvBeIrpOhmJpDJCWa06ZzDGnfd8UHKHawAx4r-2iHDcsfeQE-_kY3AolWrzAex0td0xvX7hEHK7-f_LWgH9RuqTyoXsq4oDLy/s1600/calculadora-financiera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qehJ1ilExVvHuFDvK0LsrOIxqOfsGVEBsPC29OjviQguvBeIrpOhmJpDJCWa06ZzDGnfd8UHKHawAx4r-2iHDcsfeQE-_kY3AolWrzAex0td0xvX7hEHK7-f_LWgH9RuqTyoXsq4oDLy/s1600/calculadora-financiera.png" /></a></div><br />
Desde aquí, podéis <a href="http://www.mediafire.com/?q7qapac7p0n7qrp" title="descargar el libro de Excel" target="_blank" rel="nofollow">descargar el libro de Excel</a>, con el ejemplo que hemos visto en este artículo.
El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com0tag:blogger.com,1999:blog-7983188466168395484.post-68277161992676494302015-12-09T20:31:00.000+01:002016-08-10T14:49:58.324+02:00Determinar las cabeceras de una tabla donde tenemos los valores buscadosEn el artículo anterior, vimos un ejemplo un poco rebuscado, para determinar en qué columnas (A, B, C…) se encontraban una serie de valores que teníamos en una tabla. La utilidad de ese ejercicio era poca, para qué negarlo :-( pero fue un reto interesante, para saber hasta qué punto Excel puede convertirse en una herramienta a medida, en la que podemos implementar funciones que no vienen de forma nativa dentro de la aplicación.
<br /><br />
Ahora veremos algo más interesante, y que probablemente alguna vez hayáis necesitado, y si no ha sido así, seguramente en alguna ocasión necesitaréis. Se trata de obtener los rótulos o cabeceras de una tabla, donde tenemos los valores que estamos buscando. Como siempre, lo veremos con un sencillo ejemplo. Imaginemos que tenemos tres zonas donde nuestra empresa vende: la zona A, la zona B, y la zona C. Las ventas las tenemos divididas en meses, de enero a diciembre, y pretendemos determinar qué mes es aquel que tiene las ventas máximas en cada zona. La tabla sería la siguiente:
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw3PvZMeM241HXCHb2mrro7LaT99YekHWfa1nkH4qGBkW29zC4s5l2SOhWe-9dcl8fm7M26_3PVh8lw9eghvxKez5Kce9x2EO8Wf9XGDVM-lkCe99OwwnnAUx5gP8sOP9TWNU-yctUVb5g/s1600/tabla-de-ventas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw3PvZMeM241HXCHb2mrro7LaT99YekHWfa1nkH4qGBkW29zC4s5l2SOhWe-9dcl8fm7M26_3PVh8lw9eghvxKez5Kce9x2EO8Wf9XGDVM-lkCe99OwwnnAUx5gP8sOP9TWNU-yctUVb5g/s640/tabla-de-ventas.png" /></a></div>
<br />
Si nos fijamos bien, las ventas máximas de la zona A, son 78, y se producen en el mes de octubre. Pues precisamente eso, obtener el mes de octubre, es lo que pretendemos conseguir que nos determine Excel.
<br /><br />
Como bien sabéis, obtener la cifra máxima de ventas para la zona A, sería tan sencillo, como poner esta fórmula:
<br />
<table class="tablavba"><tr><td>=MAX(C5:N5)</td></tr><br /></table>
<br />
Pero la pregunta es: ¿cómo hacemos para que Excel nos diga que ese valor máximo que obtenemos en la zona A, y que corresponde a unas ventas de 78, se producen en el mes de octubre (OCT)?. Pues de una forma bastante sencilla. Solo tendremos que utilizar la función MAX, para determinar el valor máximo de ventas.
<br /><br />
También utilizaremos la función COINCIDIR que nos determinará el número de columna en la que tenemos el valor máximo, teniendo en cuenta que el número de la columna se determina en función del rango que escojamos, y tomando como columna inicial, aquella que corresponda a la primera celda del rango. ¿Esto último parece complicado?. No, no lo es. Si te digo que escogemos como rango de la zona A, el que va desde C5 hasta N5, la columna C sería la primera, y la columna N sería la duodécima. Con esta función, obtendremos que la columna cuyas ventas son máximas en la zona A, se corresponde con la número diez.
<br /><br />
Y por último, necesitaremos convertir esa columna número diez, en la cabecera o rótulo correspondiente de la tabla, es decir, en OCT (mes de octubre). Para ello, nos bastará con utilizar la función INDICE.
<br /><br />
Sería algo tan sencillo, como aplicar esta fórmula, para determinar el mes en el que se producen las ventas máximas de la zona A:
<br />
<table class="tablavba"><tr><td>=INDICE(C4:N4;COINCIDIR(MAX(C5:N5);C5:N5;0))</td></tr><br /></table>
<br />
Para obtener lo mismo de la zona B, sería esto:
<br />
<table class="tablavba"><tr><td>=INDICE(C4:N4;COINCIDIR(MAX(C6:N6);C6:N6;0))</td></tr><br /></table>
<br />
Y en la zona C, las ventas máximas se producen en el mes que nos devuelve como resultado esta fórmula:
<br />
<table class="tablavba"><tr><td>=INDICE(C4:N4;COINCIDIR(MAX(C7:N7);C7:N7;0))</td></tr><br /></table>
<br />
Y en esta imagen, podéis ver los resultados:
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBUjuOgWrW0snFCcpobkiM1H4Qt3_ffKCaYMquVBBJFd1_DI2zqhgbJEQrRvmQallOIe5vrBq_ZmFE6htO_p4Y91iWTAR6BgWpCpcZ9r2ooHq8Ed-phkNa0H_4RY1gK2blP4Ud76jjisSX/s1600/tabla-de-ventas-y-resultados.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBUjuOgWrW0snFCcpobkiM1H4Qt3_ffKCaYMquVBBJFd1_DI2zqhgbJEQrRvmQallOIe5vrBq_ZmFE6htO_p4Y91iWTAR6BgWpCpcZ9r2ooHq8Ed-phkNa0H_4RY1gK2blP4Ud76jjisSX/s640/tabla-de-ventas-y-resultados.png" /></a></div>
<br />
Desde aquí, podéis <a href="http://www.mediafire.com/?15yv4j3c0le5ipk" title="descargar el libro de Excel" target="_blank" rel="nofollow">descargar el libro de Excel</a>, con el ejemplo que hemos visto en este artículo.
El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com1tag:blogger.com,1999:blog-7983188466168395484.post-86675765590221849122015-04-29T15:01:00.001+02:002016-10-15T10:34:39.545+02:00¿En qué columnas tenemos los datos que buscamos?En esta ocasión vamos a explicar, a través de una función personalizada, es decir, a través de una función no implementada en el propio Excel, sino que nosotros mismos vamos a programar, cómo conseguir descubrir en qué columnas se encuentra un valor que buscamos dentro de un rango de celdas.
<br /><br />
Quizás leyendo el párrafo anterior, no os quede muy claro que es lo que queremos obtener, pero como siempre, vamos a hacerlo lo más ameno posible, explicándolo de una forma sencilla, para que sea más inteligible.
<br /><br />
Concretamente, vamos a hacer algo como esto: Imaginemos que tenemos una tabla de Excel, donde hay diferentes valores, ya sean numéricos, alfanuméricos, o simplemente caracteres de texto. Lo que pretendemos, es buscar un valor determinado en esa tabla, para saber en qué columnas se encuentra. Veámoslo con una imagen:
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj76cN9IHa-PLvYwRySAb3WBGRRECK3WZQVg4dDXxSzIQ-5F-Ld3cnnOp0Tn_LYhmzSYlVnb3OhLpqjHPxBnjdowvhugbIHIEOn2jJmTlNcDpCngdUBpQSfMQVmViYMMgsFHA7Bqfeyp3le/s1600/tabla-excel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj76cN9IHa-PLvYwRySAb3WBGRRECK3WZQVg4dDXxSzIQ-5F-Ld3cnnOp0Tn_LYhmzSYlVnb3OhLpqjHPxBnjdowvhugbIHIEOn2jJmTlNcDpCngdUBpQSfMQVmViYMMgsFHA7Bqfeyp3le/s640/tabla-excel.png" /></a></div>
<br />
Como veis en esa imagen, hay una serie de vendedores, con sus ventas mensuales, un total anual, y una desviación con respecto a las ventas medias por vendedor. Vamos a complicarnos la vida, y lo que vamos a buscar no son los meses en los que encontremos determinado valor, sino la columna de Excel donde estos se encuentran.
<br /><br />
Veámoslo con un ejemplo: Supongamos que queremos buscar en qué columnas tenemos el valor 6.000,00, para el vendedor llamado Pedro. Si os fijáis en la tabla anterior, podemos localizar ese valor en el mes de septiembre, que corresponde a la columna K. Esto último es lo que pretendemos localizar.
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5soNCfCwv42-OyiIPd8-rdeTKAHj8IJAQkI-_iIlqTidRO9j871weztYyIxIBqw1tU9S6yfn7tCcnBkTXAjxbl5Rk1xmw0_Tf3EsCAfKco3n0L-z4jUf6yp5Tk7Z-v1Eaj4fhJLl2bZd/s1600/tabla-excel-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5soNCfCwv42-OyiIPd8-rdeTKAHj8IJAQkI-_iIlqTidRO9j871weztYyIxIBqw1tU9S6yfn7tCcnBkTXAjxbl5Rk1xmw0_Tf3EsCAfKco3n0L-z4jUf6yp5Tk7Z-v1Eaj4fhJLl2bZd/s640/tabla-excel-2.jpg" /></a></div>
<br />
Para hacerlo más complicado, y como es probable que el valor buscado no coincida con ninguno de la tabla (por ejemplo, el vendedor Rafael no tiene ventas por importe de 6.000,00), vamos a buscar también aquellas columnas que tengan el valor buscado o uno superior (que se cumpla cualquiera de esas dos condiciones), y también aquellas columnas que tengan un valor inferior. Si queréis, podéis adaptar vosotros este ejercicio, para buscar las columnas cuyos valores que sean iguales o inferiores (que se cumpla cualquiera de esas dos condiciones), o bien, buscar las columnas cuyos valores sean superiores al valor buscado, pues es muy sencillo hacerlo, con los pasos que os indico a lo largo de este artículo.
<br /><br />
Vamos al lío… Vamos a construir nuestra función personalizada, para lo cual, en un módulo VBA, copiaremos esto, que nos servirá para localizar las columnas que contengan el valor exacto al valor que busquemos:
<br /><br />
<table class="tablavba">
<tr><td>Function Localizar(rango As Range, valor As Variant)<br />
<span style="color: #009900;">'fichamos la celda donde están los datos<br />
'inicial y final (el rango)</span><br />
mi_rango = rango.Address<br />
<span style="color: #009900;">'separamos los datos inicial y final<br />
coordenadas = Split(mi_rango, ":")</span><br />
inicio = coordenadas(0)<br />
fin = coordenadas(1)<br />
<span style="color: #009900;">'pasamos a una variable la dirección de la celda inicial</span><br />
celda = Range(inicio).Address<br />
<span style="color: #009900;">'para todo el rango de datos...</span><br />
For i = 0 To Range(fin).Column - Range(inicio).Column<br />
<span style="color: #009900;">'Comprobamos el valor introducido</span><br />
If Range(celda) = valor Then<br />
columna = columna & " " & Range(celda).Address<br />
<span style="color: #009900;">'eliminamos el signo de $ de referencia absoluta</span><br />
columna = Replace(columna, "$", "")<br />
End If<br />
<span style="color: #009900;">'pasamos a la siguiente columna</span><br />
celda = Range(celda).Offset(0, 1).Address<br />
<span style="color: #009900;">'seguimos con el bucle</span><br />
Next<br />
<span style="color: #009900;">'Si no existe el dato en ninguna columna</span><br />
If columna = 0 Then columna = " No existe"<br />
<span style="color: #009900;">'eliminamos los números de la fila</span><br />
numeros = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)<br />
For j = 0 To UBound(numeros)<br />
columna = Replace(columna, numeros(j), "")<br />
Next<br />
<span style="color: #009900;">'asignamos a la función, el dato del contador</span><br />
<span style="color: #009900;">'eliminando previamente el primer espacio vacío</span><br />
Localizar = Mid(columna, 2)<br />
End Function</td></tr>
</table>
<br />
Vale, esto está muy bien, pero ¿cómo se utiliza esta función?. Pues así:
<br /><br />
<table class="tablavba">
<tr><td>=localizar(rango_de_celdas_donde_buscaremos;valor_a_buscar)
</td></tr>
</table>
<br />
Veámoslo con otro ejemplo:
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEq8ETwF4Cmn3BGMqLKptxww-5egQQf8nEZQNWDDJnU0kgTvo5j85aDacy6PYbggQ8_Jz6vgN80THhFjHytOx5QxWJO9zZeCBELHRHczz0Q2SgmZLflgng-dx9PUYxfzeQTYBifzATjmuS/s1600/tabla-buscar-columnas-iguales.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEq8ETwF4Cmn3BGMqLKptxww-5egQQf8nEZQNWDDJnU0kgTvo5j85aDacy6PYbggQ8_Jz6vgN80THhFjHytOx5QxWJO9zZeCBELHRHczz0Q2SgmZLflgng-dx9PUYxfzeQTYBifzATjmuS/s640/tabla-buscar-columnas-iguales.png" /></a></div>
<br />
En la tabla anterior, podemos ver que estamos buscando el valor 6.000,00 en toda la tabla que va, del rango de celdas C7, hasta la celda N12, pero lo hemos separado por vendedores, por lo que en el caso por ejemplo del vendedor Rafael, lo que haremos será buscar el valor 6.000,00 en el rango que va de C7 a N7. Para ello, la fórmula que hemos puesto en la celda C17 es esta:
<br /><br />
<table class="tablavba">
<tr><td>=localizar(C7:N7;$D$3)
</td></tr>
</table>
<br />
En este caso, como vemos, no hay ventas por valor de 6.000,00, aunque sí las hay por valores superiores e inferiores. Si lo que queremos es obtener las columnas donde haya valores superiores o iguales a 6.000,00, entonces crearemos otra función personalizada a la que llamaremos "localizarMasOIgual", donde copiaremos el código que os puse anteriormente, cambiando estas líneas que os añado a continuación.
<br /> <br />
Cambiaremos esta línea del código (ojo, que tenemos que llamar a esta nueva función con otro nombre, y yo he elegido el de "localizarMasOIgual"):
<br /><br />
<table class="tablavba">
<tr><td>If Range(celda) = valor Then
</td></tr>
</table>
<br />
Por esta otra:
<br /><br />
<table class="tablavba">
<tr><td>If Range(celda) >= valor Then
</td></tr>
</table>
<br />
Y también cambiaremos esta línea:
<br /><br />
<table class="tablavba">
<tr><td>localizar = Mid(columna, 2)
</td></tr>
</table>
<br />
Por esta otra:
<br /><br />
<table class="tablavba">
<tr><td>localizarMasOIgual = Mid(columna, 2)
</td></tr>
</table>
<br />
De esta forma, ya tendremos nuestra nueva función creada, donde buscaremos las columnas donde tengamos un valor igual o superior al buscado. Este será el resultado, después de aplicar la nueva fórmula, al rango de datos donde buscaremos las ventas superiores o iguales a 6.000,00:
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxN4ApgkCXZ4jXKSm5dapg0jtYtJfzjxXGrjBlV5w0NwSC0fLExprRM_FzKRp0R5mePIIQFHe2ZUH6HKxBshrJfJYJpOCpq297xwWTdrpm3IOh-gtuKwcjd1QBMe4GGILQ0UnYks2bNUuq/s1600/tabla-buscar-columnas-iguales-o-superiores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxN4ApgkCXZ4jXKSm5dapg0jtYtJfzjxXGrjBlV5w0NwSC0fLExprRM_FzKRp0R5mePIIQFHe2ZUH6HKxBshrJfJYJpOCpq297xwWTdrpm3IOh-gtuKwcjd1QBMe4GGILQ0UnYks2bNUuq/s640/tabla-buscar-columnas-iguales-o-superiores.png" /></a></div>
<br />
En el caso de buscar las columnas con valores inferiores al valor buscado (en nuestro ejemplo, ventas inferiores a 6.000,00), crearemos una nueva función a la que llamaremos "localizarMenos". En esta nueva función, cambiaremos el código inicial que os puse de dos líneas, concretamente cambiaremos esta línea:
<br /><br />
<table class="tablavba">
<tr><td>If Range(celda) = valor Then
</td></tr>
</table>
<br />
Por esta otra:
<br /><br />
<table class="tablavba">
<tr><td>If Range(celda) < valor Then
</td></tr>
</table>
<br />
Y también cambiaremos esta línea:
<br /><br />
<table class="tablavba">
<tr><td>localizar = Mid(columna, 2)
</td></tr>
</table>
<br />
Por esta otra:
<br /><br />
<table class="tablavba">
<tr><td>localizarMenos = Mid(columna, 2)
</td></tr>
</table>
<br />
Y el resultado después de aplicar la nueva función, será este, si buscamos las columnas donde tenemos ventas de cada vendedor, inferiores a 6.000,00:
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBOTRDfgDOXpz4d-i3evazsDMtmozV_jrRIZOc7tdZKO6BtoCroUePzUGBQ51ua6uwFcHkUVSDZ49mt5TCJkjOMq8tmwsL-DtCY9oIjEU2jSh6bYJbth4EKWs1K81peyXDNhzeoJtqasa/s1600/tabla-buscar-columnas-inferiores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBOTRDfgDOXpz4d-i3evazsDMtmozV_jrRIZOc7tdZKO6BtoCroUePzUGBQ51ua6uwFcHkUVSDZ49mt5TCJkjOMq8tmwsL-DtCY9oIjEU2jSh6bYJbth4EKWs1K81peyXDNhzeoJtqasa/s640/tabla-buscar-columnas-inferiores.png" /></a></div>
<br />
Como veis, es muy sencillo adaptar la función inicial, a vuestras necesidades. Si queréis, podéis probar a obtener las columnas donde se encuentran valores superiores al valor buscado. En nuestro ejemplo hemos aplicado la función "localizarMasOIgual", pero nos busca los valores superiores o iguales al valor buscado, y no solo los valores superiores, como os sugiero que hagáis. También podéis crear una función más, para localizar las columnas donde hay valores menores o iguales al valor buscado. En nuestro ejemplo hemos aplicado la función "localizarMenos", pero nos busca solo los valores inferiores al valor buscado.
<br /><br />
Desde aquí, podéis <a href="http://www.mediafire.com/?h47seqyqsfzrv7b" title="descargar el libro de Excel" target="_blank" rel="nofollow">descargar el libro de Excel</a>, con el ejemplo que hemos visto en este artículo, para que lo analicéis, lo probéis, y veáis si esta utilidad tiene alguna funcionalidad en vuestra vida diaria, o simplemente os parece otro interesante ejemplo más de cómo crear funciones personalizadas en Excel.
El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com3tag:blogger.com,1999:blog-7983188466168395484.post-67570452446155344032015-01-26T21:22:00.003+01:002017-05-16T22:03:08.358+02:00Obtener un consolidado, extrayendo los datos de diferentes ficherosHace poco me preguntaba una amiga, si era posible obtener en un fichero único de Excel, una serie de registros
procedentes de otros ficheros, de los cuales desconocemos un montón de cosas,
incluido el propio nombre de estos ficheros. Es decir, se trataba de obtener en
ese fichero único de Excel, los registros de forma concatenada (o agregada,
unos detrás de los otros), de una serie de archivos, de los que desconocemos
tanto su número, como su nombre, e incluso, la subcarpeta en la que están estos
propios ficheros que serán la fuente desde la que vamos a obtener la
información.
<br /><br />
Mi respuesta fue: “Ufffffff, no
entiendo nada de lo que me planteas. Hazme un ejemplo de lo que necesitas, que soy
muy torpe.”
<br /><br />
Su explicación fue más o menos
así: Imagina que tengo una carpeta donde tengo alojadas una serie de
subcarpetas (desconozco su número), y dentro de estas subcarpetas hay una serie
de ficheros (desconozco tanto el número de ficheros como el nombre que tienen
los mismos), …pues bien, lo que quiero, es que mire en todas esas subcarpetas,
y en todos los ficheros que haya dentro, y como todos tienen un esquema
similar, que coja esos datos, y me los ponga en un único fichero de Excel,
colocando cada bloque de registros de cada fichero, uno detrás de otro, dentro
de este único fichero que recoge la información.
<br /><br/>
Y ante esa respuesta, yo pensé:
“¿tú lo que quieres es trabajar poco, y que Excel lo haga todo, einghhhh?”.
Pues sí, no estaba equivocado, quería que Excel le hiciese el trabajo tedioso,
recopilar los datos, sin tener que abrir cada fichero de Excel, y hacer un
“copypaste” en el fichero de destino, que ella ya se encargaría de analizar
toda esa información.
<br />
Vamos, que la idea era pasar de esto:
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVONNr5S2bGdBI7q8gtfs44qVjxvk1Jnsab2VxO9xWeDTAbw17MIVcxHYz7VpSexjwwMhROAGSLNL0pgmD9hHMr3PkX3lufsXs-AHOb0lILr8voFay0kk6gGJU-_E6KwanY4LiibffFzaN/s1600/datos-de-origen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVONNr5S2bGdBI7q8gtfs44qVjxvk1Jnsab2VxO9xWeDTAbw17MIVcxHYz7VpSexjwwMhROAGSLNL0pgmD9hHMr3PkX3lufsXs-AHOb0lILr8voFay0kk6gGJU-_E6KwanY4LiibffFzaN/s1600/datos-de-origen.png" style="display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 742px;"/></a>
<br />
A esto otro:
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEies1Ec9Vm8iyMdFb2uQQd5g7NASQpfvJPawlG-OOPSV4xoVnZypa_u9Erwfr6h_UsyPBeDjJumEQ1crhjDAaMsbhAmqwdLi9ADKV3I_C4_7VgC5760us5zawmTTgtWGfiK8xv7jljbvd86/s1600/datos-de-destino.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEies1Ec9Vm8iyMdFb2uQQd5g7NASQpfvJPawlG-OOPSV4xoVnZypa_u9Erwfr6h_UsyPBeDjJumEQ1crhjDAaMsbhAmqwdLi9ADKV3I_C4_7VgC5760us5zawmTTgtWGfiK8xv7jljbvd86/s1600/datos-de-destino.png" style="display: block; height: 271px; margin: 0px auto 10px; text-align: center; width: 660px;"/></a>
<br />
Pues nada, me puse manos a la
obra, y tras un buen rato de de análisis, trabajo y depuración de código,
conseguimos un macro que haría todo eso en un abrir y cerrar de ojos.
<br /><br />
La idea parte de esto que podéis
ver en esta imagen, que contiene una serie de carpetas, que a su vez están
alojadas en una carpeta que será la que dediquemos a albergar los ficheros
desde los que obtendremos la información:
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmTUymfZih6rCjMzJ5TzlqvO1cyPSTIYLzfy8uc9REnihjUX2Yg1m6WZSivMkQO_R0Ii4X_GpA-aQiJovQ11BGZvS3l5muKgnXQNcWrShVQmptuZdPr4EbCwHL3hNJ5hlhmTGLWN0LSSH/s1600/fuente_de_datos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmTUymfZih6rCjMzJ5TzlqvO1cyPSTIYLzfy8uc9REnihjUX2Yg1m6WZSivMkQO_R0Ii4X_GpA-aQiJovQ11BGZvS3l5muKgnXQNcWrShVQmptuZdPr4EbCwHL3hNJ5hlhmTGLWN0LSSH/s1600/fuente_de_datos.png" style="display: block; height: 122px; margin: 0px auto 10px; text-align: center; width: 85px;"/></a>
<br />
Y dentro de cada carpeta, tenemos
diferentes ficheros (en cada carpeta podemos tener un número diferente de
ficheros), y con diferentes nombres (aunque puede que haya varios ficheros con
el mismo nombre, pero en carpetas diferentes, claro). Este sería un ejemplo de
lo que tenemos en la carpeta llamada "Carpeta 4":
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvthheAg30h8O8OPs41ZQY21JPT8FS8fEwWKbGycm5qQjFt0N_bsO8pDi-f0ljz1OLQMwfJL6Bt50h1GXfxd7KdeVLY0xT_igC4FCj5IVSjG2-EzmHbV60nwVzbsiulBBGHFK6AjChnbzu/s1600/datos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvthheAg30h8O8OPs41ZQY21JPT8FS8fEwWKbGycm5qQjFt0N_bsO8pDi-f0ljz1OLQMwfJL6Bt50h1GXfxd7KdeVLY0xT_igC4FCj5IVSjG2-EzmHbV60nwVzbsiulBBGHFK6AjChnbzu/s1600/datos.png" style="display: block; height: 213px; margin: 0px auto 10px; text-align: center; width: 162px;"/></a>
<br />
Como podéis ver se trata de ficheros de Excel, que en mi caso he hecho con la versión 2003, para que los
usuarios con una versión antigua de esta popular hoja de cálculo, vean que no
van a tener ningún problema a la hora de utilizar el macro que recopilará la
información de los diferentes ficheros. Evidentemente aquellos usuarios que
utilicen versiones posteriores de Excel (2007, 2010, 2013, o las que estén por
llegar), no van a tener el más mínimo problema, pues nos da igual el nombre que
tenga el fichero, o incluso su extensión, pues solo necesitamos que sean ficheros de Excel.
<br />
Si abrimos por ejemplo el fichero
llamado “Usuarios zona A.xls”, nos encontramos con esto (la estructura o
registros de todos los ficheros es similar, aunque los datos contenidos
evidentemente no, pues cada fichero tiene datos diferentes, los cuales queremos
extraer, para pegarlos de forma concatenada, en un único fichero que nos
servirá de agregado para poder analizar los datos, a partir de él):
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNhlN6ArtlIY2r3npZwI9JGfica4X02dL3SaX55vfEcPtOpWD6VY2DGDMSKJzKBrOkZjc4FFtR5fKfmIgZE1quHBX0RPMoqJ0pX3t4pC1ZYPWr1Cl9M75S7DrElOlZFI5SDUNlhy85a0gn/s1600/contenido_del_fichero_33+4=64.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNhlN6ArtlIY2r3npZwI9JGfica4X02dL3SaX55vfEcPtOpWD6VY2DGDMSKJzKBrOkZjc4FFtR5fKfmIgZE1quHBX0RPMoqJ0pX3t4pC1ZYPWr1Cl9M75S7DrElOlZFI5SDUNlhy85a0gn/s1600/contenido_del_fichero_33+4=64.png" style="display: block; height: 109px; margin: 0px auto 10px; text-align: center; width: 438px;"/></a>
<br/>
Algo muy importante, a lo que
tengo que hacer mención es que:
<br /><br/>
<ul style="text-align: justify;">
<li>Da igual el nombre que tengan nuestras carpetas,
y el nombre que tengan los ficheros que cuelguen de cada carpeta, y no tienen
por qué tener un nombre correlativo. Incluso pueden tener nombre absurdos :-)</li>
<li>Da igual tanto el número de carpetas, y de
ficheros que cuelguen de cada carpeta, aunque si tenemos más de la cuenta,
puede que Excel no pueda procesar tanta información y se nos cuelgue la
aplicación (no he probado el límite en el cual se cuelga, porque no soy
masoquista).</li>
<li>Los datos los obtendremos de la primera hoja de
cada uno de los libros.</li>
<li>Los datos de los libros deben tener todos la
misma estructura (mismo número de campos), pues consolidaremos peras con peras,
y no peras con manzanas. No obstante, el número de registros de cada fichero puede
ser distinto (en el ejemplo de este artículo trabajamos con registros
diferentes en cada fichero, para que veáis como funciona).</li>
</ul>
Vamos allá. Para hacer todo esto,
lo primero que haremos, será crear un fichero que llamaremos “Consolidado.xls”,
que contendrá dos hojas. La primera será donde consolidaremos los datos (hemos
puesto los encabezados de fila, para ahorrarnos el trabajo en el macro). A esta
primera hoja la hemos llamado “Consolidado”. La segunda hoja llamada “Ficheros”,
contendrá nos nombres de las carpetas en una columna, y en la adyacente
tendremos los archivos que contiene cada carpeta, pero claro, esto no lo
haremos manualmente, porque sino no tendría sentido crear un macro. Esta
segunda hoja también nos la “rellenará” nuestro macro, pues él solito obtendrá los nombres de las carpetas, y
los ficheros que contiene cada una de ellas.
<br /><br/>
Es decir, en la hoja “Consolidado” de nuestro libro tendremos esta plantilla:
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEWFWzJA2eqytH5PvbsnEELM9tjqmK0OuhBhlqQmGkXXVf1mcKzY0OilnpEBkwgQvhyphenhyphenlRHr0uGzvTJRhZ8YgSc0MzQS6wL61g6xE1jO3tA8AB9K3xHXgYUnc0ujuwaxPWPl1Ne6j5UcT2U/s1600/macro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEWFWzJA2eqytH5PvbsnEELM9tjqmK0OuhBhlqQmGkXXVf1mcKzY0OilnpEBkwgQvhyphenhyphenlRHr0uGzvTJRhZ8YgSc0MzQS6wL61g6xE1jO3tA8AB9K3xHXgYUnc0ujuwaxPWPl1Ne6j5UcT2U/s1600/macro.png" style="display: block; height: 204px; margin: 0px auto 10px; text-align: center; width: 783px;"/></a>
<br />
Y en la “Ficheros” tendremos esto
(ojo, que esto que veis, es tras la ejecución del macro, pues ha recorrido cada
carpeta y cada fichero “fichando” el nombre de todo lo que encuentra dentro,
así que para evitar problemas, trabajad solo con ficheros Excel, y no los
mezcléis con ficheros Word, o con imágenes, por ejemplo):
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwP_7SHKM2iVXkbHoimSBLgQ6zsszG4HxJqXw9SPIoGs7dOh0Z4i6Y-mqUtAMQH68pk_hYBxGsT_hMY-QCr7ggg1swIulVHfmdhb8k0BjNFRWGMx-VdFEfGbvJgYzitzazZKvIOgc0PWf5/s1600/carpetas-y-ficheros.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwP_7SHKM2iVXkbHoimSBLgQ6zsszG4HxJqXw9SPIoGs7dOh0Z4i6Y-mqUtAMQH68pk_hYBxGsT_hMY-QCr7ggg1swIulVHfmdhb8k0BjNFRWGMx-VdFEfGbvJgYzitzazZKvIOgc0PWf5/s1600/carpetas-y-ficheros.png" style="display: block; height: 423px; margin: 0px auto 10px; text-align: center; width: 392px;"/></a>
<br />
Bueno, pues para hacer todo esto,
tan solo deberemos copiar y pegar este macro, en un módulo:
<br/><br/>
<table class="tablavba">
<tr><td>Sub Consolidado()<br />
<span style="color: #009900;">'--------------------------------------------------------<br />'Lo primero que haremos, será recorrer los directorios<br />'seleccionando los ficheros que haya en cada uno de ellos<br />'--------------------------------------------------------<br />'Si hay errores, que continúe</span><br />
On Error Resume Next<br />
<span style="color: #009900;">'seleccionamos la hoja1</span><br />
Hoja1.Select<br />
<span style="color: #009900;">'Seleccionamos el botón cuyo nombre queramos cambiar</span><br />
ActiveSheet.Shapes("Botón 1").Select<br />
<span style="color: #009900;">'le cambiamos el nombre, y lo ponemos en rojo</span><br />
Selection.Characters.Text = "Espera unos segundos..."<br />
With Selection.Font<br />
.ColorIndex = 3<br />
End With<br />
<span style="color: #009900;">'Ocultamos el procedimiento</span><br />
Application.ScreenUpdating = False<br />
<span style="color: #009900;">'borramos todo lo que haya de datos anteriores en la Hoja1</span><br />
Range("A6").Select <br />
If ActiveCell <> "" Then<br />
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select<br />
Selection.EntireRow.Delete<br />
Selection.ClearContents<br />
Selection.ClearFormats<br />
End If<br />
<span style="color: #009900;">'Nos situamos en la hoja 2</span><br />
Windows(ThisWorkbook.Name).Activate<br />
Hoja2.Select<br />
<span style="color: #009900;">'borramos lo que haya de otras veces</span><br />
Range("A2").Select<br />
If ActiveCell <> "" Then<br />
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select<br />
Selection.EntireRow.Delete<br />
End If<br />
<span style="color: #009900;">'Creamos el objeto FileSystemObject</span><br />
Set Fso = CreateObject("Scripting.FileSystemObject")<br />
<span style="color: #009900;">'Informamos de la ruta de donde vamos a obtener</span><br />
<span style="color: #009900;">'los ficheros, en este caso, el mismo directorio</span><br />
<span style="color: #009900;">'donde tengamos grabado este fichero con el macro</span><br />
ruta = ActiveWorkbook.Path<br />
<span style="color: #009900;">'definimos dos variables que necesitaremos,</span><br />
<span style="color: #009900;">'para recuperar el nombre de la carpeta, y</span><br />
<span style="color: #009900;">'los subdirectorios y ficheros que haya dentro</span><br />
Set directorio = Fso.GetFolder(ruta)<br />
Set Subdirectorios = directorio.SubFolders<br />
Set ficheros = directorio.Files<br />
<span style="color: #009900;">'escribimos un encabezado en la celda A2</span><br />
Range("A2").Select<br />
<span style="color: #009900;">'escribimos los subdirectorios</span><br />
For Each Subdirectorio In Subdirectorios<br />
Hoja2.Select<br />
<span style="color: #009900;">'escribimos el nombre del subdirectorio</span><br />
ActiveCell = Subdirectorio.Name<br />
<span style="color: #009900;"> 'entramos en el subdirectorio</span><br />
Set directorio = Fso.GetFolder(Subdirectorio)<br />
Set Subdirectorios = directorio.SubFolders<br />
Set ficheros = directorio.Files<br />
ActiveCell.Offset(0, 1).Select<br />
For Each Archivo In ficheros<br />
<span style="color: #009900;"> 'escribimos el nombre del fichero</span><br />
ActiveCell = Archivo.Name<br />
<span style="color: #009900;"> 'bajamos una fila</span><br />
ActiveCell.Offset(1, 0).Select<br />
Next<br />
<span style="color: #009900;">'bajamos una fila y volvemos una columna atrás</span><br />
ActiveCell.Offset(1, -1).Select<br />
Next<br />
<span style="color: #009900;">'Limpiamos los objetos</span><br />
Set Fso = Nothing<br />
Set directorio = Nothing<br />
Set Subdirectorios = Nothing<br />
Set ficheros = Nothing<br />
<span style="color: #009900;">'---------------------------------------------------------------</span><br />
<span style="color: #009900;">'Abrimos los ficheros uno a uno, y vamos copiando y escribiendo</span><br />
<span style="color: #009900;">'los datos en el fichero del consolidado en la hoja1 (no importa</span><br />
<span style="color: #009900;">'el nombre que tenga esta hoja)</span><br />
<span style="color: #009900;">'---------------------------------------------------------------</span><br />
<span style="color: #009900;">'abrimos las carpetas desde la 1 a la 50, para no hacer esto interminable </span><br />
carpeta = Range("A2").Address<br />
For i = 1 To 50<br />
<span style="color: #009900;">'nos situamos en la celda A2, de la hoja 2, que era donde estábamos,</span><br />
<span style="color: #009900;">'creando unas variables que nos serán de ayuda</span><br />
fichero = Range(carpeta).Offset(0, 1)<br />
j = 1<br />
Do While Not IsEmpty(fichero)<br />
Workbooks.Open Filename:=ruta & "\" & Range(carpeta) & "\" & fichero<br />
<span style="color: #009900;"> 'copiamos los datos que tenga desde A2 hasta el final</span><br />
Range("A2").Select<br />
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select<br />
Selection.Copy<br />
<span style="color: #009900;"> 'los pegamos en nuestro libro</span><br />
Windows(ThisWorkbook.Name).Activate<br />
Hoja1.Select<br />
If Range("A6") = "" Then<br />
Range("A6").Select<br />
Else<br />
Range("A6").Select<br />
Selection.End(xlDown).Select<br />
ActiveCell.Offset(1, 0).Select<br />
End If<br />
ActiveSheet.Paste<br />
Application.CutCopyMode = False<br />
<span style="color: #009900;"> 'nos situamos al final de la lista consolidada</span><br />
Selection.End(xlDown).Select<br />
<span style="color: #009900;"> 'bajamos una celda</span><br />
ActiveCell.Offset(1, 0).Select<br />
<span style="color: #009900;"> 'cerramos el libro</span><br />
Workbooks("" & fichero & "").Close savechanges:=False<br />
<span style="color: #009900;"> 'volvemos a la hoja2</span><br />
Hoja2.Select<br />
<span style="color: #009900;"> 'creamos una variable para ir bajando a los ficheros</span><br />
fichero = Range(carpeta).Offset(j, 1)<br />
j = j + 1<br />
Loop<br />
Range(carpeta).Select<br />
Selection.End(xlDown).Select<br />
carpeta = ActiveCell.Address<br />
Next<br />
<span style="color: #009900;">'volvemos a la Hoja2</span><br />
Hoja2.Select<br />
Range("A2").Select<br />
<span style="color: #009900;">'volvemos a la Hoja1</span><br />
Hoja1.Select<br />
<span style="color: #009900;">'Seleccionamos el botón</span><br />
ActiveSheet.Shapes("Botón 1").Select<br />
<span style="color: #009900;">'le cambiamos el nombre al botón, poniéndole el que tenía</span><br />
<span style="color: #009900;">'inicialmente y lo ponemos en negro</span><br />
Selection.Characters.Text = "Consolidar"<br />
With Selection.Font<br />
.ColorIndex = xlAutomatic<br />
End With<br />
Range("A6").Select<br />
<span style="color: #009900;">'Mostramos el procedimiento</span><br />
Application.ScreenUpdating = True<br />
<span style="color: #009900;">'mostramos un mensaje al finalizar</span><br />
CreateObject("wscript.shell").Popup _<br />
" Ya hemos finalizado. ¿Ves como tardaría poco?. " + _<br />
Chr(13) + " Los datos han sido consolidados, y demasiado sin esfuerzo ;-) ", _<br />
4, " Consolidación completada"<br />
End Sub</td></tr>
</table>
<br/>
Cuando ejecutéis el macro, lo primero que hace, es eliminar los datos que haya previamente (si es que los hay). Luego, simplemente consolida los datos de los diferentes ficheros. Os dejo que lo probéis, y veáis que he puesto cada bloque de datos de diferentes colores en los ficheros de origen, para que se vea claramente que en el consolidado se “pegan” de la misma forma, es decir, manteniendo su formato (en este caso el color de origen, para que se vean bien los datos “copypasetados”).
<br/><br/>
Descomprimid el <a href="http://www.mediafire.com/?vy0a6o97g7pyvmg" title="descargar el fichero comprimido" target="_blank" rel="nofollow">fichero comprimido de este enlace</a>, en una carpeta, y probadlo. Veréis como el contenido de cada uno de los ficheros, de todas y cada una de las carpetas, pasa a formar parte de un único fichero, que es este desde el que ejecutamos el macro (Consolidado.xls).El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com2tag:blogger.com,1999:blog-7983188466168395484.post-4712680667372281122012-02-21T17:53:00.012+01:002012-02-21T18:48:51.108+01:00Obtener valores únicos en ExcelVamos a explicar hoy, como podemos generar una lista con valores únicos en Excel, a través del uso de macros. Esta operación la podemos realizar de una forma muy sencilla con Excel 2007 o superior, tal y como nos explica Microsoft en <a href="http://office.microsoft.com/es-es/excel-help/filtrar-valores-unicos-o-quitar-valores-duplicados-HP010073943.aspx" title="valores únicos" target="_blank">este artículo</a>, utilizando <strong>filtros avanzados</strong>. Como a nosotros nos gusta complicarnos la vida un poco, queremos que esta operación se realice sin intervención humana ;-) y de forma inmediata, en función de cuando vamos introduciendo valores en una hoja, con independencia de que a medida que los introduzcamos, estén repetidos una o mil veces, así que programaremos un sencillo macro que nos servirá para enseñárselo a nuestros compañeros de trabajo, o a nuestro jefe, y quedar como unos usuarios avanzados en Excel.<br /><br />En definitiva, lo que vamos a hacer es obtener en una hoja del mismo libro, un listado de valores únicos (no repetidos), a partir de una serie de datos con valores que pueden estar o no repetidos (lo normal es que estén repetidos, para ver en funcionamiento esta utilidad) . Eso es lo mismo que decir, que vamos a eliminar todos aquellos valores duplicados que haya, para dejar un solo valor de cada dato introducido.<br /><br />Para ilustrarlo de un modo gráfico, lo que pretendemos obtener es esto:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRHigl_snTWAVb0NiLkCoTsS5FMh24aEPp2j5SIdAe7gAsmZJ2UnpmQH9bdXEfKkjJz4mi64Gof-FHBzU3KzkpLdWsSEShzjKftFpZ_jmaO9Q9qLLKOxXWkEd4-djV6oTdalhuCBVNjS6_/s1600/de-valores-duplicados-a-valores-unicos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRHigl_snTWAVb0NiLkCoTsS5FMh24aEPp2j5SIdAe7gAsmZJ2UnpmQH9bdXEfKkjJz4mi64Gof-FHBzU3KzkpLdWsSEShzjKftFpZ_jmaO9Q9qLLKOxXWkEd4-djV6oTdalhuCBVNjS6_/s400/de-valores-duplicados-a-valores-unicos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711633381570866834" /></a><br />Como veis en la columna de la izquierda (tabla A), tenemos repetidos una serie de valores, en la columna de la derecha (tabla B), solo tenemos los valores únicos. Es decir, lo que haremos será eliminar los duplicados, o filtrar la tabla para que solo aparezcan los valores una sola vez.<br /><br />Todo esto lo vamos a hacer introduciendo valores en la Hoja1, y en la Hoja2 es donde mostraremos los valores únicos o sin duplicados, de forma instantánea, a medida que vayamos introduciendo valores en la primera de las hojas.<br /><br />Pensaréis que esto es algo complicado de obtener mediante macros, pero no, no lo es. De hecho es bastante sencillo. A pesar de que el código siempre lo comento -y esta vez no va a ser menos-, explicaré el proceso por el cual, a partir de una tabla donde vayamos introduciendo valores duplicados, obtendremos los valores únicos.<br /><br />La técnica es muy sencilla. En el mismo instante en el que introduzcamos un valor en la Hoja1, nos desplazaremos a la Hoja2, a ver si ese valor está en la columna donde nos interesa que salgan los valores únicos, y si es así, volveremos a la Hoja1 sin hacer nada. Si por el contrario, el valor no está en esa columna de la Hoja2, lo que haremos será añadirlo, y volveremos a la Hoja1 para continuar introduciendo valores. Todo esto lo haremos sin darnos cuenta, pues visualmente no observaremos ningún refresco de pantalla por el cambio de la Hoja1 a la Hoja2, y de nuevo a Hoja1.<br /><br />Para ello utilizaremos los siguientes códigos. Este primero, lo colocaremos en la Hoja1:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Change(ByVal Target As Range)<br /><span style="color:#009900;">'Al introducir un valor en la columna B,<br />'llamaremos al macro "valores_unicos_instantaneos"</span><br />If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then valores_unicos_instantaneos<br />End Sub<br /></td></tr><br /></table><br />Al modificar un dato de la columna B, se ejecutará el macro llamado “valores_unicos_instantaneos”. Ahora, en un módulo escribiremos este código:<br /><table class="tablavba"><tr><td>Sub valores_unicos_instantaneos()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'pasamos el dato que acabamos de introducir, a una variable</span><br />dato = ActiveCell<br /><span style="color:#009900;">'buscamos ese dato en la Hoja2,<br />'y más concretamente en la columna B</span><br />With Hoja2.Range("B:B")<br /> <span style="color:#009900;">'buscamos el dato en esta Hoja2</span><br /> Set existe = .Find(dato, LookAt:=xlWhole)<br /> <span style="color:#009900;">'si no existe, lo añadimos, pero antes nos<br /> 'situaremos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> If existe Is Nothing Then<br /> <span style="color:#009900;">'nos situamos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'bajamos hasta encontrar una fila vacía</span><br /> Do While Not IsEmpty(ActiveCell)<br /> ActiveCell.Offset(1, 0).Select<br /> Loop<br /> <span style="color:#009900;">'y escribimos el dato</span><br /> ActiveCell = dato<br /> End If<br />End With<br /><span style="color:#009900;">'subimos al principio de la tabla</span><br />Range("B5").Select<br /><span style="color:#009900;">'volvemos a la Hoja1</span><br />Hoja1.Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br />End Sub<br /></td></tr><br /></table><br />Si hemos hecho todo correctamente, al introducir valores en la Hoja1, de una forma similar a esta, y en la que repetimos ciertos valores (hemos supuesto que introducimos el nombre los vendedores de la empresa):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-28aVMoDiXBFimvYv26eLumRDzntYc5EfQUKlrYtEilWS50WPN2g3BfbetdpfA1RIJawIAK7zjPFXWVcbSPyzYx7H3RpTvWuPyi7XqVfWFLH4hzlWK6FM1wGz_ORVL2z-qt2UjZgbTphV/s1600/tabla-con-duplicados.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 311px; height: 309px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-28aVMoDiXBFimvYv26eLumRDzntYc5EfQUKlrYtEilWS50WPN2g3BfbetdpfA1RIJawIAK7zjPFXWVcbSPyzYx7H3RpTvWuPyi7XqVfWFLH4hzlWK6FM1wGz_ORVL2z-qt2UjZgbTphV/s400/tabla-con-duplicados.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711635105693630706" /></a><br />Obtendremos de forma automática, y sin darnos cuenta, estos otros datos en la Hoja2:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxdCgRB1m5kXQ_tLCxMNgItkFqn9edqH7OxzY6641mHLl4ve6EyGbTd4ZHTxiqvyVWTiu5LLMxc3D6JgitWPuRA57wjbkk20pQqNVlIKsGFKPiwSmaZMAthFeXPBBfMGIaJe9C1_FJ2mO/s1600/tabla-con-valores-unicos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 289px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggxdCgRB1m5kXQ_tLCxMNgItkFqn9edqH7OxzY6641mHLl4ve6EyGbTd4ZHTxiqvyVWTiu5LLMxc3D6JgitWPuRA57wjbkk20pQqNVlIKsGFKPiwSmaZMAthFeXPBBfMGIaJe9C1_FJ2mO/s400/tabla-con-valores-unicos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711634949254106898" /></a><br />Ahora pensaréis: “vale, muy chulo, pero ¿y si ya tengo la hoja con los datos duplicados?, ¿voy a tener que reescribirlos para que me tome sólo los valores únicos?”. La respuesta es no. No necesitarás hacer nada de eso porque hemos preparado un pequeño macro en Excel que hará el trabajo por ti. Con este sencillo ejemplo, obtendremos valores únicos, a partir de un listado donde tengamos datos duplicados. Es decir, no será necesario que introduzcamos datos para ver como se nos añaden en la Hoja2 los valores únicos, pues tan solo tendrás que ejecutar este macro:<br /><table class="tablavba"><tr><td>Sub valores_unicos()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'fichamos la celda donde estamos, para volver a ella al final</span><br />celda = ActiveCell.Address<br /><span style="color:#009900;">'si en la hoja2, la celda B5 contiene datos,<br />'eliminamos todas las filas con datos contiguas</span><br />If Hoja2.Range("B5") <> "" Then<br /> <span style="color:#009900;">'seleccionamos la hoja2</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'seleccionamos el rango contínuo hasta abajo</span><br /> Range(Selection, Selection.End(xlDown)).Select<br /> <span style="color:#009900;">'eliminamos las filas</span><br /> Selection.EntireRow.Delete<br /> <span style="color:#009900;">'volvemos a B5</span><br /> Range("B5").Select<br />End If<br /><span style="color:#009900;">'seleccionamos la hoja1</span><br />Hoja1.Select<br /><span style="color:#009900;">'y nos situamos en B5</span><br />Range("B5").Select<br /><span style="color:#009900;">'hasta que no encuentre una fila vacía...</span><br />Do While Not IsEmpty(ActiveCell)<br /> <span style="color:#009900;">'pasamos el dato que acabamos de introducir, a una variable</span><br /> dato = ActiveCell<br /> <span style="color:#009900;">'buscamos ese dato en la Hoja2,<br /> 'y más concretamente en la columna B</span><br /> With Hoja2.Range("B:B")<br /> <span style="color:#009900;">'buscamos el dato en esta Hoja2</span><br /> Set existe = .Find(dato, LookAt:=xlWhole)<br /> <span style="color:#009900;">'si no existe, lo añadimos, pero antes nos<br /> 'situaremos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> If existe Is Nothing Then<br /> <span style="color:#009900;">'nos situamos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'bajamos hasta encontrar una fila vacía</span><br /> Do While Not IsEmpty(ActiveCell)<br /> ActiveCell.Offset(1, 0).Select<br /> Loop<br /> <span style="color:#009900;">'y escribimos el dato</span><br /> ActiveCell = dato<br /> End If<br /> <span style="color:#009900;">'seleccionamos la Hoja2</span><br /> Hoja2.Select<br /> <span style="color:#009900;">'subimos al principio de la tabla</span><br /> Range("B5").Select<br /> End With<br /> <span style="color:#009900;">'volvemos a la Hoja1</span><br /> Hoja1.Select<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br /><span style="color:#009900;">'continuamos con el bucle</span><br />Loop<br /><span style="color:#009900;">'volvemos a la celda donde estábamos</span><br />Range(celda).Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'mostramos un mensaje si no hay errores</span><br />If Err = 0 Then mensaje = MsgBox("¡Listo!. Acabamos de hacer el " + _<br />Chr(10) + "trabajo que nos encargaste :-) ", vbInformation, "Trabajo hecho")<br />End Sub<br /></td></tr><br /></table><br />Ese macro de Excel también nos servirá para depurar la tabla de valores únicos de la Hoja2, en el caso de que eliminemos algún dato que tenga valores únicos de la Hoja1, pues no desaparecerá de forma automática ese dato eliminado en la Hoja2. Otro caso en el que nos servirá el macro, es cuando editamos un dato ya escrito. En ese caso, la primera edición permanecerá en la Hoja2, por lo que convendrá pasarle el macro, para arreglar las modificaciones realizadas en la Hoja1.<br /><br />Si este nuevo macro de Excel que acabamos de hacer, lo asignamos a un botón como se muestra en la siguiente imagen, con tan solo leer el texto del propio botón, ya sabremos que es lo que va a ocurrir al presionarlo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjICN7RqZp1tZANlWbhfAixSn1JBzaJikSdr96RXqTc4zXtYsBvjMFhlCdnvnbpo1ISBAyY0twpyt428HD_vB1k4hCWPPZb2YmGN4jCLDV0og53E1kbk7sZA53PluhQbSX4WcHxofuXWKrY/s1600/tabla-ya-hecha-obtener-valores-unicos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 289px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjICN7RqZp1tZANlWbhfAixSn1JBzaJikSdr96RXqTc4zXtYsBvjMFhlCdnvnbpo1ISBAyY0twpyt428HD_vB1k4hCWPPZb2YmGN4jCLDV0og53E1kbk7sZA53PluhQbSX4WcHxofuXWKrY/s400/tabla-ya-hecha-obtener-valores-unicos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711636395119484050" /></a><br />Con esto podríamos dar por finalizado este trabajo, porque hemos hecho lo que pretendíamos hacer al principio, que no es otra cosa que obtener valores únicos a partir de una lista con valores duplicados, pero como nos gusta complicarnos la vida, vamos a liarla un poco más.<br /><br />Vamos a añadir una columna adicional en la Hoja1, con valores numéricos, de tal forma que imaginaremos que los nombres introducidos son los de nuestros vendedores, y los importes serán la cifra de ventas de cada uno de ellos:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPOfjIXh4HNGfJA_TgvVGNeFWCZBtxc6w3EmBsNGdI7oGKUKtC9ncbK19D4PwAR6Ckd_KZ7B4xpxufICbeFMvXREBPACJA486y1xtfrFRCqPgOgSByvkl_NGVglnn1Yc9TWFEq6SYRc1sB/s1600/tabla-con-valores-duplicados.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 393px; height: 308px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPOfjIXh4HNGfJA_TgvVGNeFWCZBtxc6w3EmBsNGdI7oGKUKtC9ncbK19D4PwAR6Ckd_KZ7B4xpxufICbeFMvXREBPACJA486y1xtfrFRCqPgOgSByvkl_NGVglnn1Yc9TWFEq6SYRc1sB/s400/tabla-con-valores-duplicados.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711633603607779778" /></a><br />Y claro, ahora nos interesará obtener en la Hoja2, no solo los valores únicos, sino además, la suma de la cifra de ventas de cada uno de los vendedores, y para acabar de redondearlo, el número de acciones de venta de cada uno de ellos, es decir, el número de ventas o transacciones, que no será otra cosa que el número de veces que sale en esta Hoja1, cada uno de los vendedores. Esto podríamos conseguirlo por ejemplo, mediante el uso de una tabla dinámica, pero vamos a prescindir de ella, para hacerlo "a pelo" con macros de Excel, como siempre solemos hacer.<br /><br />Comenzaremos colocando este código en la Hoja1:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Change(ByVal Target As Range)<br /><span style="color:#009900;">'Al introducir un valor en la columna B o C,<br />'siempre que tengamos el dato de laotra columna<br />'llamaremos al macro "valores_unicos_instantaneos"</span><br />If (Not Application.Intersect(Target, Range("B:B")) Is Nothing And ActiveCell <> "" And _<br />ActiveCell.Offset(0, 1) <> "") Or (Not Application.Intersect(Target, Range("C:C")) Is Nothing _<br />And ActiveCell <> "" And ActiveCell.Offset(0, -1) <> "") Then<br /> <span style="color:#009900;">'siempre que no estemos en la columna 1</span><br /> If ActiveCell.Column > 1 Then<br /> <span style="color:#009900;">'llamamos al macro</span><br /> valores_unicos_instantaneos<br /> End If<br />End If<br />End Sub<br /></td></tr><br /></table><br />Ese código anterior, lo que hace es evaluar si cada vez que escribimos un dato en la columna B, tenemos asociado a su derecha en la columna C, otro dato. Si así fuera, ejecutaríamos el macro llamado “valores_unicos_instantaneos”. También lanzaremos este macro si escribimos un dato en la columna C, y tenemos en su columna inmediatamente anterior otro dato (en la columna B).<br /><br />Ahora colocaremos este código en un módulo:<br /><table class="tablavba"><tr><td>Sub valores_unicos_instantaneos()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'pasamos los datos a variable2</span><br />dato1 = Range("B" & ActiveCell.Row)<br />dato2 = Range("C" & ActiveCell.Row)<br /><span style="color:#009900;">'buscamos ese dato1 en la Hoja2,<br />'y más concretamente en la columna B</span><br />With Hoja2.Range("B:B")<br /> <span style="color:#009900;">'buscamos el dato1 en esta Hoja2</span><br /> Set existe = .Find(dato1, LookAt:=xlWhole)<br /> <span style="color:#009900;">'si no existe, lo añadimos, pero antes nos<br /> 'situaremos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> If existe Is Nothing Then<br /> <span style="color:#009900;">'nos situamos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'bajamos hasta encontrar una fila vacía</span><br /> Do While Not IsEmpty(ActiveCell)<br /> ActiveCell.Offset(1, 0).Select<br /> Loop<br /> <span style="color:#009900;">'y escribimos los datos, comenzando por el vendedor</span><br /> ActiveCell = dato1<br /> <span style="color:#009900;">'ahora el importe</span><br /> ActiveCell.Offset(0, 1) = dato2<br /> <span style="color:#009900;">'ahora añadimos una venta</span><br /> ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1<br /> <span style="color:#009900;">'si ya existe, sumamos la cantidad, y añadimos una venta</span><br /> Else<br /> <span style="color:#009900;">'seleccionamos la Hoja2</span><br /> Hoja2.Select<br /> <span style="color:#009900;">'seleccionamos el valor encontrado</span><br /> existe.Select<br /> <span style="color:#009900;">'añadimos la cantidad</span><br /> ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) + dato2<br /> <span style="color:#009900;">'añadimos una venta</span><br /> ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1<br /> End If<br />End With<br /><span style="color:#009900;">'subimos al principio de la tabla</span><br />Range("B5").Select<br /><span style="color:#009900;">'volvemos a la Hoja1</span><br />Hoja1.Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br />End Sub<br /></td></tr><br /></table><br />Este macro que acabamos de implementar está muy bien, siempre que estemos introduciendo datos, pues obtendremos los valores únicos en la Hoja2. Pero como en el caso anterior, tiene un problema, y es que cuando nos equivocamos una vez introducidos el nombre del empleado y la cifra de ventas, si editamos el nombre poniendo un nuevo vendedor, nos genera una nueva línea en la Hoja2, pero sin eliminar el dato anterior. Si eliminamos una fila con un valor único en la Hoja1, tampoco nos lo eliminará en la Hoja2.<br /><br />Todo esto lo podríamos haber resuelto creando un macro que evalúe toda la columna cada vez que introducimos o editamos un dato en la Hoja1, pero eso es cargar innecesariamente el programa con tareas innecesarias. La solución pasa como en el ejemplo anterior, por ejecutar el macro que os pongo a continuación -una vez finalizada la tabla de la Hoja1-, y que podemos asignar a un botón:<br /><table class="tablavba"><tr><td>Sub valores_unicos()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'fichamos la celda donde estamos, para volver a ella al final</span><br />celda = ActiveCell.Address<br /><span style="color:#009900;">'si en la hoja2, la celda B5 contiene datos,<br />'eliminamos todas las filas con datos contiguas</span><br />If Hoja2.Range("B5") <> "" Then<br /> <span style="color:#009900;">'seleccionamos la hoja2</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'seleccionamos el rango contínuo hasta abajo</span><br /> Range(Selection, Selection.End(xlDown)).Select<br /> <span style="color:#009900;">'eliminamos las filas</span><br /> Selection.EntireRow.Delete<br /> <span style="color:#009900;">'volvemos a B5</span><br /> Range("B5").Select<br />End If<br /><span style="color:#009900;">'seleccionamos la hoja1</span><br />Hoja1.Select<br /><span style="color:#009900;">'y nos situamos en B5</span><br />Range("B5").Select<br /><span style="color:#009900;">'hasta que no encuentre una fila vacía...</span><br />Do While Not IsEmpty(ActiveCell)<br /> <span style="color:#009900;">'pasamos los datos a variables</span><br /> dato1 = ActiveCell<br /> dato2 = ActiveCell.Offset(0, 1)<br /> <span style="color:#009900;">'buscamos ese dato1 en la Hoja2,<br /> 'y más concretamente en la columna B</span><br /> With Hoja2.Range("B:B")<br /> <span style="color:#009900;">'buscamos el dato1 en esta Hoja2</span><br /> Set existe = .Find(dato1, LookAt:=xlWhole)<br /> <span style="color:#009900;">'si no existe, lo añadimos, pero antes nos<br /> 'situaremos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> If existe Is Nothing Then<br /> <span style="color:#009900;">'nos situamos en la primera celda donde queremos<br /> 'empezar a escribir los valores únicos</span><br /> Hoja2.Select<br /> Range("B5").Select<br /> <span style="color:#009900;">'bajamos hasta encontrar una fila vacía</span><br /> Do While Not IsEmpty(ActiveCell)<br /> ActiveCell.Offset(1, 0).Select<br /> Loop<br /> <span style="color:#009900;">'y escribimos los datos, comenzando por el vendedor</span><br /> ActiveCell = dato1<br /> <span style="color:#009900;">'ahora el importe</span><br /> ActiveCell.Offset(0, 1) = dato2<br /> <span style="color:#009900;">'ahora añadimos una venta</span><br /> ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1<br /> <span style="color:#009900;">'si ya existe, sumamos la cantidad, y añadimos una venta</span><br /> Else<br /> <span style="color:#009900;">'seleccionamos la Hoja2</span><br /> Hoja2.Select<br /> <span style="color:#009900;">'seleccionamos el valor encontrado</span><br /> existe.Select<br /> <span style="color:#009900;">'añadimos la cantidad</span><br /> ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) + dato2<br /> <span style="color:#009900;">'añadimos una venta</span><br /> ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1<br /> End If<br /> <span style="color:#009900;">'seleccionamos la Hoja2</span><br /> Hoja2.Select<br /> <span style="color:#009900;">'subimos al principio de la tabla</span><br /> Range("B5").Select<br /> End With<br /> <span style="color:#009900;">'volvemos a la Hoja1</span><br /> Hoja1.Select<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br /><span style="color:#009900;">'continuamos con el bucle</span><br />Loop<br /><span style="color:#009900;">'volvemos a la celda donde estábamos</span><br />Range(celda).Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'mostramos un mensaje si no hay errores</span><br />If Err = 0 Then mensaje = MsgBox("¡Listo!. Acabamos de hacer el " + _<br />Chr(10) + "trabajo que nos encargaste :-) ", vbInformation, "Trabajo hecho")<br />End Sub<br /></td></tr><br /></table><br />De tal forma que tras ejecutar ese macro en la Hoja1, sobre esta tabla con datos:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha5BfVqMkFPvnJmDo4ELC2aB3KSGje6sHasjEIpM8oAk8YlqVtcXi84HWiAmF7mqil9_zkykkooO8rbL5856A9mReTsEmlXHJkNhGuYvNsZ5Jt-MkDfuvwhvmDakNBUhalm69HqGqfN5pD/s1600/tabla-ya-hecha-con-valores-duplicados-y-obtener-valores-unicos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 391px; height: 307px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha5BfVqMkFPvnJmDo4ELC2aB3KSGje6sHasjEIpM8oAk8YlqVtcXi84HWiAmF7mqil9_zkykkooO8rbL5856A9mReTsEmlXHJkNhGuYvNsZ5Jt-MkDfuvwhvmDakNBUhalm69HqGqfN5pD/s400/tabla-ya-hecha-con-valores-duplicados-y-obtener-valores-unicos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711639863987855954" /></a><br />Obtendríamos esto en la Hoja2:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbIO46OTC8LByIWfXgTgo_tBkhlgt0T1BF2vPQhX3aoablcWZw5nfj9gdlRkqtKcYFkTdgCXUgkhgsdghHQ24AoEsqXqS-uDSD8pLzZhMO8kEHJI8ZbQG2rmV7NHVYRoJ2UWyRHOOEn4w/s1600/pasar-de-duplicados-a-valores-unicos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 206px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbIO46OTC8LByIWfXgTgo_tBkhlgt0T1BF2vPQhX3aoablcWZw5nfj9gdlRkqtKcYFkTdgCXUgkhgsdghHQ24AoEsqXqS-uDSD8pLzZhMO8kEHJI8ZbQG2rmV7NHVYRoJ2UWyRHOOEn4w/s400/pasar-de-duplicados-a-valores-unicos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5711640185119133074" /></a><br />Como veis, con los macros podemos idear una alternativa fiable, para competir tanto a los filtros avanzados, como a las tablas dinámicas, a la hora de presentar valores únicos, y para construir tablas con un resumen de datos.<br /><br />Desde aquí podéis <a href="http://www.mediafire.com/?8temqoc1z98aewm" title="descargar un fichero zip comprimido" target="_blank" rel="nofollow">descargar un fichero zip comprimido</a>, con los ejemplos de Excel que hemos visto en este artículo. En el fichero comprimido se incluye tanto el libro de Excel “Valores únicos (ejemplo 1).xls”, como el libro “Valores únicos (ejemplo 2).xls”, que son los que hemos utilizado para ilustrar este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com13tag:blogger.com,1999:blog-7983188466168395484.post-55258138157548349212012-01-25T18:14:00.027+01:002017-01-20T17:02:20.860+01:00Plantillas ExcelDespués del cierre de Megaupload, he colocado nuevamente y en los servidores de Mediafire, todos los ejemplos que tenía en el blog de <a href="http://www.hojasdecalculoexcel.com" title="Excel"><strong>Excel</strong></a>, y en los que había un libro o una plantilla en Excel para descargar.<br /><br />Para ahorraros el trabajo, paso a relacionaros todos los artículos donde hay ejercicios o ejemplos con plantillas en Excel, listas para usar, y que están nuevamente online. Si hubiera algún problema con alguna descarga, o me he dejado alguna plantilla de Excel por incluir, por favor, dejad un comentario en este nuevo artículo, para poder corregirlo, y ponerlo a disposición de todos los lectores del blog.<br /><br />Aprovecho también para comunicaros que en este mismo artículo, iré incluyendo los ficheros de los nuevos artículos que publique, con lo que será un post de actualización continua, y donde siempre podréis consultar de un simple vistazo, aquellos temas que más os interesen y de los que queráis bajaros algún ejemplo de Excel listo para usar.<br /><br /><table align="center" width="100%" cellspacing="0" cellpadding="6" style="border: 1px solid #6a8535; border-collapse: collapse;"><tr style="background-color: #bcd191;"><td style="font-size: 12px;"><strong>Artículo de Excel publicado</strong></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><strong>Descarga del fichero de Excel</strong></td></tr>
<tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2017/01/aplicacion-en-excel-para-el-calculo-de.html" title="Aplicación en Excel para el cálculo de préstamos (todo en uno)">Aplicación en Excel para el cálculo de préstamos (todo en uno)</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?q7qapac7p0n7qrp" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr>
<tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2015/12/determinar-las-cabeceras-de-una-tabla.html" title="Determinar las cabeceras de una tabla donde tenemos los valores buscados">Determinar las cabeceras de una tabla donde tenemos los valores buscados</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?15yv4j3c0le5ipk" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr>
<tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2015/04/en-que-columnas-tenemos-los-datos-que.html" title="¿En qué columnas tenemos los datos que buscamos?">¿En qué columnas tenemos los datos que buscamos?</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?h47seqyqsfzrv7b" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2015/01/obtener-un-consolidado-extrayendo-los.html" title="Obtener un consolidado, extrayendo los datos de diferentes ficheros">Obtener un consolidado, extrayendo los datos de diferentes ficheros</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?vy0a6o97g7pyvmg" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2012/02/obtener-valores-unicos-en-excel.html" title="Obtener valores únicos en Excel">Obtener valores únicos en Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?8temqoc1z98aewm" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/09/33-utilidades-para-microsoft-excel.html" title="33 utilidades para Microsoft Excel (manual en PDF)">33 utilidades para Microsoft Excel (manual en PDF)</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?v3sj7mso0rg33dv" title="Descargar manual en PDF" target="_blank" rel="nofollow">Descargar manual en PDF</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/08/calendario-emergente-en-excel.html" title="Calendario emergente en Excel">Calendario emergente en Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?pspbc822y38awbk" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/06/controlar-vencimientos-de-facturas-y.html" title="Controlar vencimientos de facturas y recibos, con descuento comercial">Controlar vencimientos de facturas y recibos, con descuento comercial</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?yb92ftapk4z3uy7" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/05/buscar-valores-en-un-rango-de-datos.html" title="Buscar valores en un rango de datos">Buscar valores en un rango de datos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?412e79dtqdf8u3c" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/03/mostrar-imagenes-en-un-formulario.html" title="Mostrar imágenes en un formulario">Mostrar imágenes en un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?p3322u2my3uwpwc" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2011/01/medias-ponderadas.html" title="Medias ponderadas">Medias ponderadas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?jud43kn8ym6ttoe" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/11/incluir-un-calendario-en-un-formulario.html" title="Incluir un calendario en un formulario">Incluir un calendario en un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?kb1m966p0c9l6k9" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/09/calcular-vencimientos.html" title="Calcular vencimientos">Calcular vencimientos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?f5ms3dt5yj055lj" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/09/controlar-vencimientos-de-facturas-y.html" title="Controlar vencimientos de facturas y recibos">Controlar vencimientos de facturas y recibos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?wtip1a1agldr7qh" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/06/prestamos-segun-el-metodo-americano.html" title="Préstamos según el método americano">Préstamos según el método americano</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?w72nyjqh39wsko9" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/05/prestamos-con-amortizacion-de-capital.html" title="Préstamos con amortización de capital constante">Préstamos con amortización de capital constante</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?777h1gifdqzh47m" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/04/calculadora-de-tiempos.html" title="Calculadora de tiempos">Calculadora de tiempos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?u5bhtyt6n2ljyib" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/03/habilitar-y-deshabilitar-controles-de.html" title="Habilitar y deshabilitar controles de un formulario">Habilitar y deshabilitar controles de un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?mj6jyspyurxyrwr" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/02/calcular-la-tae.html" title="Calcular la TAE">Calcular la TAE</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?7sbkb8s480gc9n5" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html" title="Préstamos y cálculo de hipotecas">Préstamos y cálculo de hipotecas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?3k4w3et82vx4ckk" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/12/modificar-datos-utilizando-un.html" title="Modificar datos utilizando un formulario">Modificar datos utilizando un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?p5lmhn47alxl3vx" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/12/protegiendo-nuestros-trabajos-en-excel.html" title="Protegiendo nuestros trabajos en Excel">Protegiendo nuestros trabajos en Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?59u9ihz3z6d6eaa" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/11/introducir-datos-utilizando-un.html" title="Introducir datos utilizando un formulario">Introducir datos utilizando un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?5aqjfvjdc72ko28" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/11/calendarios-para-imprimir.html" title="Calendarios para imprimir">Calendarios para imprimir</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?qry48k2xscm9bb3" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/10/enviar-un-email-desde-excel.html" title="Enviar un email desde Excel">Enviar un email desde Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?5tn89torunb25r8" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/09/obtener-datos-de-una-pagina-web.html" title="Obtener datos de una página web">Obtener datos de una página web</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?8fcdelbfhp3gqf7" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/09/ejecutar-macro-al-seleccionar-combobox.html" title="Ejecutar macro al seleccionar un elemento de un combobox">Ejecutar macro al seleccionar un elemento de un combobox</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?sq714al8t3budap" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/09/espacio-libre-y-total-en-disco.html" title="Espacio libre y espacio total en disco">Espacio libre y espacio total en disco</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?cu3z46s78u86qyv" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/08/validar-la-entrada-de-datos-en-un.html" title="Validar la entrada de datos en un formulario">Validar la entrada de datos en un formulario</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?b918e7p4d5xs0gj" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/06/numeros-aleatorios-no-repetidos.html" title="Números aleatorios no repetidos">Números aleatorios no repetidos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?s91tvv7xr6fz195" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/06/escribir-datos-de-otro-fichero-excel.html" title="Escribir datos de otro fichero Excel">Escribir datos de otro fichero Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?bbc46oajxvyufzc" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/05/formularios-dinamicos.html" title="Formularios dinámicos">Formularios dinámicos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?6zt8c92y14a4xl1" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/05/buscar-hojas-ocultas.html" title="Buscar hojas ocultas">Buscar hojas ocultas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?20mexywampmatqq" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/04/informar-macro-ejecutandose.html" title="Informar de que está ejecutándose un macro">Informar de que está ejecutándose un macro</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?gda3fm1imnmvbul" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/03/importar-datos-concretos-de-un-fichero.html" title="Importar datos concretos de un fichero de texto">Importar datos concretos de un fichero de texto</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?aswcho3cwo398po" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/03/combinar-correspondencia-excel-word.html" title="Combinar correspondencia con Excel y Word">Combinar correspondencia con Excel y Word</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?806bwnrf5oio5jp" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/02/calcular-vencimientos-reales-de.html" title="Calcular vencimientos reales de facturas">Calcular vencimientos reales de facturas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?49lf8o9zvir3zce" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/02/combobox-sacandoles-provecho.html" title="Combobox: sacándoles provecho">Combobox: sacándoles provecho</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?td1gbzdjcdkvowf" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2009/01/solver-clculo-de-la-tir.html" title="Solver: cálculo de la TIR">Solver: cálculo de la TIR</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?7e9zbb539eitzfz" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/12/combobox-dependientes.html" title="Combobox dependientes">Combobox dependientes</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?d7j9vihdd0nbneh" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/12/impedir-que-se-cambie-el-nombre-una.html" title="Impedir que se cambie el nombre a una hoja">Impedir que se cambie el nombre a una hoja</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?cg29846vjygqzc1" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/11/evolucin-de-un-capital-inters-simple-y.html" title="Evolución de un capital a interés simple y a interés compuesto">Evolución de un capital a interés simple y a interés compuesto</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?ylx7qbgrcsb5yk6" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/11/euroconversor.html" title="Euroconversor">Euroconversor</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?hlb6tw9e0zgm1ji" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/11/listar-los-archivos-de-un-directorio.html" title="Listar los ficheros de un directorio">Listar los ficheros de un directorio</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?wma8b1xqb1xnk41" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/11/convertir-unidades-de-tiempo-formato.html" title="Convertir unidades de tiempo a formato hh:mm:ss">Convertir unidades de tiempo a formato hh:mm:ss</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?uhu3d5o2aduh1ah" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/10/calcular-el-umbral-de-rentabilidad-con.html" title="Calcular el umbral de rentabilidad, con Excel">Calcular el umbral de rentabilidad, con Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?ksun32csn71kgym" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/10/llenar-dinamicamente-un-combobox.html" title="Llenar dinámicamente un combobox">Llenar dinámicamente un combobox</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?i8tmbda3pd3zoon" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/10/control-horario-horas-normales-y-horas.html" title="Control horario: Horas normales y horas extras">Control horario: Horas normales y horas extras</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?7ru95oeczyb3pae" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/10/mostrar-y-ocultar-hojas-utilizando.html" title="Mostrar y ocultar hojas, utilizando macros">Mostrar y ocultar hojas, utilizando macros</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?dztw2sun68cb32u" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/09/mostrar-imgenes-asociadas-un.html" title="Mostrar imágenes asociadas a un desplegable">Mostrar imágenes asociadas a un desplegable</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?16f2rhj68a8hdhu" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/09/validacin-de-listas-dependientes.html" title="Validación de listas dependientes">Validación de listas dependientes</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?xzndy9vjbs3zlss" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/08/validacin-con-datos-en-otra-hoja.html" title="Validación con datos en otra hoja">Validación con datos en otra hoja</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?8zq33dyhq7yah9f" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/07/crear-un-grfico-con-un-macro.html" title="Crear un gráfico, con un macro">Crear un gráfico, con un macro</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?de3ft50e0jvec4j" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/07/formularios-inteligentes.html" title="Formularios inteligentes">Formularios inteligentes</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?q5609ur1a9sc35a" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/06/ms-sobre-las-funciones-de-bases-de.html" title="Más sobre las funciones de bases de datos personalizadas">Más sobre las funciones de bases de datos personalizadas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?1pl99irfu46djsl" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/06/funciones-de-bases-de-datos.html" title="Funciones de bases de datos personalizadas">Funciones de bases de datos personalizadas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?hf6vaot1zbp2mtt" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/06/volviendo-con-los-nmeros-aleatorios.html" title="Volviendo con los números aleatorios">Volviendo con los números aleatorios</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?aen1bqtamlbw5qp" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/06/sencilla-aplicacin-en-excel.html" title="Sencilla aplicación en Excel">Sencilla aplicación en Excel</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?piqr7crx7a06nnp" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/05/leer-el-nmero-de-serie-de-los-discos.html" title="Leer el número de serie de los discos">Leer el número de serie de los discos</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?31mle5c1q1dtqr3" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/04/leer-una-base-de-datos-access.html" title="Leer una base de datos Access">Leer una base de datos Access</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?n585ybxbv55lm1i" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/04/calcular-la-letra-del-nif-o-del-dni.html" title="Calcular la letra del NIF (o del DNI)">Calcular la letra del NIF (o del DNI)</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?dwit5a7uvd3sn81" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/04/leer-un-fichero-de-texto-plano.html" title="Leer un fichero de texto plano">Leer un fichero de texto plano</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?budx7m2oaj0t2qk" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/04/impedir-que-se-cambie-el-nombre-al.html" title="Impedir que se cambie el nombre al fichero">Impedir que se cambie el nombre al fichero</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?i98ynamdf8dmigm" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/04/uso-de-la-funcin-bdcontar.html" title="La función BDContar">La función BDContar</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?j396qe063c92ed3" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr style="background-color: #f4f7ed;"><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/03/crear-hojas-con-un-clic.html" title="Crear hojas con un clic">Crear hojas con un clic</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?j73i6lfcevd6qig" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr><tr><td style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.hojasdecalculoexcel.com/2008/03/tiempo-transcurrido-entre-dos-fechas.html" title="Tiempo transcurrido entre dos fechas">Tiempo transcurrido entre dos fechas</a></td><td align="center" style="border: 1px solid #6a8535; font-size: 12px;"><a href="http://www.mediafire.com/?28s1q11qrimrc3u" title="Descargar plantilla de Excel" target="_blank" rel="nofollow">Descargar plantilla de Excel</a></td></tr></table>El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com9tag:blogger.com,1999:blog-7983188466168395484.post-41744371842153793892011-09-14T00:01:00.019+02:002012-09-10T00:52:36.438+02:0033 Utilidades para Microsoft ExcelHoy os presento un manual en pdf, de lo que creo que podrían ser, las 33 mejores utilidades para Microsoft <a href="http://www.hojasdecalculoexcel.com" title="Excel">Excel</a> que he publicado en el blog. Quizás algunos de vosotros no estéis de acuerdo, y penséis que hay otros artículos en el blog que deberían incluirse en el manual. Muy probablemente tengáis razón, pero he escogido esas 33 utilidades, después de hacer muchos descartes.<br /><br />Este manual con <strong>33 utilidades para Microsoft Excel</strong>, no pretende ser un manual de cabecera, pero si un manual de consulta, especialmente ideado para aquellos lectores que quieran aprender las posibilidades de las <strong>macros en Excel</strong>. No obstante, este manual no solo incluye macros, sino que también podréis encontrar en él, funciones propias de Excel, como la <a href="http://www.hojasdecalculoexcel.com/2009/05/calcular-la-tir-y-el-van.html" title="TIR">TIR</a>, y el VAN, por poner solo dos ejemplos.<br /><br />El manual, como todo lo que encontrarás en este humilde blog de Excel, es gratuito y de libre distribución, por lo que puedes imprimirlo, enviárselo a tus amigos, compartirlo, y en definitiva, hacer lo que quieras con el :-)<br /><br />En muchos de los artículos, podréis comprobar que al final de los mismos, hay un enlace para descargar un fichero con todo lo explicado, para que el usuario no tenga que partir de cero escribiendo el código fuente en Excel. Asimismo, se incluye un enlace a la entrada original de este blog, por si en algún momento el lector quiere acercarse hasta aquí, para ver si he realizado algún cambio o modificación en algún artículo del blog, como ha ocurrido recientemente por ejemplo, en el que explico como <a href="http://www.hojasdecalculoexcel.com/2009/09/obtener-datos-de-una-pagina-web.html" title="obtener datos de una página web">obtener datos de una página web</a>.<br /><br />Estas son las utilidades que he incluido en el pdf:<br /><br />1. Obtener el nombre del archivo.<br />2. Obtener el nombre de la hoja.<br />3. Obtener la ruta, el nombre del fichero, y la hoja.<br />4. Mi primer macro en Excel.<br />5. Mi primer UserForm.<br />6. Introducir datos utilizando un formulario.<br />7. Modificar datos utilizando un formulario.<br />8. Mi primer ComboBox.<br />9. Sacándoles provecho a los ComboBox.<br />10. Macro al abrir o cerrar un libro.<br />11. Desproteger una hoja de cálculo.<br />12. Crear carpetas (o directorios), desde Excel.<br />13. Poner la hora en una celda.<br />14. Crear hojas con un clic.<br />15. Buscar hojas ocultas.<br />16. Mostrar y ocultar hojas, utilizando macros.<br />17. Leer una base de datos Access.<br />18. Simultanear filas de colores.<br />19. Validación con datos en otra hoja.<br />20. Validación de listas dependientes.<br />21. Control horario: horas normales y horas extras.<br />22. Números aleatorios no repetidos.<br />23. Préstamos y cálculo de hipotecas.<br />24. Préstamos según el método americano.<br />25. Préstamos con amortización de capital constante.<br />26. Calcular la TAE.<br />27. Calcular la TIR y el VAN.<br />28. Evolución de un capital a interés simple e interés compuesto.<br />29. Calcular la letra del NIF/DNI.<br />30. Controlar vencimientos de facturas y recibos.<br />31. Calcular vencimientos.<br />32. Obtener datos de una página web.<br />33. Calendarios para imprimir.<br /><br />Aquí os dejo una imagen de una vista a 4 páginas, para que os hagáis una idea de lo que podéis encontrar en el pdf que podéis descargar más abajo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg22WhpmlOHeZsrn_1BMhnquiB-4Vt5loF_u3a0pGAWpPuNYbU2BIlu5MjUv-Te_UpYfbGimKOG8zUhJe28tY0AJOkXXnOcscHlLnkAgL2BZh_7n9xiiV9yf9Uu_KHXSTQgKVZfawFpogk2/s1600/33-utilidades-para-Microsoft-Excel.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 287px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg22WhpmlOHeZsrn_1BMhnquiB-4Vt5loF_u3a0pGAWpPuNYbU2BIlu5MjUv-Te_UpYfbGimKOG8zUhJe28tY0AJOkXXnOcscHlLnkAgL2BZh_7n9xiiV9yf9Uu_KHXSTQgKVZfawFpogk2/s400/33-utilidades-para-Microsoft-Excel.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5651949056209991362" /></a><br />Ya no os hago esperar más. Aquí tenéis el manual con las <strong>33 utilidades para Microsoft Excel</strong> (cliquead en la imagen para descargar el manual en pdf):<br /><br /><div align="center"><a href="http://www.mediafire.com/?v3sj7mso0rg33dv" rel="nofollow" target="_blank" title="33 utilidades para Microsoft Excel"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiWktZKnHy-dFKYlKRSifh8fWR49aUcD4cyUC-cDFZ9R8pTkFaK_N-tRWk4dCKR6Bi_yLLJii6I12rrTaErR1A2Ts90yark7wbtPv-Ac7fqho3T7yXVcTobxEIHb3Rfiza_4zRPKNWH46w/s1600/33-utilidades-para-Microsoft-Excel-en-pdf.png" title="33 utilidades para Microsoft Excel" alt="Descargar el manual con 33 utilidades para Microsoft Excel"></a></div><br />Si te ha gustado este manual en pdf, te agradecería que dejases un comentario.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com108tag:blogger.com,1999:blog-7983188466168395484.post-46810688198969542122011-08-09T23:22:00.014+02:002012-06-30T21:24:04.656+02:00Calendario emergente en ExcelEste artículo nace como respuesta a una consulta de un lector del blog en otro artículo relacionado, donde explicaba como <a href=" http://www.hojasdecalculoexcel.com/2010/11/incluir-un-calendario-en-un-formulario.html" title="incluir un calendario en un formulario" target="_blank">incluir un calendario en un formulario</a>. Concretamente se planteaba la pregunta de si se podía mostrar un <strong>calendario emergente</strong> en Excel, simplemente cliqueando en una celda.<br /><br />La respuesta seguro que ya la sabéis, porque sino, no estaría escribiendo este artículo. Pues sí, se puede. En este caso, lo vamos a hacer sin necesidad de incluir el calendario en un formulario. Simplemente haremos que el calendario aparezca, sin más.<br /><br />Creo que el artículo de hoy os puede ser de mucha utilidad, especialmente si trabajamos con hojas de cálculo en las que tengamos que introducir muchas fechas del mes en curso (del mes en el que estamos), pues con un solo clic en el día del calendario, nos aparecerá la fecha en la celda donde estemos. También lo podemos utilizar para introducir fechas correspondientes a otros meses y/o años, pero ya no será tan rápida la introducción de los datos, pues deberemos realizar más de un clic en el calendario (para seleccionar el mes y/o año, y el día). Puede ser interesante por ejemplo, como complemento llevar el control mensual de cobros y pagos, para hacer un presupuesto diario, o para llevar el control de asistencias del personal, por poner solo tres casos.<br /><br />Para poder hacer todo esto, lo primero que tendremos que hacer es "dibujar" el calendario. Ojo, con esto de dibujar, me estoy refiriendo simplemente, a darle al calendario las dimensiones que deseemos. Para ello, si usamos Excel 2003, seleccionaremos en Herramientas --> Personalizar --> y en la pestaña de barras de herramientas, seleccionaremos "Cuadro de controles". Una vez hecho esto, nos aparecerá la barra de controles, así que cerraremos la ventana emergente de personalización. Seguidamente, seleccionaremos el icono del final que tiene un dibujillo de un martillo y una llave, y seleccionaremos "Control de calendario 11.0".<br /><br />En el caso de que utilicemos Excel 2007 y Excel 2010, para mostrar el Cuadro de controles, antes debemos hacer visible la pestaña "Programador". Para ello, nos iremos a Archivo --> Opciones --> Personalizar cinta de opciones --> y pondremos una muesca en "Programador". Una vez tengamos en la cinta de opciones la ficha Programador, dentro de ella, encontraremos el Cuadro de controles, seleccionando "Insertar", cuyo icono es el martillo y la llave.<br /><br />En el caso concreto de utilizar Excel 2010 es más que probable que no os aparezca el control calendario. Para solucionar este contratiempo, deberéis seguir las instrucciones del comentario que publiqué el 15 de junio de 2011, ante una pregunta de un usuario, y que veréis al final del artículo <a href=" http://www.hojasdecalculoexcel.com/2010/11/incluir-un-calendario-en-un-formulario.html" title="incluir un calendario en un formulario" target="_blank">incluir un calendario en un formulario</a>. Os remito directamente a ese comentario, para no duplicar el contenido.<br /><br />Aquí tenéis una imagen de Excel 2003, que es la versión que más suelo utilizar:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXjWB532CM2MwIwIBl75vH9PudZpXTOw-jFQTw06j9I_6rHZB41CPzYlgCJuqzqQACLarSuhVds8OgPzBrBLscdVXTu7NkELf_pB3D4IgVALLjieZM3CTARJOZQEnkXjoSCWFKfA4ys0OM/s1600/control-calendario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 392px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXjWB532CM2MwIwIBl75vH9PudZpXTOw-jFQTw06j9I_6rHZB41CPzYlgCJuqzqQACLarSuhVds8OgPzBrBLscdVXTu7NkELf_pB3D4IgVALLjieZM3CTARJOZQEnkXjoSCWFKfA4ys0OM/s400/control-calendario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5638976051552499458" /></a><br />Una vez tengamos todo listo, y hayamos seleccionado el control calendario, solo nos quedará dibujar el calendario en la hoja de cálculo para que tenga el tamaño que deseemos. Para ello, simplemente deberemos cliquear y arrastrar el mouse, para darle la forma que queramos. Una vez hecho eso, si usamos Excel 2003, pulsaremos en el primer icono de la barra de Cuadro de controles (la escuadra, la regla, y el lápiz), para salir del modo diseño. En Excel 2007 y 2010, simplemente cliquearemos en el icono que hay junto al de Cuadro de controles, con el lápiz, regla y escuadra, para salir del modo diseño. A continuación, cerraremos la barra de Cuadro de controles, pues ya no la vamos a necesitar más.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzyhP0wbw_sU8cBUc8-j5f3rFA-6HXBiDR0u59-YKCR63Dsbe6xsFAxoQHKTELJIYzfk9_MrukDFH3Zi5MTkhBj9GPT8Pr07xs7FJZP0v_jg9eUhPENlZJOz7l8FBTs6KrG7D96J6IOfHz/s1600/control-calendario-en-excel.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 262px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzyhP0wbw_sU8cBUc8-j5f3rFA-6HXBiDR0u59-YKCR63Dsbe6xsFAxoQHKTELJIYzfk9_MrukDFH3Zi5MTkhBj9GPT8Pr07xs7FJZP0v_jg9eUhPENlZJOz7l8FBTs6KrG7D96J6IOfHz/s400/control-calendario-en-excel.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5638980264314984738" /></a><br />Una vez hecho esto, solo nos quedará incluir el código de programación, en la hoja donde queramos hacer que aparezca el en cuestión (no en un módulo). Lo que haremos en nuestro ejemplo, será mostrar el calendario siempre que cliqueemos en una celda de la columna A. Da igual que celda sea, pues cuando cliqueemos sobre la columna A, nos aparecerá el calendario.<br /><br />Muchos estaréis pensando: "pero si ya tenemos visible el calendario, ¿cómo va a aparecer de nuevo cuando cliqueemos en una celda de la columna A?". Bueno, la respuesta es sencilla. Lo que haremos será ocultar el calendario siempre que cliqueemos en cualquier celda que no esté en la columna A, y mostrarlo cuando cliqueemos en cualquier celda de la columna A.<br /><br />¿Cómo vamos a hacer todo esto?. Pues con un sencillo código que pondremos en el evento SelectionChange. Es decir, un código que se ejecutará al cambiar la selección de la celda. También incluiremos unas sencillas líneas de código para incluir en esa celda (la de la columna A, que ha permitido que el calendario se haga visible), la fecha que seleccionemos en el calendario. Es decir, si cliqueamos en un día del calendario, esa fecha aparecerá el la celda donde estemos situados (esto lo haremos a través del evento Click).<br /><br />El código del evento SelectionChange de la hoja, será este:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_SelectionChange(ByVal Target As Range)<br /><span style="color:#009900;">'Ejemplo para mostrar el calendario al seleccionar<br />'cualquier celda de la columna A</span><br />If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then<br /> <span style="color:#009900;">'ahora le diremos donde queremos que aparezca el calendario<br /> 'para que no se quede fijo en las celdas de arriba, ya que al hacer scroll,<br /> 'se nos quedaría oculto en la parte de arriba.<br /> 'Podemos jugar con estos valores, para ver donde se muestra<br /> 'el calendario, y para que quede a nuestro gusto</span><br /> Calendar1.Left = Target.Left + Target.Width + 60<br /> <span style="color:#009900;">'para que no se nos deforme el calendario, si estamos en las últimas filas<br /> 'incluimos un condicional que controlará la celda donde estamos y<br /> 'la comparará con la última fila de la hoja de cálculo</span><br /> If ActiveCell.Row + 20 >= Cells.Rows.Count Then<br /> Calendar1.Top = Target.Top - 145<br /> Else<br /> Calendar1.Top = Target.Top - 50<br /> End If<br /> <span style="color:#009900;">'hacemos visible el calendario</span><br /> Calendar1.Visible = True<br /> <span style="color:#009900;">'Mostramos la fecha de hoy</span><br /> Calendar1.Today<br />Else<br /> <span style="color:#009900;">'ocultamos el calendario, en el caso de no<br /> 'seleccionar una celda de la columna A</span><br /> Calendar1.Visible = False<br />End If<br />End Sub<br /></td></tr><br /></table><br />Y el del evento Click del calendario será este:<br /><table class="tablavba"><tr><td>Private Sub Calendar1_Click()<br /><span style="color:#009900;">'Al hacer clic en una fecha del calendario<br />'ponemos el valor en la celda donde estemos situados</span><br />ActiveCell = Calendar1.Value<br /><span style="color:#009900;">'ocultamos el calendario</span><br />Calendar1.Visible = False<br />End Sub<br /></td></tr><br /></table><br />Con este sencillo código, obtendremos algo tan vistoso como esto, cada vez que nos situemos en una celda de la columna A:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6NFkQh_2FaOyFRWm5-d4SNatKImMJx1DZUmGGpePmhg7_7_DXw954u87zmR0ZTmJTULlz0uw2YVi4XqUUoySQ4IwDncKLQB6nLms88XAP059jDgUsqKjFHSV6UcGG7D5A1fIKvBI4tCWW/s1600/calendario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 257px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6NFkQh_2FaOyFRWm5-d4SNatKImMJx1DZUmGGpePmhg7_7_DXw954u87zmR0ZTmJTULlz0uw2YVi4XqUUoySQ4IwDncKLQB6nLms88XAP059jDgUsqKjFHSV6UcGG7D5A1fIKvBI4tCWW/s400/calendario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5639125376286316050" /></a><br />Desde aquí podéis <a href="http://www.mediafire.com/?pspbc822y38awbk" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo. Si os ha sido de utilidad, espero vuestros comentarios.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com63tag:blogger.com,1999:blog-7983188466168395484.post-58874520638809403652011-06-27T13:52:00.006+02:002012-09-10T00:44:41.892+02:00Controlar vencimientos de facturas y recibos, con descuento comercialNo hace mucho tiempo, vimos una aplicación en Excel, con la que podíamos <a href="http://www.hojasdecalculoexcel.com/2010/09/controlar-vencimientos-de-facturas-y.html" title="controlar vencimientos de facturas y recibos"> controlar vencimientos de facturas y recibos</a>. Esta aplicación estaba pensada para controlar nuestra cartera de recibos y/o facturas pendientes de cobro, y para alertarnos llegado su vencimiento.<br /><br />En el artículo de hoy, hemos añadido una funcionalidad adicional a esa aplicación en Excel, que no es otra que la del control del riesgo bancario por descuento de efectos. No entraré a detallar el código fuente, pues la mayoría de los usuarios harán caso omiso del mismo, ya que lo que buscan es una aplicación que les permita gestionar de una forma medianamente decente su cartera de recibos y de efectos descontados.<br /><br />Para el que no sepa que es el <strong>descuento comercial</strong>, simplemente daré unas pinceladas, para comentar que se trata de una fórmula de financiación, por la cual el acreedor de una deuda, puede anticipar el cobro de la misma, normalmente a través de una entidad financiera, y a cambio de un tipo de interés que suele estar en función del plazo de vencimiento de la deuda. Lo normal es que las empresas soliciten a estas entidades financieras, la apertura de una línea de descuento por un determinado importe, de acuerdo a sus necesidades previamente establecidas. Las entidades financieras, una vez analizada la documentación que les solicitarán a estas empresas, determinarán si es factible la concesión de esa línea de descuento, y el importe de la misma. Las condiciones de esta línea de descuento, se deberían negociar de forma individualizada con la entidad financiera.<br /><br />La aplicación que os presento hoy, y que no es más que una revisión de la que vimos en su día (la he llamado versión 2.0, por darle un toque algo más formal), consta en líneas generales de las siguientes mejoras:<br /><br />Añade al libro una hoja donde se incluye una relación de las entidades financieras, así como el importe de la línea de descuento de cada una de ellas. Respecto al funcionamiento de la aplicación, en lo que respeta a este límite de descuento, comentar que lo normal es que las empresas no puedan exceder de este límite, pero como no siempre es así y cada empresa es un mundo, ya que a veces las entidades te permiten exceder ese límite, esta <a href="http://www.hojasdecalculoexcel.com/search/label/aplicaciones" title="aplicaciones en Excel">aplicación en Excel</a> simplemente informa del importe del riesgo que tenemos en ese momento, del límite de la línea de descuento, y de si estamos excedidos o no, y por qué importe. Será el usuario quien decida a partir de esos datos, si la entidad financiera en cuestión, nos va a aceptar o no algún efecto comercial adicional para su descuento.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_6eyLOpRmpMNDTLj9jhUYRhYBY3S_dIr_Tm5boN4E0rsmdA6dqdgBZXXTMTgG_1XimQKwU62y0EQOm8vaVgqwUjZkGljalHUMQsAiZwTpbsKxW4GnH-g9WVZWTbSrp_-jYuJYzMYMTkQz/s1600/entidades-financieras.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 155px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_6eyLOpRmpMNDTLj9jhUYRhYBY3S_dIr_Tm5boN4E0rsmdA6dqdgBZXXTMTgG_1XimQKwU62y0EQOm8vaVgqwUjZkGljalHUMQsAiZwTpbsKxW4GnH-g9WVZWTbSrp_-jYuJYzMYMTkQz/s400/entidades-financieras.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5622842646494063138" /></a><br />En la hoja de facturas, se ha añadido una columna, para informar a través de un desplegable, de la entidad financiera en la que vamos a negociar los efectos. En el encabezado de la columna, aparece el texto "Efecto descontado en", tal y como podéis comprobar en la siguiente imagen (si no lo veis bien, cliquead en la imagen para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT9upRpxlqok6BI-286CEQGFOfJ6q12rHf-dCCNY3Cyz1lUDhiF7Y4gE-ZnSDts7-u9DIo-f5mCI8G3M9lz9vBosONxMLaqnyCuAyY2E1Eq_uWNvX8IMKjPztwCyoN2M4u17u1Y3RXhbwt/s1600/detalle-facturas-con-entidades-financieras.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT9upRpxlqok6BI-286CEQGFOfJ6q12rHf-dCCNY3Cyz1lUDhiF7Y4gE-ZnSDts7-u9DIo-f5mCI8G3M9lz9vBosONxMLaqnyCuAyY2E1Eq_uWNvX8IMKjPztwCyoN2M4u17u1Y3RXhbwt/s400/detalle-facturas-con-entidades-financieras.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5622842817397616194" /></a><br />Una vez hemos seleccionado una entidad financiera por donde descontar el efecto, veremos un MsgBox, de la siguiente forma:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi_UdOQNUXyd4J4Sl9fHIx09EhjuZ9np0zJzlSDWUh4BxcUYp7WdUSY1mtxQlB2aWXpuYFKtzpjzBx8EJp3M3IyTN2ZcfjFWNjgGnmNJY6lOMTm0b5759ZhH7vsdwcfq6M6Lt33Pk5JlEL/s1600/detalle-facturas-con-entidades-financieras-msgbox.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi_UdOQNUXyd4J4Sl9fHIx09EhjuZ9np0zJzlSDWUh4BxcUYp7WdUSY1mtxQlB2aWXpuYFKtzpjzBx8EJp3M3IyTN2ZcfjFWNjgGnmNJY6lOMTm0b5759ZhH7vsdwcfq6M6Lt33Pk5JlEL/s400/detalle-facturas-con-entidades-financieras-msgbox.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5622845771070975154" /></a><br />El MsgBox nos informará de lo siguiente:<br /><br />- Entidad financiera.<br />- Riesgo concedido.<br />- Cantidad descontada (y pendiente de vencimiento).<br />- Exceso/defecto sobre el límite de riesgo de la póliza de descuento.<br /><br />Lo podemos comprobar en el siguiente MsgBox:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifJN8bNWFrdFc1R9o6EK3qypThNNVOW69a_4jKvaAv7PsMSvD3f_znk5CC_cArrFprGQX8Rz1QGmViU-RFP9rnfH5AX8C_tja2ZznSMneK-eTOhTrgGg9RKbam_biLIy4GE9iQST5emFsF/s1600/msgbox-descuento-comercial.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 257px; height: 159px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifJN8bNWFrdFc1R9o6EK3qypThNNVOW69a_4jKvaAv7PsMSvD3f_znk5CC_cArrFprGQX8Rz1QGmViU-RFP9rnfH5AX8C_tja2ZznSMneK-eTOhTrgGg9RKbam_biLIy4GE9iQST5emFsF/s400/msgbox-descuento-comercial.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5622848176590561362" /></a><br />Finalmente, y una vez hayamos informado de todo lo necesario para el control de nuestras facturas, pulsaremos el botón <strong>Previsión de cobros</strong>, que nos llevará a la hoja donde tenemos la previsión de cobros, mes a mes. En esta hoja, se ha añadido una tabla en la que se incluye el riesgo por descuento que tenemos en cada entidad, y el mes de vencimiento de ese riesgo. En la tabla superior, como hasta ahora, tenemos la previsión de cobros, que incluye un cambio respecto a la versión anterior de esta misma aplicación. En esa tabla de cobros, evidentemente no aparecerán todos aquellos efectos que hayan sido negociados y por tanto descontados, pues ya habrán sido cobrados (lo cual no quiere decir que el deudor haya pagado).<br /><br />En la aplicación anterior que no controlaba el riesgo por descuento de efectos, y cuyo enlace incluí al principio de este artículo, solo existía una tabla en la hoja de "Previsión de cobros", pero en esta nueva versión hay dos, una tabla para los cobros pendientes, y otra para los efectos descontados (y por tanto cobrados).<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQGZH6KPmuFcayJdHbwTUcNtSqciyBH2jcGPdeSVAn1LXjNwPvb87q0riTpY7ieH28FXK2POLpOjXvEJzWFAB2nWGg6ay6PZCazkAu-87_BuKdku5XZLjATfj-xBzIibh6zq1Gu9mxCbTk/s1600/prevision-de-cobros.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 249px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQGZH6KPmuFcayJdHbwTUcNtSqciyBH2jcGPdeSVAn1LXjNwPvb87q0riTpY7ieH28FXK2POLpOjXvEJzWFAB2nWGg6ay6PZCazkAu-87_BuKdku5XZLjATfj-xBzIibh6zq1Gu9mxCbTk/s400/prevision-de-cobros.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5622848307836652818" /></a><br />Desde aquí podéis <a href="http://www.mediafire.com/?yb92ftapk4z3uy7" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo (resubido, con mejoras en el código, el 09/07/2011). Espero vuestros comentarios, para saber si os ha sido útil o no :-)El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com13tag:blogger.com,1999:blog-7983188466168395484.post-4255920859783291062011-05-11T00:01:00.011+02:002012-06-30T21:27:02.622+02:00Buscar valores en un rango de datosHace poco, recibíamos una consulta de un usuario en <a href="http://www.facebook.com/excelavanzado" title="hojas-de-calculo-en-excel.blogspot.com en facebook" target="_blank" rel="nofollow">nuestra página de facebook</a>, en la que nos preguntaba como localizar determinados valores en un rango de datos. Concretamente, lo necesitaba para determinar la tarifa aplicable por un servicio de transporte o mensajería, en función del peso del envío.<br /><br />Vamos a ver como resolver tan interesante cuestión. Para ello, como siempre, ilustraremos la explicación con un sencillo ejemplo. Supongamos que tenemos la siguiente tarifa de transportes, para las localidades que se indican en la tabla adjunta:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLo2ToGjCa-YsK71cHQNgn-9FT8TXH7zZ4bvIpN8YUgYv6-vx7mBzHOwji1ldjEB_ZuYQuVOSFDcVhSG8TvByxaplFPkuw9QHulVPOaT4YVO-f8O0gFLHlhafD6TQi81cvJXHXmGI4DJ7Q/s1600/tarifa-de-transportes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 228px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLo2ToGjCa-YsK71cHQNgn-9FT8TXH7zZ4bvIpN8YUgYv6-vx7mBzHOwji1ldjEB_ZuYQuVOSFDcVhSG8TvByxaplFPkuw9QHulVPOaT4YVO-f8O0gFLHlhafD6TQi81cvJXHXmGI4DJ7Q/s400/tarifa-de-transportes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5605168681467889554" /></a><br />Supongamos ahora, que queremos saber cuanto nos costaría enviar un paquete que pesa 70 kgs. a Sevilla. Visualmente, lo tenemos fácil, pues en la tabla tenemos que localizar la fila correspondiente a los 70 kgs. y la columna correspondiente a Sevilla. Eso nos dará como resultado, que el precio de ese transporte es de 94,00 euros, dólares, pesos, o cualquier otra unidad monetaria con la que trabajemos. Pero claro, queremos obtener ese dato, de forma automática, simplemente informando en algún sitio, del destino de la mercancía, y del peso.<br /><br />Para ello, montaremos esta plantilla de Excel, donde a través de dos listas de validación, podremos seleccionar el destino y el peso del producto, y una vez seleccionados estos datos, debajo nos aparecerá el importe del envío.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsJ_h4weWHgYXos86s67qTgUoDpVp4YNGE5Zn0Bmti4Eoxz-9fNK6mHLdkHjo_QYsAlM1ZhVFrHaraNObkfyl64lWW2TQQTqGGkPisILV9Pm_fgoBjN7U91RG1ZHm8ecK1aa2jR8Y8A3Qq/s1600/plantilla-tarifa-de-transportes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsJ_h4weWHgYXos86s67qTgUoDpVp4YNGE5Zn0Bmti4Eoxz-9fNK6mHLdkHjo_QYsAlM1ZhVFrHaraNObkfyl64lWW2TQQTqGGkPisILV9Pm_fgoBjN7U91RG1ZHm8ecK1aa2jR8Y8A3Qq/s400/plantilla-tarifa-de-transportes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5605169090468522226" /></a><br />Para calcular el precio, todo es muy sencillo, con esta fórmula:<br /><table class="tablaformula"><tr><td>=SUMAPRODUCTO((B6:B15=D21)*(C5:F5=D20)*(C6:F15))<br /></td></tr><br /></table><br />Esta fórmula, lo que viene a hacer es buscar en el rango de celdas comprendido entre B6 y B15, el dato informado en la lista de validación de D21, es decir, el peso del paquete que enviaremos. Seguidamente, nos busca en el rango de C5 a F5, la localidad informada en la lista desplegable de la celda D20. Y por último, con esos dos datos, lo que hace la fórmula es localizar el importe en el que confluyen ambos datos (peso y localidad), dentro del rango comprendido entre C6 y F15. Como veis, no es nada complicado.<br /><br />También obtendremos el mismo resultado, si utilizamos las funciones INDICE y COINCIDIR, en lugar de SUMAPRODUCTO, de la siguiente forma:<br /><table class="tablaformula"><tr><td>=INDICE(C6:F15;COINCIDIR(D21;B6:B15;0);COINCIDIR(D20;C5:F5;0))<br /></td></tr><br /></table><br />En este caso, la fórmula la leeríamos más o menos así:<br /><br />Busca en la matriz de datos que hay entre C6 y F15, la fila cuyo número es el resultado de aplicar la función COINCIDIR(D21;B6:B15;0), y cuya columna es el resultado de aplicar la función COINCIDIR(D20;C5:F5;0).<br /><br />COINCIDIR(D21;B6:B15;0) nos indica que posición ocupa en valor de la celda D21, dentro del rango de datos comprendido entre B6 y B15. Una lectura similar se podría hacer de COINCIDIR(D20;C5:F5;0), pues nos indica la posición que ocupa el dato de D20, dentro del rango de datos comprendido entre C5 y F5.<br /><br />Esto puede parecer algo complicadillo, pero si lo imprimís y lo leéis de nuevo, teniendo la hoja de cálculo de Excel delante (la que podéis descargar al final de este artículo), os será mucho más fácil de “digerir”.<br /><br />Esta segunda opción donde utilizamos las funciones INDICE y COINCIDIR, nos sería especialmente de utilidad, en el caso de tener datos de texto en la matriz, en lugar de importes, pues la función SUMAPRODUCTO nos daría error, al no tener datos numéricos.<br /><br />Para hacerlo más elegante, en el ejemplo que podrás descargarte al final de este artículo, hemos puesto un formato condicional a las celdas, para que nos coloree de azul la celda con la tarifa, tal y como se muestra en el siguiente ejemplo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_h1-llaxg-Sh2M5aFnzhu-Ez8jB0WuQ6CAdWWTTXVhTvXf2eFaNRSnMAbDn_coXPrLMfa9wWovPKuI10w8Mdwn-QvE3MlxpcDt3XhtWlyCLoXKivUU7ursGBAA4wDrKAHubYZ060Djx7Y/s1600/plantilla-tarifa-de-transportes-con-formato-condicional.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_h1-llaxg-Sh2M5aFnzhu-Ez8jB0WuQ6CAdWWTTXVhTvXf2eFaNRSnMAbDn_coXPrLMfa9wWovPKuI10w8Mdwn-QvE3MlxpcDt3XhtWlyCLoXKivUU7ursGBAA4wDrKAHubYZ060Djx7Y/s400/plantilla-tarifa-de-transportes-con-formato-condicional.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5605169858185238466" /></a><br />A este tipo de localización de datos dentro de un rango de datos (o una matriz de datos), lo vamos a llamar <strong>localizar datos en una matriz, con datos de entrada exactos</strong>. Es decir, introduciremos los datos exactos de la localidad y sobretodo el peso del producto a enviar, para localizar el valor en la tabla. De hecho ya habíamos visto alguna que otra utilidad para localizar datos dentro de una tabla, utilizando algunos ejemplos de <a href="http://www.hojasdecalculoexcel.com/2008/06/funciones-de-bases-de-datos.html" title="funciones personalizadas de bases de datos">funciones personalizadas de bases de datos</a> por aquí, y <a href="http://www.hojasdecalculoexcel.com/2008/06/ms-sobre-las-funciones-de-bases-de.html" title="más funciones personalizadas de bases de datos">más funciones personalizadas de bases de datos</a>, por este otro lado.<br /><br />Llegados a este punto, nos encontramos con que la realidad del día a día es bien distinta, pues ese tipo de tarifas no suelen proporcionárnoslo así los transportistas de paquetería. ¿Verdad que cuando enviamos un producto, la tarifa de transportista nos informa de un peso por tramos?. Es decir, el transportista nos cobra en función de si el peso está dentro de un rango (o baremo) de pesos. Por eso, la tabla anterior no nos vale, y el más claro ejemplo es el siguiente: ¿cuánto nos costaría enviar 45,46 kgs. a Sevilla?. Pues siendo estrictos, a la vista de esa tabla anterior, no lo sabemos, pues no aparece ese peso en la tarifa.<br /><br />Para solucionar esto, vamos a imaginar que la tarifa del transportista es esta otra:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPM-WpmKX5ufBWjPJP5UpZrcVGx3oqFTIgC_0k1SYAlPF1spF8ewimL-HCZoq4PLvXRMo6mOvxA1CtQ9Oec4vFLKJoJTtygc7qmaqTWQQCgnHJLmaT_E4tCysUB6w6R5Llpi37ViNWDY9i/s1600/tarifa-de-transportes-real.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 196px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPM-WpmKX5ufBWjPJP5UpZrcVGx3oqFTIgC_0k1SYAlPF1spF8ewimL-HCZoq4PLvXRMo6mOvxA1CtQ9Oec4vFLKJoJTtygc7qmaqTWQQCgnHJLmaT_E4tCysUB6w6R5Llpi37ViNWDY9i/s400/tarifa-de-transportes-real.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5605170159138679586" /></a><br />En este caso, ya vemos que la cosa es mucho más realista, pues el transportista, nos va a ofrecer un precio, para un rango determinado de pesos, a cada localidad. En el ejemplo, podemos ver como la empresa de transportes nos va a cobrar 93 euros, dólares, pesos, o cualquier otra unidad monetaria con la que trabajemos, si llevamos entre 60,01 kgs. y 70 kgs., a Madrid. Es decir, si solicitamos que la empresa de paquetería nos lleve un paquete a Madrid, que pesa 62 kgs., nos cobrará lo mismo que si nos lleva 68 kgs.<br /><br />A este tipo de localización de datos dentro de un rango de datos (o una matriz de datos), lo vamos a llamar <strong>localizar datos en una matriz, con datos de entrada dentro de un rango de datos</strong>.<br /><br />Para localizar la tarifa correspondiente a un envío de determinado peso a una localidad, montaremos una tabla como esta, donde la localidad será una lista de validación, y el peso lo introduciremos manualmente:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBYNDhoL-mM7IYyMiSifTr7rA4JdFBhz0x7H4-iGOQAgtgUwmrtBpJwdSqE_J7e3BW4IGETCJ-RcjfYIHQ1r8FIlfeUS7qb-xIg7OjLlW9mJVABCEGiIX_a_Ekc73_XF7YkiBhDIavUu3/s1600/plantilla-tarifa-de-transportes-real.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 269px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBYNDhoL-mM7IYyMiSifTr7rA4JdFBhz0x7H4-iGOQAgtgUwmrtBpJwdSqE_J7e3BW4IGETCJ-RcjfYIHQ1r8FIlfeUS7qb-xIg7OjLlW9mJVABCEGiIX_a_Ekc73_XF7YkiBhDIavUu3/s400/plantilla-tarifa-de-transportes-real.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5605172606522201730" /></a><br />Para calcular el precio, solo nos quedará aplicar esta fórmula:<br /><table class="tablaformula"><tr><td>=DESREF(C5;COINCIDIR(D21;B6:B15);COINCIDIR(D20;D5:G5))<br /></td></tr><br /></table><br />¿Cómo se lee esta formulita?. Pues de una forma no muy complicada. Las funciones COINCIDIR ya las hemos explicado unos párrafos más arriba, y nos indican tanto la fila donde está el peso seleccionado, y la columna donde está la localidad elegida. La función DESREF, simplemente nos desplaza tantas filas y columnas como nos indican las funciones COINCIDIR, partiendo desde la celda C5.<br /><br />Como veis, tenemos una forma bastante sencilla para localizar valores en una tabla, tanto, si se trata de valores exactos, como si se trata de valores dentro de un rango.<br /><br />Desde aquí podéis <a href="http://www.mediafire.com/?412e79dtqdf8u3c" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con todo lo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com28tag:blogger.com,1999:blog-7983188466168395484.post-75765445161490278142011-03-21T00:01:00.003+01:002012-06-30T21:28:18.425+02:00Mostrar imágenes en un formularioEn un artículo anterior, habíamos visto como <a href="http://www.hojasdecalculoexcel.com/2008/09/mostrar-imgenes-asociadas-un.html" title="mostrar imágenes asociadas a un desplegable">mostrar imágenes asociadas a un desplegable</a>, directamente en nuestra hoja de cálculo Excel. En esta ocasión, os muestro una forma de hacer lo mismo, pero incluyendo las imágenes en un formulario, es decir, en un userform.<br /><br />La técnica en ambos casos es muy similar, así que esto lo que explique en este artículo, estará chupado, para aquellos lectores del blog que ya se hayan leído el artículo o que comentaba en el párrafo anterior.<br /><br />Como siempre, vamos a ilustrar esta técnica con un sencillo ejemplo. Para ellos, hemos escogido una serie de construcciones, en este caso, torres, de diferentes ciudades, y de diferentes países. Solo hemos puesto unas pocas, para que vosotros añadáis las que creáis convenientes.<br /><br />Lo primero que vamos a hacer es montar la lista que se muestra en la siguiente imagen, y de paso también <a href="http://www.hojasdecalculoexcel.com/2009/01/asociar-un-macro-un-boton.html" title="crear un botón y asociarlo a un macro">crearemos un botón, para asociarlo a un macro</a>, en este caso, al macro que lanza el userform.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE6AxUGZ1l5UjgkSHMHi7NrZlAIjFh0Cz1__MJ6WIKUCYgBH8Ty1exxPq34PyrtlYqqURNT3RMNOgY4e3KCi-Vk9bVMI-xFQQxFNJgDk3Z7B1cXXG4GuvsObWULLZLu31M2_2StQCf3qpI/s1600/lista-para-desplegable-en-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 132px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE6AxUGZ1l5UjgkSHMHi7NrZlAIjFh0Cz1__MJ6WIKUCYgBH8Ty1exxPq34PyrtlYqqURNT3RMNOgY4e3KCi-Vk9bVMI-xFQQxFNJgDk3Z7B1cXXG4GuvsObWULLZLu31M2_2StQCf3qpI/s400/lista-para-desplegable-en-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5586238239320132242" /></a><br />Lo siguiente que debemos tener, es una lista con las imágenes, y que necesariamente se llamarán de la misma forma a como aparecen en la columna A de la imagen anterior (evidentemente, sin tener en cuenta la extensión correspondiente, en este caso, jpg):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZu0kj7le-09S5RFEvKOxZD1DxXiMe84LHhCFwKiwJe3qgQBGVoLtwltSFhhzzG8FAn303N4L0PaapEH6BycdFhFGoFbMEh3ckkmuHRDxfQLutshoTSyBLOW1O4OWmIArGlE4FXE0Quyf0/s1600/imagenes-a-mostrar-en-el-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 88px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZu0kj7le-09S5RFEvKOxZD1DxXiMe84LHhCFwKiwJe3qgQBGVoLtwltSFhhzzG8FAn303N4L0PaapEH6BycdFhFGoFbMEh3ckkmuHRDxfQLutshoTSyBLOW1O4OWmIArGlE4FXE0Quyf0/s400/imagenes-a-mostrar-en-el-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5586238650512011746" /></a><br />Ahora procederemos a <a href="http://www.hojasdecalculoexcel.com/2008/03/mi-primer-userform.html" title="crear un formulario en Excel">crear un formulario en Excel</a>, donde incluiremos dos etiquetas (dos label), una para el título del formulario en sí, es decir, un rótulo con el texto "Torres famosas", y otra para mostrar la ciudad y el país donde se encuentra la torre elegida. También incluiremos un ComboBox, donde al desplegarlo, podremos elegir la imagen. Por supuesto, incluiremos también un control de imagen, para que se muestre la imagen elegida en el ComboBox, y finalmente, lo último que incluiremos será un CommandButton para que al pulsar sobre él, se cierre del formulario. Es decir, haremos algo como lo que se muestra en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibem3FmQmvWwFgt-wtjhK90s-fGlmpfJCL0qiWCLuGfVVzHGt8UMIya_6FR6JyDt7GPR1alm42C_OSrc4M-poakVyxUcsfHgVzeSU0iuAclLmfWjR5vEgL5n7TMUW222hqSbBIaNA3S0R-/s1600/fomulario-para-mostrar-imagenes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 303px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibem3FmQmvWwFgt-wtjhK90s-fGlmpfJCL0qiWCLuGfVVzHGt8UMIya_6FR6JyDt7GPR1alm42C_OSrc4M-poakVyxUcsfHgVzeSU0iuAclLmfWjR5vEgL5n7TMUW222hqSbBIaNA3S0R-/s400/fomulario-para-mostrar-imagenes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5586239047095944050" /></a><br />Ahora solo nos quedará incluir el código que irá asociado a los controles. Comenzaremos con el código del ComboBox, al hacer click sobre él:<br /><table class="tablavba"><tr><td>Private Sub ComboBox1_Enter()<br /><span style="color:#009900;">'En caso de error, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'limpiamos los datos del Combobox</span><br />ComboBox1.Clear<br /><span style="color:#009900;">'Al inciar el formulario,<br />'seleccionamos la hoja con los datos</span><br />Hoja1.Select<br /><span style="color:#009900;">'Seleccionamos la celda B5</span><br />Range("A2").Select<br /><span style="color:#009900;">'Vamos a llenar dinámicamente el combobox<br />'con los nombres de los artículos, hasta<br />'encontrar una fila vacía</span><br />Do While Not IsEmpty(ActiveCell)<br /><span style="color:#009900;">'ponemos el nombre del producto</span><br />ComboBox1.AddItem ActiveCell.Value<br /><span style="color:#009900;">'bajamos una fila</span><br />ActiveCell.Offset(1, 0).Select<br />Loop<br />End Sub<br /></td></tr><br /></table><br />Ahora le toca el turno al código que nos servirá para mostrar las imágenes, cada vez que cambiemos el item del desplegable, en nuestro caso, del ComboBox:<br /><table class="tablavba"><tr><td>Private Sub ComboBox1_Change()<br /><span style="color:#009900;">'definimos la ruta donde tenemos el fichero de excel<br />'(que será la misma donde tengamos las imágenes)</span><br />ruta = ActiveWorkbook.Path<br /><span style="color:#009900;">'definimos los nombres de las imágenes</span><br />imagen = ComboBox1.List(ComboBox1.ListIndex) & ".jpg"<br /><span style="color:#009900;">'ahora definimos la ruta y la imagen</span><br />ruta_e_imagen = ruta & "\" & imagen<br /><span style="color:#009900;">'cargamos esa imagen en el cuadro de la imagen</span><br />Image1.Picture = LoadPicture(ruta_e_imagen)<br /><span style="color:#009900;">'ahora ponemos el nombre de la ciudad y el país en el label2</span><br />Cells.Find(What:=Replace(imagen, ".jpg", "")).Select<br />Label2 = ActiveCell.Offset(0, 1) & " (" & ActiveCell.Offset(0, 2) & ")"<br />End Sub<br /></td></tr><br /></table><br />Con los dos macros anteriores, lo que hemos hecho, ha sido por un lado llenar el ComboBox al hacer clic en el desplegable (con los datos de la hoja de cálculo), y por otro lado, cada vez que cambiamos el elemento seleccionado en el ComboBox, mostrar la imagen correspondiente a ese elemento seleccionado.<br /><br />Ahora solo nos quedará incluir el código que tendremos asociado al botón "Cerrar":<br /><table class="tablavba"><tr><td>Private Sub CommandButton1_Click()<br /><span style="color:#009900;">'descargamos el formulario de memoria</span><br />Unload Me<br />End Sub<br /></td></tr><br /></table><br />Todo el código que hemos visto hasta ahora, va incluido dentro del propio UserForm, pues es el código asociado al mismo. En cambio, este último código, que os incluyo, es para lanzar el formulario en sí, por lo que lo pondremos dentro de un módulo:<br /><table class="tablavba"><tr><td>Sub Lanzar_formulario()<br /><span style="color:#009900;">'lanzamos el formulario</span><br />UserForm1.Show<br />End Sub<br /></td></tr><br /></table><br />Con esto tenemos todo listo, para mostrar un formulario tan llamativo como este:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiS5XcC19RkM9XmHOosghghx9SvO5o-VjkX6p3f-a6pL9_Isas0ptJSYIpOYrXs4eo-YkZVM6FZWiw2C9vKxoWgJcq5e9TYJgLMrcm9iQkdr1SDUC1hmBPSAn5x4IJmePZBX6bD1YQUADm/s1600/imagenes-en-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 370px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiS5XcC19RkM9XmHOosghghx9SvO5o-VjkX6p3f-a6pL9_Isas0ptJSYIpOYrXs4eo-YkZVM6FZWiw2C9vKxoWgJcq5e9TYJgLMrcm9iQkdr1SDUC1hmBPSAn5x4IJmePZBX6bD1YQUADm/s400/imagenes-en-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5586272119214385186" /></a><br />Desde aquí podéis <a href="http://www.mediafire.com/?p3322u2my3uwpwc" rel="nofollow" target="_blank">descargar un fichero comprimido</a>, que incluye el fichero Excel y las fotos de las torres, que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com24tag:blogger.com,1999:blog-7983188466168395484.post-67543848602787371982011-01-26T00:01:00.014+01:002012-06-30T21:30:29.267+02:00Medias ponderadasHoy os presento un artículo, que aunque no es estrictamente algo que podamos considerar como puramente de Excel, creo que le va a servir a muchos usuarios que utilizan esta popular hoja de cálculo. Se trata de obtener lo que se denomina <strong>media ponderada</strong>.<br /><br />La Real Academia Española (RAE), define la media ponderada como el "<i>resultado de multiplicar cada uno de los números de un conjunto por un valor particular llamado su peso, sumar las cantidades así obtenidas, y dividir esa suma por la suma de todos los pesos</i>".<br /><br />¿Está claro, verdad?. Jajajaja. Probablemente leído así a bote pronto, esa definición lo que hace es confundir más que aclarar, pero si lo vemos con un ejemplo, nos daremos cuenta que es algo bastante sencillo de entender.<br /><br />Vamos a suponer que hoy día 26-01-2011, efectuamos dos inversiones, una que nos rinde el 7% de interés nominal anual, y cuyo vencimiento es el 31-12-2011, y otra que rinde el 1% de interés nominal anual, y cuyo vencimiento es dentro de 5 días, es decir, el 31-01-2011. En ambos casos, supondremos que los intereses nos los retribuyen al vencimiento de cada inversión.<br /><br />Si pasáramos esta información a nuestra hoja de cálculo de <a href="http://www.hojasdecalculoexcel.com" title="Excel">Excel</a>, nos quedaría algo así:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLLuyd1QPncDfQlV_AcrnHaGNFpaxdRqcacERF4Tc8z-8ggEzNDyf08eLJ7wdwfnZvsp_j95qx0RkvuxXbuUXEaX9fpoMC8HbHk-NmeC4YvbxC3sq1tMav9ADf6-yv_9tOGB56trHjwlCV/s1600/datos-para-calcular-media-ponderada-1.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 384px; height: 117px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLLuyd1QPncDfQlV_AcrnHaGNFpaxdRqcacERF4Tc8z-8ggEzNDyf08eLJ7wdwfnZvsp_j95qx0RkvuxXbuUXEaX9fpoMC8HbHk-NmeC4YvbxC3sq1tMav9ADf6-yv_9tOGB56trHjwlCV/s400/datos-para-calcular-media-ponderada-1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565497521228904370" /></a><br />Si alguien nos preguntara, a qué tipo de interés medio nos retribuyen la inversión, podríamos contestarle dos cosas:<br /><br />a) Al 4,00% de interés medio, pues esa cifra resulta de hacer la meda de tipos de interés: (7%+1%)/2<br />b) Nos faltan datos para poder dar una respuesta.<br /><br />Si hemos elegido al respuesta a), sin duda estaremos cometiendo un grave error, porque entre otras cosas, las dos inversiones no tienen el mismo vencimiento. Piensa por un momento que la inversión 1 vence dentro de 339 días, es decir, todavía queda mucho, mientras que la inversión 2 está prácticamente finalizada, por lo que debemos valorar esta circunstancia, para calcular el tipo medio de interés de nuestras inversiones, pues en caso de no hacerlo, estaremos ponderando más de la cuenta el tipo de interés de la inversión 2 (la que está a punto de finalizar). Llegados a este punto, podríamos reformular nuestro esquema en Excel, de la siguiente forma:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQVd39LEB7QE0vQdONAvBxFwZEda-FfDlN_UDIUNnaauVwbV2wy7_2fxUUCGWTpMBFxSTOmraEZ6Syib6eo2SmLGESQjMOYjFAs5rxZXofGwRn6o-E3ydwGJkfwTeyYqitafX-_VUjWF9/s1600/datos-para-calcular-media-ponderada-2.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 101px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQVd39LEB7QE0vQdONAvBxFwZEda-FfDlN_UDIUNnaauVwbV2wy7_2fxUUCGWTpMBFxSTOmraEZ6Syib6eo2SmLGESQjMOYjFAs5rxZXofGwRn6o-E3ydwGJkfwTeyYqitafX-_VUjWF9/s400/datos-para-calcular-media-ponderada-2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565497838578480226" /></a><br />Si nos volvieran a preguntar cual es el tipo de interés medio al que retribuyen nuestras inversiones, la respuesta que podríamos dar, sería una de estas:<br /><br />a) Al 6,91% de interés medio, pues esa cifra resulta de multiplicar el 7% por los días que quedan hasta el vencimiento de esta primera inversión, es decir 339 días, multiplicando nuevamente el 1% por los días que quedan hasta el vencimiento de esta segunda inversión, es decir, 5 días, y dividiendo todo ello entre la suma de 339 y 5. Es decir, ese tipo medio del 6,91% lo obtendríamos de la siguiente fórmula:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoRCGCWQDFCa5Yy7_XWBJNFIAt6uZQUUC88e-BXNGVKtuYXyLNndMEamNRqgpEik4htfCl41KqxwxGnvkfGkiIS1yfKqqPOVYqkSUg7w5f5S4qMFGY3M-x1dNO__Y6eWvtaudiHDh_dneb/s1600/formula-para-calcular-media-ponderada-1.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoRCGCWQDFCa5Yy7_XWBJNFIAt6uZQUUC88e-BXNGVKtuYXyLNndMEamNRqgpEik4htfCl41KqxwxGnvkfGkiIS1yfKqqPOVYqkSUg7w5f5S4qMFGY3M-x1dNO__Y6eWvtaudiHDh_dneb/s400/formula-para-calcular-media-ponderada-1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565498148078469442" /></a><br />b) Nos faltan datos para poder dar una respuesta.<br /><br />Como en el caso anterior, si hubiésemos dado como respuesta la a), estaríamos cometiendo un error, pues nos falta el último dato, el importe de cada una de las inversiones (la inversión 1, y la inversión 2), y que es condición necesaria para poder determinar el tipo de interés medio al cual nos retribuyen esas inversiones. En ningún momento hemos dicho que ambas inversiones sean del mismo importe, por eso presuponer ese dato sería un error.<br /><br />Vamos a suponer que la inversión 1 es de 10.000 euros, y que la inversión 2 es de 5.000 euros. Reformulemos por tanto nuestro esquema en Excel, para tenerlo todo más claro, de un vistazo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG73M2z2iNFeUPa7kp3iRt8OeQwrf947eepDSaVrbZcrmFkjKoD4eWf6lACI2dHIKKpYww7xnzFgUYx82RWmf-9UR4abcI2TNrsKX1gtG-lAOrrl9lrGQm1-6U8-nmawUaLk7axHPiYu2y/s1600/datos-para-calcular-media-ponderada.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 89px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG73M2z2iNFeUPa7kp3iRt8OeQwrf947eepDSaVrbZcrmFkjKoD4eWf6lACI2dHIKKpYww7xnzFgUYx82RWmf-9UR4abcI2TNrsKX1gtG-lAOrrl9lrGQm1-6U8-nmawUaLk7axHPiYu2y/s400/datos-para-calcular-media-ponderada.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565498270197951458" /></a><br />Si ahora nos hicieran la preguntita de marras, nuestra respuesta sería que el tipo de interés medio resultante de estas inversiones, es del 6,96%, pues lo obtenemos de resolver la siguiente fórmula:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSpjb-qwc217HiTf4AnbFbN8UvNAewEruxlaX8s7cDhYnY1evuH747Fl5oXbMRkBWZ4xEy3_m0SJ_84OeJTyaBZ-f0f0-NsMWsP9montFSYXlb7Y2-a2xgHopL-NSLsYafpKpKGJzEDYWE/s1600/formula-para-calcular-media-ponderada-2.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSpjb-qwc217HiTf4AnbFbN8UvNAewEruxlaX8s7cDhYnY1evuH747Fl5oXbMRkBWZ4xEy3_m0SJ_84OeJTyaBZ-f0f0-NsMWsP9montFSYXlb7Y2-a2xgHopL-NSLsYafpKpKGJzEDYWE/s400/formula-para-calcular-media-ponderada-2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565498525492177586" /></a><br />En realidad, lo que estamos haciendo, es ponderar (sopesar, o medir de forma proporcional) cada tipo de interés, con respecto al importe de cada una de las inversiones, y con respecto a la fecha de cada uno de los vencimientos. En términos matemáticos, lo que hemos hecho no es más que ponderar la media, o como reza el título de este artículo, calcular la media ponderada.<br /><br />Si volvemos a mirar esta última fórmula donde obtenemos ese 6,96% de interés medio (ponderado), y releemos nuevamente la definición que da la RAE sobre la media ponderada, estoy seguro que ahora tendremos las cosas mucho más claras, y habremos entendido esta definición.<br /><br />Como colofón de este artículo, vamos a suponer ahora que tenemos 20 inversiones, en lugar de 2, como era el caso que contemplábamos en el ejemplo. En ese caso, en lugar de hacer una fórmula donde el numerador y el denominador van a ser larguísimos, podemos solucionarlo muy fácilmente con el uso de la función <strong>SUMAPRODUCTO</strong>. Vamos a verlo con un ejemplo, donde podemos contemplar en la imagen, la fórmula que aparece en la barra de fórmulas:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmswr1CflMOPd5z8tkjJIphyphenhyphenwsDkMPPfOad3n_I5AO_-G7ImOgUbDVLCoMvMYV85ux-Ty07dq_t1VB5kNvrSDBhpTjaiDnD_CEc4AGuOYW_UZBRSMvngt0f-DOHwffrRL7PVGyHfUB9Bl2/s1600/calcular-media-ponderada.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmswr1CflMOPd5z8tkjJIphyphenhyphenwsDkMPPfOad3n_I5AO_-G7ImOgUbDVLCoMvMYV85ux-Ty07dq_t1VB5kNvrSDBhpTjaiDnD_CEc4AGuOYW_UZBRSMvngt0f-DOHwffrRL7PVGyHfUB9Bl2/s400/calcular-media-ponderada.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565498689384519378" /></a><br />Podemos construir dos columnas auxiliares, pare ver que efectivamente, la función SUMAPRODUCTO nos arroja el mismo resultado, que una fórmula tradicional:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxLr5CtiLV8lxS_RZtR5_2Tqk9OTTV-uhPJwBu2HJ20D9_Ge6nwqIXaZ-5SAeQt584PnrlW9eKEhoBTMwRf7Elsh3JNnsFZSaDZp8x-kr1n7RMH_ccZVbUU8yfJEIHzpwL0BMt67Abxr2j/s1600/calcular-media-ponderada-con-sumaproducto.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxLr5CtiLV8lxS_RZtR5_2Tqk9OTTV-uhPJwBu2HJ20D9_Ge6nwqIXaZ-5SAeQt584PnrlW9eKEhoBTMwRf7Elsh3JNnsFZSaDZp8x-kr1n7RMH_ccZVbUU8yfJEIHzpwL0BMt67Abxr2j/s400/calcular-media-ponderada-con-sumaproducto.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5565498935008356258" /></a><br />En realidad, la fórmula SUMAPRODUCTO, lo que va a hacer es multiplicar cada elemento de las matrices que le indiquemos, sumando cada una de las líneas, de tal forma que si por ejemplo ponemos esto:<br /><table class="tablaformula"><tr><td>=SUMAPRODUCTO(C5:C24;E5:E24;F5:F24)<br /></td></tr><br /></table><br />...le estaremos diciendo que haga esto:<br /><table class="tablaformula"><tr><td>=(C5*E5*F5)+(C6*E6*F6)+(C7*E7*F7)+(C8*E8*F8)+(C9*E9*F9)+(C10*E10*F10)+(C11*E11*F11)+(C12*E12*F12)+(C13*E13*F13)+(C14*E14*F14)+(C15*E15*F15)+(C16*E16*F16)+(C17*E17*F17)+(C18*E18*F18)+(C19*E19*F19)+(C20*E20*F20)+(C21*E21*F21)+(C22*E22*F22)+(C23*E23*F23)+(C24*E24*F24)<br /></td></tr><br /></table><br />Es decir, tanto la función SUMAPRODUCTO que hemos puesto, y esta otra fórmula tradicional tan larga que acabamos de poner, hacen exactamente lo mismo.<br /><br />Espero que os haya sido útil este artículo, y que lo podáis aplicar alguna vez en vuestro trabajo. Como siempre, desde aquí podéis <a href="http://www.mediafire.com/?jud43kn8ym6ttoe" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo final que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com10tag:blogger.com,1999:blog-7983188466168395484.post-60328936326830438272010-11-03T00:01:00.003+01:002012-06-30T21:31:25.069+02:00Incluir un calendario en un formularioHoy veremos como incluir un calendario en un formulario. No se trata de un calendario, como aquel <a href="http://www.hojasdecalculoexcel.com/2009/11/calendarios-para-imprimir.html" title="Calendario para imprimir" target="_blank">calendario para imprimir</a> que vimos en un artículo anterior, sino de un control de calendario. Igual que en los formularios tenemos controles como pueden ser las etiquetas, los cuadros de texto, los cuadros combinados, o las casillas de verificación, por ejemplo, también podemos añadir un calendario.<br /><br />Para ver como funciona, deberemos incluir un formulario desde VBA, seleccionando en el menú “Insertar”, la opción “Userform”. Por defecto, desde VBA, solo se nos muestran en el cuadro de herramientas, aquellos controles que son de uso más común. Para poder ver el resto de controles que podemos incluir en un formulario, deberemos cliquear con el botón derecho del ratón dentro de la ventana “Cuadro de herramientas”, donde nos aparecen los controles, pero en el espacio donde no hay controles. De esa forma, nos aparecerá un menú desplegable donde podremos seleccionar controles adicionales.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAtPui_ViczZzhQCTgnuwtECzASoDSbUPii0aLdBBJZYI0Plg76rvKPbTL6KQcjrKky1PgZTKlV-cA8xPsaJD_s97hny_pDuKo62BCaRo7XJUl-bF6pHCWDglmf0Euu4Vb7eB3_gL2ORWH/s1600/Incluir-controles-adicionales-en-un-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 249px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAtPui_ViczZzhQCTgnuwtECzASoDSbUPii0aLdBBJZYI0Plg76rvKPbTL6KQcjrKky1PgZTKlV-cA8xPsaJD_s97hny_pDuKo62BCaRo7XJUl-bF6pHCWDglmf0Euu4Vb7eB3_gL2ORWH/s400/Incluir-controles-adicionales-en-un-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5534908867292811650" /></a><br />Seleccionaremos la opción “Controles adicionales”, y en la lista, escogeremos el correspondiente al control de calendario, marcándolo con una muesca. Seguidamente, pulsaremos sobre el botón “Aceptar”, y en el cuadro de herramientas nos aparecerá ahora un nuevo elemento, que será el correspondiente al calendario:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOMN1VLSevk5YFbiSbRLuUg3rLpSzuOzK_lE5BEr3MAtdACK-we21Z87I26bsk_nuqak48MIowh3EhxwcB7fRBbbKhJt-eVa7y8aAZ4hdSg1a4uu21y_ErU0XSl-84WrX81j5EJVRdHZ-g/s1600/Cuadro-de-controles-con-calendario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 186px; height: 170px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOMN1VLSevk5YFbiSbRLuUg3rLpSzuOzK_lE5BEr3MAtdACK-we21Z87I26bsk_nuqak48MIowh3EhxwcB7fRBbbKhJt-eVa7y8aAZ4hdSg1a4uu21y_ErU0XSl-84WrX81j5EJVRdHZ-g/s400/Cuadro-de-controles-con-calendario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5534909089317790882" /></a><br />Ahora solo nos quedará pulsar sobre ese botón del calendario, y dibujar el mismo sobre el formulario. Hacer esto, es tan sencillo como pulsar el ratón sobre el formulario, mantener pulsado el botón, y arrastrar hacia abajo y hacia la derecha, para ir viendo como nos aparece un cuadro que es donde al soltar el botón del ratón, nos aparecerá dibujado el calendario. Por defecto, nos aparecerá el mes de la fecha en curso.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyi9-bJoXe1mpmyaQPkBSpIOVgmdarOYLKLOw9bvpNfkx7MnqtodP6uXuWGrhtODleUYFVv9E1-AkYgTQL02nQ4sIQnsR0bEVa8dlxFADIvGhUxe9J8BMbj_cvvvIrXmENy0Ni6sUZMbAS/s1600/Control-calendario-insertado-en-un-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 246px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyi9-bJoXe1mpmyaQPkBSpIOVgmdarOYLKLOw9bvpNfkx7MnqtodP6uXuWGrhtODleUYFVv9E1-AkYgTQL02nQ4sIQnsR0bEVa8dlxFADIvGhUxe9J8BMbj_cvvvIrXmENy0Ni6sUZMbAS/s400/Control-calendario-insertado-en-un-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5534909362474151794" /></a><br />Ahora ya solo nos quedará darle alguna utilidad al calendario, más allá de la propia para tener visible el mes. Por ejemplo podremos insertar la fecha que seleccionemos en el calendario, en una celda. Para ello utilizaremos el evento click, que ejecutará las acciones contenidas dentro de ese evento, cada vez que cliqueemos dentro del calendario.<br /><br />Por ejemplo, si queremos insertar la fecha que seleccionemos en el calendario, en una celda, utilizaremos esto dentro del código del propio formulario (en este ejemplo, insertamos la fecha en la celda A1):<br /><table class="tablavba"><tr><td>Private Sub Calendar1_Click()<br /><span style="color:#009900;">'Ponemos la fecha en la celda A1</span><br />Range("A1") = Calendar1.Value<br />End Sub<br /></td></tr><br /></table><br />Ahora, incluiremos este otro código dentro del formulario, que lo que hará es cargarse el calendario con el mes y el día de la fecha en que lo abramos (la fecha del sistema). Esto se producirá cada vez que activemos (o carguemos) el formulario:<br /><table class="tablavba"><tr><td>Private Sub UserForm_Activate()<br /><span style="color:#009900;">'Al activar el formulario, que aparezca<br />'la fecha de hoy en el calendario</span><br />Calendar1.Today<br />End Sub<br /></td></tr><br /></table><br />De esta forma tan sencilla, tendremos un calendario bien elegante, insertado dentro de nuestros formularios, para que con un solo clic, incluyamos fechas en nuestra hoja de cálculo. Y no solo eso, sino que además pasará como algo que hemos hecho nosotros, cuando en realidad es un control ya diseñado que incorpora Excel.<br /><br />Desde aquí podéis <a href="http://www.mediafire.com/?kb1m966p0c9l6k9" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com29tag:blogger.com,1999:blog-7983188466168395484.post-60772987103570667232010-09-28T09:07:00.011+02:002012-06-30T21:32:22.637+02:00Calcular vencimientosEn el artículo anterior, donde os dejé una aplicación para <a href="http://www.hojasdecalculoexcel.com/2010/09/controlar-vencimientos-de-facturas-y.html" title="controlar vencimientos de facturas y de recibos">controlar vencimientos de facturas y de recibos</a>, más de uno os habréis dado cuenta de que en una hoja, había una columna donde informábamos del vencimiento de las facturas. Esta columna utilizaba como referencias los <a href="http://www.hojasdecalculoexcel.com/2009/02/ponerle-un-nombre-las-celdas.html" title="Nombres de celdas">nombres de celdas</a>, con lo que intentar descifrar esa fórmula podía ser un trabajo de investigación (nada difícil, pero sí, más complicado de lo normal).<br /><br />Para solucionar el asunto, vamos a ver ahora en este artículo, esa misma fórmula, pero sin utilizar los nombres de celdas.<br /><br />Supongamos que tenemos los siguientes datos, en las siguientes celdas:<br /><br />E5: Aquí tenemos el plazo de crédito a los clientes. Puede ser 30, 45, 60, 90 o los días que hayamos acordado.<br /><br />E6: Aquí tenemos la fecha de pago fija del cliente. Hay clientes que para centralizar sus pagos en una fecha determinada, suelen pagar sus facturas un único día al mes. Puede ser el día 5, el día 10, el día 15, o cualquier otro día de pago fijo que tenga el cliente. Si nuestros clientes no tienen un día de pago fijo, dejaremos esta celda vacía (sin dato).<br /><br />B8: Fecha de emisión de la factura.<br /><br />Si queremos calcular el vencimiento de la factura, deberemos poner esta fórmula en la celda donde queramos informar este dato:<br /><table class="tablaformula"><tr><td>=SI($E$6<>"";SI(DIA(B8+$E$5)>$E$6;MIN(FECHA(AÑO(C8);MES(C8)+1;DIA($E$6));FIN.MES(B8+$E$5;1));MIN(FECHA(AÑO(C8);MES(C8);DIA($E$6));FIN.MES(B8+$E$5;0)));B8+$E$5)<br /></td></tr><br /></table><br />Podemos ver una tabla con esa información, en la siguiente imagen (clic para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7TKjNHYojU3YPLvu1foLO1FLMj7YQPyc3wr0ApJqCBAhMxx08w-UMEGCk131vOayn0l4fTdYb3D_5ZfeB08wbSAjfDtLIBH2ydi9GoxZnvldoank96oOuGx-NLA0OKt_Kc23cal7FwTKA/s1600/Vencimiento-de-facturas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 167px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7TKjNHYojU3YPLvu1foLO1FLMj7YQPyc3wr0ApJqCBAhMxx08w-UMEGCk131vOayn0l4fTdYb3D_5ZfeB08wbSAjfDtLIBH2ydi9GoxZnvldoank96oOuGx-NLA0OKt_Kc23cal7FwTKA/s400/Vencimiento-de-facturas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5521859011512971570" /></a><br />Si os fijáis en la tabla de la imagen anterior, la segunda columna muestra el vencimiento teórico, o vencimiento inicial, con independencia de que el cliente tenga o no, un día de pago fijo. En la tercera columna, vemos ya el efecto de desplazar ese vencimiento inicial, a aquel que le correspondería realmente, teniendo en cuenta el día de pago fijo que tiene el cliente. En la cuarta columna se muestran los días de vencimiento real contados desde la fecha de emisión de la factura.<br /><br />Para que nos funcione la fórmula anterior, donde aparece la función FIN.MES, debemos tener habilitadas las "Herramientas para análisis", en Excel 2003 podemos hacerlo desde el menú Herramientas, seleccionando la opción de menú Complementos. En Excel 2007 deberemos pulsar el botón de Microsoft Office (arriba a la izquierda), seleccionaremos el botón de Opciones de Excel (situado en la parte inferior de la ventana que nos aparecerá), luego seleccionaremos Complementos, y a continuación nos situaremos encima de las Herramientas para análisis. Pulsaremos sobre el botón "Ir", y habilitaremos esta opción marcando la muesca correspondiente.<br /><br />Si lo que necesitamos es algo más sencillo, como simplemente sumar unos días de vencimiento a una fecha, podemos hacerlo de esta otra forma, mucho más sencilla, tal y como se muestra en la imagen, donde sumamos 30 días a la fecha de factura:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE3ig-3ANbd6aSqh7qsFLYJ-FrbTxgO1GHO_YoEc4pFCZt9b-JaXze5x2RjlMAVloNBoe9WgsNcZC0_mkq7hU63LcVGC-RTPt-bCb24yFAeelZMmBBb_gsphmoka6yJfZ9EinddNC7q2nl/s1600/Vencimiento-de-facturas-formula-sencilla.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 346px; height: 172px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE3ig-3ANbd6aSqh7qsFLYJ-FrbTxgO1GHO_YoEc4pFCZt9b-JaXze5x2RjlMAVloNBoe9WgsNcZC0_mkq7hU63LcVGC-RTPt-bCb24yFAeelZMmBBb_gsphmoka6yJfZ9EinddNC7q2nl/s400/Vencimiento-de-facturas-formula-sencilla.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5521859445636389474" /></a><br />Si os fijáis, en imagen anterior podemos ver que la celda C5 tenemos como fórmula, el valor de la celda C4, y le hemos sumado 30 días. Para que en esas dos celdas los datos nos aparezcan como en la imagen anterior, simplemente deberemos darle formato personalizado a las celdas, con formato dd-mm-aaaa.<br /><br />Desde aquí podéis <a href="http://www.mediafire.com/?f5ms3dt5yj055lj" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo. En este fichero encontraréis una tabla con todos los días del año, y el vencimiento de las facturas en función del día de emisión de las mismas, teniendo en cuenta el plazo de crédito que concedamos al cliente, y la fecha de pago fija que tiene (si es que la tiene).El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com4tag:blogger.com,1999:blog-7983188466168395484.post-90798173307496313782010-09-01T00:01:00.013+02:002012-09-10T00:40:49.927+02:00Controlar vencimientos de facturas y recibosSi tienes cosas que hacer, mejor deja la lectura de este artículo para cuando dispongas de tiempo, porque una vez redactado todo, acabo de darme cuenta que ocupa la friolera de 16 páginas en DIN-A4. En cualquier caso, si prefieres descargarte la aplicación ahora, y leerte el resto más tarde, puedes hacerlo desde aquí: <a href="http://www.hojasdecalculoexcel.com/2010/09/controlar-vencimientos-de-facturas-y.html#control-de-vencimientos-de-facturas-y-recibos" title="Descargar la aplicación para controlar los vencimientos de facturas y recibos">descargar la aplicación para el control de vencimientos de facturas y recibos</a>. Eso sí, al menos léete los párrafos iniciales para saber de qué va esta aplicación en Excel, y los párrafos finales de este artículo, para saber cual es el procedimiento que debes seguir como usuario de la aplicación, para su correcto funcionamiento, y saber como debes introducir los datos, para no obtener errores inesperados.<br /><br />Son muchas las pequeñas empresas, ya sean talleres, asociaciones, fundaciones, cooperativas, microempresas, e inclusos profesionales o empresarios individuales, que por su volumen de facturación y por su carga de trabajo administrativo, no requieren del uso de complejos programas para llevar el control de sus facturas, y saber cuando tienen que presentar los recibos al cobro, o cuando tienen que llamar al cliente para reclamar el pago de las facturas.<br /><br />Normalmente estas aplicaciones de control de recibos, forman parte de los propios programas de contabilidad, pero como muchas de esas empresas, probablemente tengan externalizada su contabilidad, delegando este trabajo en una gestoría o asesoría fiscal y contable, he pensado que podría ser de utilidad a más de uno, esta sencilla pero útil aplicación.<br /><br />Como siempre, se trata de una aplicación en Excel para el control de vencimientos de facturas y recibos, y es de libre distribución, como todo lo que puedes encontrar en este blog de Excel. Es una aplicación que no está protegida, por lo que podéis copiarla, enviársela a un amigo, o simplemente cambiar lo que os apetezca para adaptarla a vuestras necesidades. Respecto a esto último, solo quiero comentar que la aplicación va a servirle al 99,99% de los usuarios (por no decir al 100%), pues no está diseñada para un sector de actividad en concreto, de tal forma que servirá tanto para una empresa industrial como de servicios, ejerciten la actividad que ejerciten.<br /><br />Voy a explicar un poco por encima, cómo debe utilizarse esta aplicación, para un correcto funcionamiento. No es nada complicado su uso, pues incluso los más vagos pueden saltarse este pequeño tutorial, que no va a tener problemas para hacerse con él, en menos de un minuto :-)<br /><br />La aplicación consta de 5 hojas. Estas hojas no están ocultas, pero lo que sí que hemos hecho es ocultar las etiquetas de las hojas para que el usuario interactúe con los botones, y no a través de clics en las pestañas. Las hojas en cuestión, son las siguientes:<br /><br />- Una hoja para el menú principal.<br /><br />- Otra hoja para dar de alta, modificar, y ver los datos de nuestros clientes.<br /><br />- Otra hoja para dar de alta, modificar, y ver las condiciones de pago (condiciones de cobro de nuestras facturas).<br /><br />- Otra hoja para dar de alta, modificar, y ver las facturas que hemos emitido. Las facturas se tienen que generar con otra aplicación informática (programa de facturación), pues esta aplicación en Excel no es un programa de facturación, sino de control de vencimientos de facturas.<br /><br />- Otra hoja para obtener una previsión de cobros, en función de los datos de las facturas que hemos introducido. Esta previsión de cobros, nos muestra los cobros previstos mes a mes, así como un total general por cliente.<br /><br />Vamos a explicar para qué sirve cada hoja, y que es lo que encontraremos en cada una de ellas:<br /><br /><strong>Menú principal:</strong><br /><br />Pocas cosas podemos decir sobre la funcionalidad de esta hoja, porque es más que evidente. Un pantallazo nos sacará de dudas:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQG4g4IfHE8g0LYN2GMnsUbTlNuqGYoFt17g9IlyZLKJDBgaqGSRVh9tPmiZibFuCCkgApc5UzFdXj452h4pS53sMHuAJ-8czBe1C4X23qSshKDKVowDSO4d2KC7axH_OS0YClh5N1hS0R/s1600/control-de-vencimientos-de-facturas-y-recibos-menu-principal.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 382px; height: 365px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQG4g4IfHE8g0LYN2GMnsUbTlNuqGYoFt17g9IlyZLKJDBgaqGSRVh9tPmiZibFuCCkgApc5UzFdXj452h4pS53sMHuAJ-8czBe1C4X23qSshKDKVowDSO4d2KC7axH_OS0YClh5N1hS0R/s400/control-de-vencimientos-de-facturas-y-recibos-menu-principal.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5786310229605815778" /></a><br /><br />El macro que tenemos en esta hoja (la hoja1), nos sirve para proteger la hoja al activarse la misma, y su código es el siguiente:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><strong>Alta y modificación de clientes:</strong><br /><br />Desde esta hoja, daremos de alta nuestros clientes, con todos los datos fiscales, y de contacto, así como su forma de pago, seleccionándola del desplegable que se genera automáticamente al dar de alta el nombre del cliente. También se generará una validación de datos automática, por lo que si el cliente tiene fecha de pago fija, solo podremos introducir un número entre el 1 y el 31.<br /><br />Este sería un pantallazo con un ejemplo donde salen nuestros clientes (clic sobre la imagen, para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOvfm9hWWsUzcOFQZ_LukM6bOjuJYJ0mSeiByEMa6ZjkBLXOUOH2sQ-FM4OprOZaxbz9enwpqr-t0txBNXAfIFl8i1EFA56G7dKDnpCnv7crkFddqzP7JKCLxBhdeo6gatTi8v8jhyphenhyphenhWe2/s1600/control-de-vencimientos-de-facturas-y-recibos-clientes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 50px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOvfm9hWWsUzcOFQZ_LukM6bOjuJYJ0mSeiByEMa6ZjkBLXOUOH2sQ-FM4OprOZaxbz9enwpqr-t0txBNXAfIFl8i1EFA56G7dKDnpCnv7crkFddqzP7JKCLxBhdeo6gatTi8v8jhyphenhyphenhWe2/s400/control-de-vencimientos-de-facturas-y-recibos-clientes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511454558907756930" /></a><br /><br />En esta hoja tenemos dos macros. Uno que se ejecuta al activarse la hoja (la hoja2), y nos sirve para proteger la hoja:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br />Este otro macro se ejecutará cuando cambiemos un dato de la hoja en cuestión. Si el cambio afecta a la columna A, entonces ocurrirá lo que comentaba anterior mente, es decir, se generará un desplegable de forma automática, y se generará también una validación de datos:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Change(ByVal Target As Range)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'fichamos la celda donde estamos</span><br />celda = ActiveCell.Address<br /><span style="color:#009900;">'si introducimos datos en la columna A,<br />'entonces añadimos la validación de datos en<br />'las dos columnas finales</span><br />If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then<br /> <span style="color:#009900;">'añadimos la lista de validación de las formas de pago</span><br /> Cells(Target.Row, 11).Select<br /> With Selection.Validation<br /> .Delete<br /> .Add Type:=xlValidateList, Formula1:="=FPA"<br /> End With<br /> <span style="color:#009900;">'añadimos la lista de validación del día de pago fijo</span><br /> Cells(ActiveCell.Row, 12).Select<br /> With Selection.Validation<br /> .Delete<br /> .Add Type:=xlValidateWholeNumber, Operator:=xlBetween, _<br /> Formula1:="1", Formula2:="31"<br /> .ErrorMessage = "El día de pago debe estar entre el 1 y el 31."<br /> End With<br />End If<br /><span style="color:#009900;">'volvemos donde estábamos</span><br />Range(celda).Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><strong>Alta y modificación de formas de pago:</strong><br /><br />Esta hoja nos sirve para dar de alta las diferentes formas de pago, que luego serán las que se muestren en el desplegable al dar de alta los clientes. Un ejemplo de ello es el pantallazo que os presento a continuación (clic sobre la imagen, para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLzhVUmgiwszyv4ziTMxtPKKrmdXmDacI_2QRT3pZVUZRGISz4st5O0nBAU9LCozhoZZJjApkPboHnHoxkmsIZD4Q_hVtmAXfS0Zr92H7EHyJWIYgj_OjErZ4gTvYLpDKzrF-b5KmPgfgi/s1600/control-de-vencimientos-de-facturas-y-recibos-formas-de-pago.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 184px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLzhVUmgiwszyv4ziTMxtPKKrmdXmDacI_2QRT3pZVUZRGISz4st5O0nBAU9LCozhoZZJjApkPboHnHoxkmsIZD4Q_hVtmAXfS0Zr92H7EHyJWIYgj_OjErZ4gTvYLpDKzrF-b5KmPgfgi/s400/control-de-vencimientos-de-facturas-y-recibos-formas-de-pago.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511455484072602162" /></a><br /><br />El macro que tenemos en esta hoja con las formas de pago (la hoja3), nos sirve para proteger la hoja al activarse la misma, y su código es el siguiente:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><strong>Facturas emitidas:</strong><br /><br />Aquí es donde iremos introduciendo las facturas de nuestra empresa. Solo tendremos que seleccionar el cliente desde el desplegable que nos aparecerá en la columna A. Este desplegable se genera automáticamente al colocarnos en una celda de esa columna, y toma los datos de la hoja de clientes (evidentemente de los clientes que hayamos introducido). Si generamos una nueva factura, antes deberemos dar de alta al cliente, y su forma de pago si es que no la tenemos ya en nuestra hoja de forma de pago.<br /><br />El aspecto que presenta esta hoja de facturas es similar a la de este ejemplo (clic sobre la imagen, para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtQCKz6KJWQOt7rlAxZ38mJ0-VswQ-2Z9i6bAK0MLpANAtu-aePuYHXFDPHaGoo7lFgOLtIHnSLm6VXsK56c4IE7_disMOTu3Kc8XBduir6anzsWAYm-6qnovd5kDH0L5UpIonefN175ax/s1600/control-de-vencimientos-de-facturas-y-recibos-facturas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtQCKz6KJWQOt7rlAxZ38mJ0-VswQ-2Z9i6bAK0MLpANAtu-aePuYHXFDPHaGoo7lFgOLtIHnSLm6VXsK56c4IE7_disMOTu3Kc8XBduir6anzsWAYm-6qnovd5kDH0L5UpIonefN175ax/s400/control-de-vencimientos-de-facturas-y-recibos-facturas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511456152362833090" /></a><br /><br />En el caso de haber facturas vencidas, la fila nos saldrá de color azul celeste, para tenerlas más a la vista. Solo nos quedará llamar a los clientes que no han pagado todavía, para recordarles que su factura ha vencido, y no hemos recibido el cobro. Una vez las hayamos cobrado, eliminaremos las facturas, situándonos en cualquier celda de la fila, y pulsando el botón "Eliminar fila".<br /><br />Lo primero que tenemos que hacer para dar de alta un cliente, es seleccionarlo del desplegable, tal y como se muestra en este ejemplo (clic sobre la imagen, para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeayHUqIGlbfld-ynGtGgXaymwuF4Q2t6zIyLohSKbLZp2-nnCS7LimT8crQ1OLc6RHeN8xbrHblimztdKnv3pxI4koP-ZhexJKnezL8xglAq2NEtHK8xUF0nbGnGLSs_FvhL4qi34QJCc/s1600/control-de-vencimientos-de-facturas-y-recibos-ejemplo-desplegable-facturas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 93px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeayHUqIGlbfld-ynGtGgXaymwuF4Q2t6zIyLohSKbLZp2-nnCS7LimT8crQ1OLc6RHeN8xbrHblimztdKnv3pxI4koP-ZhexJKnezL8xglAq2NEtHK8xUF0nbGnGLSs_FvhL4qi34QJCc/s400/control-de-vencimientos-de-facturas-y-recibos-ejemplo-desplegable-facturas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511456932435467602" /></a><br /><br />Una vez seleccionado el cliente, automáticamente nos aparecerán a la derecha una serie de datos, algunos de ellos son propuestas que evidentemente podemos modificar, como el número de factura (nos genera el siguiente nº de factura presuponiendo que el de la fila anterior es el último número de factura), y la fecha de la factura (presuponiendo que es la misma que la fecha de la fila anterior). El vencimiento evidentemente no lo debemos introducir, pues lo obtenemos automáticamente a partir de la fecha de emisión de la factura, y de las condiciones de pago (forma de pago).<br /><br />Con todo ello, y siguiendo con nuestro ejemplo, al seleccionar en el desplegable, nos aparecerá algo como lo de este ejemplo (clic sobre la imagen, para ampliarla):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHWO0_R-x5Iz27jEEuvfiLy7mcnUVgqKjltOcRiYI_mciOsSXOkWcSqXI3dVvEkP3VYBmtZu4gE4GSptbxrcwWhV0v7woHOGdwInTt-8Ho7bMJcFVTR-ZcnTDeSjtl_G3T_Cu_f-h04cH7/s1600/control-de-vencimientos-de-facturas-y-recibos-ejemplo-desplegable-facturas-autorrelleno-de-celdas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 53px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHWO0_R-x5Iz27jEEuvfiLy7mcnUVgqKjltOcRiYI_mciOsSXOkWcSqXI3dVvEkP3VYBmtZu4gE4GSptbxrcwWhV0v7woHOGdwInTt-8Ho7bMJcFVTR-ZcnTDeSjtl_G3T_Cu_f-h04cH7/s400/control-de-vencimientos-de-facturas-y-recibos-ejemplo-desplegable-facturas-autorrelleno-de-celdas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511457268879202418" /></a><br /><br />Los macros que nos encontraremos en esta hoja (la hoja4), son los siguientes. Uno de ellos, para proteger la hoja, en el momento de activarse:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br />Otro macro que se ejecuta al seleccionar una celda de la columna A, y que nos sirve para generar el desplegable con los clientes a seleccionar:<br /><table class="tablavba"><tr><td>Private Sub Worksheet_SelectionChange(ByVal Target As Range)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'si seleccionamos una celda de la columna A,<br />'entonces añadimos la validación de datos en<br />'la celda en cuestión</span><br />If Not Application.Intersect(Target, Range("A:A")) _<br />Is Nothing And ActiveCell.Row >= 5 Then<br /> <span style="color:#009900;">'añadimos la lista de validación de los clientes</span><br /> Cells(Target.Row, 1).Select<br /> With Selection.Validation<br /> .Delete<br /> .Add Type:=xlValidateList, Formula1:="=CLI"<br /> End With<br />End If<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br />Y este otro macro que se ejecutará cuando cambiemos un dato de la columna A, y que nos generará todos los datos que comentábamos anteriormente (número de factura, fecha de factura, vencimiento, días hasta el vencimiento, y días de exceso sobre el vencimiento):<br /><table class="tablavba"><tr><td>Private Sub Worksheet_Change(ByVal Target As Range)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'si modificamos una celda de la columna A, añadimos<br />'las fórmulas en las columnas correspondientes</span><br />If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then<br /> <span style="color:#009900;">'si no tenemos cliente o fecha de fra., borramos el vto. si<br /> 'lo hay así como los días de exceso, y los días hasta el vto.</span><br /> If ActiveCell = "" Then<br /> ActiveCell.Offset(0, 1) = ""<br /> ActiveCell.Offset(0, 2) = ""<br /> ActiveCell.Offset(0, 4) = ""<br /> ActiveCell.Offset(0, 5) = ""<br /> ActiveCell.Offset(0, 6) = ""<br /> End If<br /> <span style="color:#009900;">'si seleccionamos un cliente en el desplegable<br /> 'añadimos la fra. previsible, la fecha de fra. previsible,<br /> 'el vto., los días de exceso, y los días hasta el vto.</span><br /> If ActiveCell <> "" Then<br /> <span style="color:#009900;">'añadimos el nº de fra. previsible</span><br /> If ActiveCell.Offset(-1, 1) <> "" And ActiveCell.Offset(0, 1) = "" Then<br /> ActiveCell.Offset(0, 1) = ActiveCell.Offset(-1, 1) + 1<br /> End If<br /> <span style="color:#009900;">'añadimos la fecha de fra. previsible</span><br /> If ActiveCell.Offset(-1, 2) <> "" And ActiveCell.Offset(0, 2) = "" Then<br /> ActiveCell.Offset(0, 2) = ActiveCell.Offset(-1, 2)<br /> End If<br /> <span style="color:#009900;">'añadimos el vencimiento</span><br /> If ActiveCell.Offset(-1, 4) <> "" And ActiveCell.Offset(0, 4) = "" Then<br /> ActiveCell.Offset(0, 4).FormulaR1C1 = "=IF(VLOOKUP(RC[-4]," & _<br /> "TCLI,12,0)<>"""",IF(DAY(RC[-2]+VLOOKUP(VLOOKUP(RC[-4],TCLI,11,0)" & _<br /> ",TFPA,2,0))>VLOOKUP(RC[-4],TCLI,12,0),MIN(DATE(YEAR(RC[-2]" & _<br /> "+VLOOKUP(VLOOKUP(RC[-4],TCLI,11,0),TFPA,2,0)),MONTH(RC[-2]" & _<br /> "+VLOOKUP(VLOOKUP(RC[-4],TCLI,11,0),TFPA,2,0))+1,DAY(VLOOKUP" & _<br /> "(RC[-4],TCLI,12,0))),FIN.MES(RC[-2]+VLOOKUP(VLOOKUP(RC[-4]," & _<br /> "TCLI,11,0),TFPA,2,0),1)),MIN(DATE(YEAR(RC[-2]+" & _<br /> "VLOOKUP(VLOOKUP(RC[-4],TCLI,11,0),TFPA,2,0)),MONTH(RC[-2]" & _<br /> "+VLOOKUP(VLOOKUP(RC[-4],TCLI,11,0),TFPA,2,0)),DAY(VLOOKUP" & _<br /> "(RC[-4],TCLI,12,0))),FIN.MES(RC[-2]+VLOOKUP(VLOOKUP" & _<br /> "(RC[-4],TCLI,11,0),TFPA,2,0),0))),RC[-2]+VLOOKUP(VLOOKUP" & _<br /> "(RC[-4],TCLI,11,0),TFPA,2,0))"<br /> End If<br /> <span style="color:#009900;">'añadimos los días hasta el vencimiento</span><br /> If ActiveCell.Offset(-1, 5) <> "" And ActiveCell.Offset(0, 5) = "" Then<br /> ActiveCell.Offset(0, 5) = "=IF(TODAY()-RC[-1]<0,RC[-1]-TODAY(),0)"<br /> End If<br /> <span style="color:#009900;">'añadimos los días de exceso sobre el vencimiento</span><br /> If ActiveCell.Offset(-1, 6) <> "" And ActiveCell.Offset(0, 6) = "" Then<br /> ActiveCell.Offset(0, 6) = "=IF(TODAY()-RC[-2]>=0,TODAY()-RC[-2],0)"<br /> End If<br /> End If<br />End If<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><strong>Previsión de cobros:</strong><br /><br />Una vez tengamos dadas de alta todas las facturas, simplemente deberemos acceder a la hoja donde se nos genera de forma automática la previsión de cobros. Para ello, pulsaremos el botón "Previsión de cobros".<br /><br />Lo que obtendremos será algo similar a lo que se muestra en el siguiente ejemplo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Jj-WhGprH0T65b3mPbVA3pHvOcRoa_hvaf3gaOLlbWxNcfOg_CrNHj-J28s3bFYIYnG8qYvsdECBuSzBqH2Gg8Y7BbIQYIdQ-wgORCAAVaphgjoqB4l2uIl4HgJZdiqM2n0hbur6mpJA/s1600/control-de-vencimientos-de-facturas-y-recibos-prevision-de-cobros.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Jj-WhGprH0T65b3mPbVA3pHvOcRoa_hvaf3gaOLlbWxNcfOg_CrNHj-J28s3bFYIYnG8qYvsdECBuSzBqH2Gg8Y7BbIQYIdQ-wgORCAAVaphgjoqB4l2uIl4HgJZdiqM2n0hbur6mpJA/s400/control-de-vencimientos-de-facturas-y-recibos-prevision-de-cobros.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511459476184816562" /></a><br /><br />En esta hoja no tenemos ningún macro, pues todo el código que genera la previsión de cobros, lo tenemos en un macro dentro del Módulo1.<br /><br />Vamos a entrar ahora a comentar los macros que tenemos en el Módulo1. Lo primero que hay es el macro Auto_open(), que como sabéis es el macro que se ejecuta al abrir el fichero. El código de nuestro macro Auto_open() es el siguiente (lo he modificado una vez publicado el artículo, para que se carguen automáticamente las herramientas para análisis, y no tener problemas con la función FIN.MES):<br /><br /><table class="tablavba"><tr><td>Sub Auto_open()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'activamos las herramientas para análisis,<br />'para no tener problemas con la función FIN.MES</span><br />AddIns("Herramientas para análisis").Installed = True<br /><span style="color:#009900;">'no mostramos las pestañas (las hojas)</span><br />ActiveWindow.DisplayWorkbookTabs = False<br /><span style="color:#009900;">'buscamos si hay alguna factura vencida, y también<br />'si hay facturas para vencer en los próximos 7 días</span><br />Hoja4.Select<br />Range("G5").Select<br /><span style="color:#009900;">'si no hay facturas, saltamos a la línea correspondiente</span><br />If ActiveCell.Offset(0, -6) = "" Then GoTo sinfacturas<br /><span style="color:#009900;">'para todo el rango de datos de la columna J</span><br />For i = 5 To Selection.End(xlDown).Row<br /> <span style="color:#009900;">'miramos si hay facturas vencidas</span><br /> If ActiveCell > 0 Then vencidas = vencidas + 1<br /> <span style="color:#009900;">'miramos si hay facturas que<br /> 'vencen en los próximos 7 días</span><br /> If ActiveCell.Offset(0, -1) <= 7 And _<br /> ActiveCell.Offset(0, -1) > 0 Then proximas = proximas + 1<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br />Next<br /><span style="color:#009900;">'nos situamos para escribir la siguiente factura</span><br />ActiveCell.Offset(0, -6).Select<br /><span style="color:#009900;">'mostramos un mensaje si hay facturas vencidas</span><br />If vencidas = 1 Then MsgBox ("Hoy es " & FormatDateTime(Date, vbLongDate) & _<br />"," + Chr(10) + "y hay " & vencidas & " factura vencida.") _<br /> , , "Facturas vencidas"<br />If vencidas > 1 Then MsgBox ("Hoy es " & FormatDateTime(Date, vbLongDate) & _<br />"," + Chr(10) + "y hay " & vencidas & " facturas vencidas.") _<br /> , , "Facturas vencidas"<br /><span style="color:#009900;">'mostramos un mensaje si hay facturas próximas a vencer</span><br />If proximas = 1 Then MsgBox ("Hay " & proximas & " factura que vence " _<br />+ "en los próximos 7 días."), , "Facturas para vencer"<br />If proximas > 1 Then MsgBox ("Hay " & proximas & " facturas que vencen " _<br />+ "en los próximos 7 días."), , "Facturas para vencer"<br /><span style="color:#009900;">'nos situamos en el menú principal</span><br />sinfacturas:<br />Hoja1.Select<br />Range("E12").Select<br /><span style="color:#009900;">'Mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br />End Sub<br /></td></tr><br /></table><br />No comentaré mucho sobre lo que hace el macro Auto_open(), porque con leer los comentarios del propio macro, lo tenemos todo chupado. Dentro de ese código, hay dos partes importantes que sí que me gustaría recalcar. Una de ellas, es que se nos mostrará un aviso informándonos de las facturas que tenemos vencidas. Este aviso se nos mostrará con tan solo abrir el fichero, siempre y cuando tengamos facturas vencidas, claro está. En el caso de haber facturas vencidas, se nos mostrará un mensaje similar a este que os muestro a continuación, donde nos avisa que hay 9 facturas vencidas:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKNxEMWZTVEHnBW8rurM3HvQdelOFQQXVOWgDqk2lak7dBqr3vwiNuz3GAh9jG1TAsaIdIF7-kLNIHLW2LJ82M-ASImz1kPDd97jCxI7l4ZTKMDylvhIyTUoCIRkWmmIK9_MiQVELwYwSp/s1600/control-de-vencimientos-de-facturas-y-recibos-aviso-facturas-vencidas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 245px; height: 120px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKNxEMWZTVEHnBW8rurM3HvQdelOFQQXVOWgDqk2lak7dBqr3vwiNuz3GAh9jG1TAsaIdIF7-kLNIHLW2LJ82M-ASImz1kPDd97jCxI7l4ZTKMDylvhIyTUoCIRkWmmIK9_MiQVELwYwSp/s400/control-de-vencimientos-de-facturas-y-recibos-aviso-facturas-vencidas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511460299956659682" /></a><br /><br />En el caso de tener facturas que venzan en los próximos 7 días, la aplicación también nos mostrará un aviso como el que se nos muestra a continuación, donde nos avisa que tenemos 1 factura que nos vence en los próximos 7 días:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLrDE96rP9zD0ZyFhHWVT5oe1sVwbEFxYrrik7lL58MGT-DzFSz9luYBvE40_xhuO1_JHJoAgJWPbFwt9O_PlloGbQ5w4qfc7uq1h9oIAs7mPZlFWjtNOaJTLMFW00GRANKtBYUMXr8a6/s1600/control-de-vencimientos-de-facturas-y-recibos-aviso-facturas-a-vencer.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 107px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLrDE96rP9zD0ZyFhHWVT5oe1sVwbEFxYrrik7lL58MGT-DzFSz9luYBvE40_xhuO1_JHJoAgJWPbFwt9O_PlloGbQ5w4qfc7uq1h9oIAs7mPZlFWjtNOaJTLMFW00GRANKtBYUMXr8a6/s400/control-de-vencimientos-de-facturas-y-recibos-aviso-facturas-a-vencer.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5511460544137658546" /></a><br /><br />Aparte del macro Auto_open(), tenemos estos otros macros cuyo código os incluyo a continuación. Un macro para imprimir:<br /><table class="tablavba"><tr><td>Sub Imprimir()<br /><span style="color:#009900;">'Imprimimos la hoja</span><br />ActiveWindow.SelectedSheets.PrintOut Copies:=1<br />End Sub<br /></td></tr><br /></table><br />Otro macro para guardar el fichero pero sin cerrar la aplicación, es decir, para guardar los datos, y continuar trabajando:<br /><table class="tablavba"><tr><td>Sub Guardar()<br /><span style="color:#009900;">'Guardamos el libro</span><br />ActiveWorkbook.Save<br />End Sub<br /></td></tr><br /></table><br />Otro macro para ir a la hoja de clientes:<br /><table class="tablavba"><tr><td>Sub Clientes()<br /><span style="color:#009900;">'Vamos a la hoja2</span><br />Hoja2.Select<br />Range("A5").Select<br /><span style="color:#009900;">'nos situamos en la primera fila libre</span><br />Selection.End(xlDown).Offset(1, 0).Select<br />End Sub<br /></td></tr><br /></table><br />Otro macro para acceder a la hoja con las formas de pago:<br /><table class="tablavba"><tr><td>Sub Formas_de_pago()<br /><span style="color:#009900;">'Vamos a la hoja3</span><br />Hoja3.Select<br />Range("B5").Select<br /><span style="color:#009900;">'nos situamos en la primera fila libre</span><br />Selection.End(xlDown).Offset(1, 0).Select<br />End Sub<br /></td></tr><br /></table><br />Otro macro para acceder a la hoja de facturas:<br /><table class="tablavba"><tr><td>Sub Facturas()<br /><span style="color:#009900;">'Vamos a la hoja4</span><br />Hoja4.Select<br />Range("A5").Select<br /><span style="color:#009900;">'nos situamos en la primera fila libre</span><br />If ActiveCell.Offset(0, 1) <> "" Then<br /> Selection.End(xlDown).Offset(1, 0).Select<br />End If<br />End Sub<br /></td></tr><br /></table><br />Otro macro para volver al menú principal:<br /><table class="tablavba"><tr><td>Sub Volver_al_menu()<br /><span style="color:#009900;">'volvemos al menú, pero dependiendo<br />'de la hoja donde estemos, ordenaremos<br />'también los datos</span><br />If ActiveSheet.CodeName = "Hoja2" Then Ordenar_clientes<br />If ActiveSheet.CodeName = "Hoja3" Then Ordenar_formas_de_pago<br /><span style="color:#009900;">'volvemos al menú</span><br />Hoja1.Select<br />Range("E12").Select<br />End Sub<br /></td></tr><br /></table><br />Otro macro para ordenar alfabéticamente los clientes:<br /><table class="tablavba"><tr><td>Sub Ordenar_clientes()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'fichamos la celda donde estamos, para volver a ella</span><br />celda_donde_estamos = ActiveCell.Address<br /><span style="color:#009900;">'seleccionamos la primera fila con datos</span><br />Range("A5:K5").Select<br /><span style="color:#009900;">'Ordenamos las celdas hasta el final</span><br />Range(Selection, Selection.End(xlDown)).Select<br />Selection.Sort Key1:=Range("A5")<br /><span style="color:#009900;">'seleccionamos todo el rango continuo<br />'desde A5 hasta abajo del todo</span><br />Range("A5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="CLI", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C1:R" & ActiveCell.Row & "C1"<br /><span style="color:#009900;">'ahora le ponemos un nombre a toda la tabla</span><br />Range("A5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="TCLI", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C1:R" & ActiveCell.Row & "C12"<br /><span style="color:#009900;">'volvemos donde estábamos<br />'protegemos la hoja</span><br />ActiveSheet.Protect<br /><span style="color:#009900;">'volvemos a la celda donde estábamos</span><br />Range(celda_donde_estamos).Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'mostramos un mensaje</span><br />MsgBox ("Se han ordenado alfabéticamente los clientes.") _<br />, , "Clientes ordenados"<br />End Sub<br /></td></tr><br /></table><br />Otro macro para ordenar alfabéticamente las formas de pago:<br /><table class="tablavba"><tr><td>Sub Ordenar_formas_de_pago()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'fichamos la celda donde estamos, para volver a ella</span><br />celda_donde_estamos = ActiveCell.Address<br /><span style="color:#009900;">'seleccionamos la primera fila con datos</span><br />Range("B5:C5").Select<br /><span style="color:#009900;">'Ordenamos las celdas hasta el final</span><br />Range(Selection, Selection.End(xlDown)).Select<br />Selection.Sort Key1:=Range("B5")<br /><span style="color:#009900;">'seleccionamos todo el rango continuo<br />'desde B5 hasta abajo del todo</span><br />Range("B5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="FPA", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C2:R" & ActiveCell.Row & "C2"<br /><span style="color:#009900;">'ahora le ponemos un nombre a toda la tabla</span><br />Range("B5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="TFPA", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C2:R" & ActiveCell.Row & "C3"<br /><span style="color:#009900;">'volvemos donde estábamos<br />'protegemos la hoja</span><br />ActiveSheet.Protect<br /><span style="color:#009900;">'volvemos a la celda donde estábamos</span><br />Range(celda_donde_estamos).Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'mostramos un mensaje</span><br />MsgBox ("Se han ordenado alfabéticamente las formas de pago.") _<br />, , "Formas de pago ordenadas"<br />End Sub<br /></td></tr><br /></table><br />Tomad un poco de aire, que aún quedan unos cuantos macros más. El siguiente que nos encontraremos es para eliminar clientes:<br /><table class="tablavba"><tr><td>Sub Eliminar_cliente()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'fichamos el nombre del cliente a buscar<br />'y la celda donde estamos</span><br />cliente = Cells(ActiveCell.Row, 1)<br />celda = ActiveCell.Address<br /><span style="color:#009900;">'antes de borrar un cliente, buscaremos que no tengamos<br />'facturas emitidas a nombre de ese cliente a eliminar</span><br />Hoja4.Select<br /><span style="color:#009900;">'buscamos el cliente, y si existe en las facturas<br />'creamos una variable</span><br />If Not Cells.Find(cliente) Is Nothing And cliente <> "" Then<br /> <span style="color:#009900;">'si ese cliente tiene facturas,<br /> 'creamos una variable</span><br /> borrar_fila = "no"<br />End If<br /><span style="color:#009900;">'volvemos a la hoja2</span><br />Hoja2.Select<br /><span style="color:#009900;">'y a la celda donde estábamos</span><br />Range(celda).Select<br /><span style="color:#009900;">'si borrar_fila = "no", mostramos un mensaje<br />'de que no podemos borrar la fila</span><br />If borrar_fila = "no" Then<br /> MsgBox ("Antes de borrar este cliente, debes borrar sus facturas." _<br /> + Chr(10) + "Por favor, accede a la hoja de Faturas, para eliminarlas.") _<br /> , , "Imposible borrar este cliente"<br /> <span style="color:#009900;">'finalizamos el macro</span><br /> Exit Sub<br />End If<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'si estamos en la fila 5 o superior,<br />'eliminamos la fila</span><br />If Selection.Row >= 5 Then<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'eliminamos la fila donde estamos</span><br /> Selection.EntireRow.Delete<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("Los datos de este cliente, han sido eliminados.") _<br /> , , "Cliente eliminado"<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br />End If<br />End Sub<br /></td></tr><br /></table><br />Otro macro para eliminar formas de pago:<br /><table class="tablavba"><tr><td>Sub Eliminar_forma_de_pago()<br /><span style="color:#009900;">'Ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'fichamos el nombre de la forma de pago a buscar<br />'y la celda donde estamos</span><br />formadepago = Cells(ActiveCell.Row, 2)<br />celda = ActiveCell.Address<br /><span style="color:#009900;">'antes de borrar una forma de pago, buscaremos<br />'que no tengamos facturas emitidas a clientes<br />'con esa forma de pago a eliminar</span><br />Hoja2.Select<br /><span style="color:#009900;">'buscamos la forma de pago, y si existe en<br />'algún cliente, creamos una variable</span><br />If Not Cells.Find(formadepago) Is Nothing And formadepago <> "" Then<br /> <span style="color:#009900;">'si ese cliente tiene facturas,<br /> 'creamos una variable</span><br /> borrar_fila = "no"<br />End If<br /><span style="color:#009900;">'volvemos a la hoja3</span><br />Hoja3.Select<br /><span style="color:#009900;">'y a la celda donde estábamos</span><br />Range(celda).Select<br /><span style="color:#009900;">'si borrar_fila = "no", mostramos un mensaje<br />'de que no podemos borrar la fila</span><br />If borrar_fila = "no" Then<br /> MsgBox ("Antes de borrar esta forma de pago, debes borrar o cambiar la forma" _<br /> + Chr(10) + "de pago de los clientes que utilizan esta modalidad de pago a borrar." _<br /> + Chr(10) + Chr(10) + "Por favor, accede a la hoja de Clientes, para editarlos.") _<br /> , , "Imposible borrar esta forma de pago"<br /> <span style="color:#009900;">'finalizamos el macro</span><br /> Exit Sub<br />End If<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br /><span style="color:#009900;">'si estamos en la fila 5 o superior,<br />'eliminamos la fila</span><br />If Selection.Row >= 5 Then<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'eliminamos la fila donde estamos</span><br /> Selection.EntireRow.Delete<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("Esta forma de pago, ha sido eliminada.") _<br /> , , "Forma de pago eliminada"<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br />End If<br />End Sub<br /></td></tr><br /></table><br />Otro macro para eliminar facturas:<br /><table class="tablavba"><tr><td>Sub Eliminar_factura()<br /><span style="color:#009900;">'Si estamos en la fila 5 o superior,<br />'eliminamos la fila</span><br />If Selection.Row >= 5 Then<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'eliminamos la fila donde estamos</span><br /> Selection.EntireRow.Delete<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("La factura seleccionada, ha sido eliminada.") _<br /> , , "Factura eliminada"<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br />End If<br />End Sub<br /></td></tr><br /></table><br />Y el último macro que nos encontraremos, y también el más largo, es este, que nos sirve para generar nuestra previsión de cobros, detallando los vencimientos por meses y por clientes:<br /><table class="tablavba"><tr><td>Sub Prevision_de_cobros()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'cambiamos el texto del botón de la hoja1 y hoja4</span><br />If ActiveSheet.CodeName = "Hoja1" Or _<br />ActiveSheet.CodeName = "Hoja4" Then<br /> <span style="color:#009900;">'creamos una variable</span><br /> If ActiveSheet.CodeName = "Hoja1" Then hoja = "menu"<br /> If ActiveSheet.CodeName = "Hoja4" Then hoja = "facturas"<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'seleccionamos el botón</span><br /> ActiveSheet.Shapes("Botón 2").Select<br /> <span style="color:#009900;">'le cambiamos el nombre, y lo ponemos en rojo</span><br /> Selection.Characters.Text = "Procesando..."<br /> With Selection.Font<br /> .ColorIndex = 3<br /> End With<br />End If<br /><span style="color:#009900;">'ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'comprobamos que tengamos facturas</span><br />If Hoja4.Range("A5") = "" Then<br /> <span style="color:#009900;">'si no hay facturas, mostramos un mensaje</span><br /> MsgBox ("Por favor, revisa todo, para poder continuar.") _<br /> + Chr(10) + Chr(10) + "Al parecer no hay facturas, y por tanto no se" _<br /> + Chr(10) + "puede generar la previsión de cobros." _<br /> , , "Hay errores"<br /> <span style="color:#009900;">'seleccionamos el botón2</span><br /> ActiveSheet.Shapes("Botón 2").Select<br /> <span style="color:#009900;">'le cambiamos el nombre</span><br /> Selection.Characters.Text = "Previsión de cobros"<br /> If Hoja = "menu" Then<br /> With Selection.Characters(Start:=1, Length:=13).Font<br /> .ColorIndex = xlAutomatic<br /> End With<br /> With Selection.Characters(Start:=14, Length:=6).Font<br /> .ColorIndex = 3<br /> End With<br /> ElseIf Hoja = "facturas" Then<br /> With Selection.Font<br /> .ColorIndex = xlAutomatic<br /> End With<br /> End If<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br /> <span style="color:#009900;">'finalizamos el macro</span><br /> Exit Sub<br />End If<br /><span style="color:#009900;">'fichamos la celda donde estamos</span><br />celda = ActiveCell.Address<br /><span style="color:#009900;">'eliminamos todo lo que haya en la hoja5</span><br />Hoja5.Select<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'seleccionamos la celda A5</span><br />Range("A5").Select<br /><span style="color:#009900;">'seleccionamos todo el rango continuo</span><br />Range(Selection, Selection.End(xlDown)).Select<br /><span style="color:#009900;">'borramos las filas (los clientes)</span><br />Selection.EntireRow.Delete<br /><span style="color:#009900;">'borramos ahora las fechas</span><br />Range("B4").Select<br /><span style="color:#009900;">'seleccionamos todo el rango continuo por la derecha</span><br />Range(Selection, Selection.End(xlToRight)).Select<br /><span style="color:#009900;">'borramos las filas (los clientes)</span><br />Selection.EntireColumn.Delete<br /><span style="color:#009900;">'seleccionamos la hoja2</span><br />Hoja2.Select<br /><span style="color:#009900;">'nos situamos en la primera celda con datos</span><br />Range("A5").Select<br /><span style="color:#009900;">'seleccionamos todo el rango continuo</span><br />Range(Selection, Selection.End(xlDown)).Select<br /><span style="color:#009900;">'copiamos los datos</span><br />Selection.Copy<br /><span style="color:#009900;">'seleccionamos la celda A5</span><br />Range("A5").Select<br /><span style="color:#009900;">'seleccionamos la hoja5</span><br />Hoja5.Select<br /><span style="color:#009900;">'seleccionamos la celda A5</span><br />Range("A5").Select<br /><span style="color:#009900;">'pegamos los datos</span><br />Selection.PasteSpecial Paste:=xlPasteValues<br /><span style="color:#009900;">'fichamos la fila máxima</span><br />fila_maxima = Selection.End(xlDown).Row<br /><span style="color:#009900;">'vamos a la hoja4, donde tenemos las facturas<br />'y seleccionamos la fecha menor y mayor</span><br />Hoja4.Select<br /><span style="color:#009900;">'seleccionamos todo el rango continuo<br />'desde A5 hasta abajo del todo</span><br />Range("A5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="FRAS", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C1:R" & ActiveCell.Row & "C1"<br /><span style="color:#009900;">'seleccionamos todo el rango continuo<br />'desde D5 hasta abajo del todo</span><br />Range("D5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="IMPORTES", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C4:R" & ActiveCell.Row & "C4"<br /><span style="color:#009900;">'seleccionamos todo el rango continuo<br />'desde E5 hasta abajo del todo</span><br />Range("E5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'le ponemos un nombre a ese rango</span><br />ActiveWorkbook.Names.Add Name:="VTOS", RefersToR1C1:="='" _<br />& ActiveSheet.Name & "'!R5C5:R" & ActiveCell.Row & "C5"<br /><span style="color:#009900;">'volvemos a E5</span><br />Range("E5").Select<br /><span style="color:#009900;">'definimos dos variables (fecha mínima y máxima)</span><br />minimo = ActiveCell<br />maximo = ActiveCell<br />Do While Not IsEmpty(ActiveCell)<br /> <span style="color:#009900;">'seleccionamos la fecha mínima y máxima</span><br /> If ActiveCell < minimo Then minimo = ActiveCell<br /> If ActiveCell > maximo Then maximo = ActiveCell<br /> <span style="color:#009900;">'controlamos que no falten datos: nombre del cliente,<br /> 'fecha de factura, vencimiento e importe.<br /> 'Comenzamos controlando el vencimiento</span><br /> If IsDate(ActiveCell) <> True Then incorrecto = True<br /> <span style="color:#009900;">'controlamos la fecha de la factura</span><br /> If IsDate(ActiveCell.Offset(0, -2)) <> True Then incorrecto = True<br /> <span style="color:#009900;">'controlamos el importe</span><br /> If Not IsNumeric(ActiveCell.Offset(0, -1)) Or _<br /> ActiveCell.Offset(0, -1) = "" Then incorrecto = True<br /> <span style="color:#009900;">'controlamos que exista el cliente</span><br /> If ActiveCell.Offset(0, -4) = "" Then incorrecto = True<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br />Loop<br /><span style="color:#009900;">'si hay errores, mostramos un mensaje</span><br />If Err.Number <> 0 Then<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("Existen errores." _<br /> + Chr(10) + Chr(10) + "Por favor, revisa todo, para poder continuar.") _<br /> , , "Datos incorrectos"<br /> <span style="color:#009900;">'volvemos a la hoja4</span><br /> Hoja4.Select<br /> <span style="color:#009900;">'nos situábamos en la celda donde estábamos</span><br /> Range(celda).Select<br /> <span style="color:#009900;">'vamos a la línea "boton"</span><br /> GoTo boton<br />End If<br /><span style="color:#009900;">'si hay errores, mostramos un mensaje</span><br />If incorrecto = True Then<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("Existen errores en algunas de estas columnas:" _<br /> + Chr(10) + Chr(10) + "- Nombre de los clientes." _<br /> + Chr(10) + "- Fecha de las facturas." _<br /> + Chr(10) + "- Importe de las facturas." _<br /> + Chr(10) + "- Vencimiento de las facturas." _<br /> + Chr(10) + Chr(10) + "Por favor, revísalo, para poder continuar.") _<br /> , , "Datos incorrectos"<br /> <span style="color:#009900;">'volvemos a la hoja4</span><br /> Hoja4.Select<br /> <span style="color:#009900;">'nos situábamos en la celda donde estábamos</span><br /> Range(celda).Select<br /> <span style="color:#009900;">'vamos a la línea "boton"</span><br /> GoTo boton<br />End If<br /><span style="color:#009900;">'ahora seleccionamos el primer día del mes del mínimo y máximo</span><br />minimo = "01" & "/" & Month(minimo) & "/" & Year(minimo)<br />maximo = "01" & "/" & Month(maximo) & "/" & Year(maximo)<br /><span style="color:#009900;">'recuerda que esta aplicación ha salido de<br />'http://hojas-de-calculo-en-excel.blogspot.com<br />'calculamos la diferencia en meses entre el mínimo y el máximo</span><br />meses = DateDiff("m", minimo, maximo)<br /><span style="color:#009900;">'si la diferencia de meses es superior a 120<br />'mostramos un mensaje de error</span><br />If meses > 120 Then<br /> <span style="color:#009900;">'mostramos un mensaje</span><br /> MsgBox ("Hay más de 10 años de diferencia entre el " _<br /> + Chr(10) + "primer vencimiento, y el último vencimiento." _<br /> + Chr(10) + Chr(10) + "Por favor, revísalo, para poder continuar.") _<br /> , , "Vencimientos incorrectos"<br /> <span style="color:#009900;">'volvemos a la hoja4</span><br /> Hoja4.Select<br /> <span style="color:#009900;">'nos situábamos en la celda donde estábamos</span><br /> Range(celda).Select<br /> <span style="color:#009900;">'vamos a la línea "boton"</span><br /> GoTo boton<br />End If<br /><span style="color:#009900;">'volvemos a la hoja5</span><br />Hoja5.Select<br /><span style="color:#009900;">'escribimos los meses para planificar los cobros,<br />'primero escribiendo los meses</span><br />Range("A4").Select<br />For i = 0 To meses<br /> <span style="color:#009900;">'seleccionamos la columna de la derecha</span><br /> ActiveCell.Offset(0, 1).Select<br /> <span style="color:#009900;">'escribimos el mes</span><br /> ActiveCell = DateAdd("m", i, minimo)<br />Next<br /><span style="color:#009900;">'escribimos el total</span><br />ActiveCell.Offset(0, 1) = "TOTAL"<br /><span style="color:#009900;">'fichamos la columna máxima</span><br />columna_maxima = Selection.End(xlToRight).Column<br /><span style="color:#009900;">'copiamos el formato de la celda A4</span><br />Range("A4").Select<br />ActiveCell.Copy<br /><span style="color:#009900;">'seleccionamos todo el rango continuo por<br />'la derecha, desde la segunda columna</span><br />Range(Selection.Offset(0, 1), Selection.End(xlToRight)).Select<br /><span style="color:#009900;">'pegamos los formatos</span><br />Selection.PasteSpecial Paste:=xlPasteFormats<br /><span style="color:#009900;">'ponemos los formatos de fecha (mes y año)</span><br />Selection.NumberFormat = "[$-340A]mmm yyyy"<br /><span style="color:#009900;">'alineamos esos encabezados a la derecha</span><br />Range("B4").Select<br /><span style="color:#009900;">'seleccionamos todo el rango continuo por la derecha</span><br />Range(Selection, Selection.End(xlToRight)).Select<br />With Selection<br /> .HorizontalAlignment = xlRight<br />End With<br /><span style="color:#009900;">'nos situamos en la celda B5</span><br />Range("B5").Select<br /><span style="color:#009900;">'escribimos la fórmula</span><br />ActiveCell.FormulaR1C1 = _<br />"=SUMPRODUCT((FRAS=RC1)*(MONTH(VTOS)=MONTH(R4C))*(YEAR(VTOS)=YEAR(R4C))*IMPORTES)"<br /><span style="color:#009900;">'copiamos y pegamos la fórmula en toda la tabla</span><br />Selection.Copy<br />Range(Cells(5, 2), Cells(fila_maxima, columna_maxima - 1)).Select<br />ActiveSheet.Paste<br /><span style="color:#009900;">'ponemos los totales</span><br />Range("A5").Select<br /><span style="color:#009900;">'nos situamos en la primera fila libre</span><br />Selection.End(xlDown).Offset(1, 0).Select<br />ActiveCell = "TOTALES"<br /><span style="color:#009900;">'pasamos a la siguiente columna</span><br />ActiveCell.Offset(0, 1).Select<br /><span style="color:#009900;">'escribimos las sumas totales de cada mes</span><br />For i = 2 To columna_maxima<br /> <span style="color:#009900;">'escribimos el total</span><br /> ActiveCell.FormulaR1C1 = "=SUM(R[-" & fila_maxima - 4 & _<br /> "]C:R[-1]C)"<br /> <span style="color:#009900;">'nos movemos a la derecha</span><br /> ActiveCell.Offset(0, 1).Select<br />Next<br /><span style="color:#009900;">'volvemos a la última columna, y<br />'seleccionamos toda la fila</span><br />ActiveCell.Offset(0, -1).Select<br />Range(Selection, Selection.End(xlToLeft)).Select<br /><span style="color:#009900;">'ponemos la fila en negrita, con<br />'bordes, y con la trama de color amarillo</span><br />Selection.Font.Bold = True<br />With Selection.Borders(xlEdgeTop)<br /> .LineStyle = xlContinuous<br />End With<br />With Selection.Borders(xlEdgeBottom)<br /> .LineStyle = xlContinuous<br /> .Weight = xlMedium<br />End With<br />With Selection.Interior<br /> .ColorIndex = 36<br />End With<br /><span style="color:#009900;">'nos vamos a la última columna,<br />'es decir, la de los totales</span><br />Cells(5, columna_maxima).Select<br /><span style="color:#009900;">'escribimos las sumas totales de cada cliente</span><br />For i = 5 To fila_maxima<br /> <span style="color:#009900;">'escribimos el total</span><br /> ActiveCell.FormulaR1C1 = "=SUM(RC[-" & columna_maxima - 2 & _<br /> "]:RC[-1])"<br /> <span style="color:#009900;">'nos movemos hacia abajo</span><br /> ActiveCell.Offset(1, 0).Select<br />Next<br /><span style="color:#009900;">'ponemos todas esas sumas de cada cliente, en negrita</span><br />Range(Selection, Selection.End(xlUp)).Select<br />Selection.Font.Bold = True<br /><span style="color:#009900;">'le volvemos a poner el nombre correcto al botón</span><br />boton:<br />If hoja = "menu" Or hoja = "facturas" Then<br /> <span style="color:#009900;">'seleccionamos la hoja1 o la hoja4</span><br /> If hoja = "menu" Then Hoja1.Select<br /> If hoja = "facturas" Then Hoja4.Select<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'seleccionamos el botón2</span><br /> ActiveSheet.Shapes("Botón 2").Select<br /> <span style="color:#009900;">'le cambiamos el nombre</span><br /> Selection.Characters.Text = "Previsión de cobros"<br /> If hoja = "menu" Then<br /> With Selection.Characters(Start:=1, Length:=13).Font<br /> .ColorIndex = xlAutomatic<br /> End With<br /> With Selection.Characters(Start:=14, Length:=6).Font<br /> .ColorIndex = 3<br /> End With<br /> ElseIf hoja = "facturas" Then<br /> With Selection.Font<br /> .ColorIndex = xlAutomatic<br /> End With<br /> End If<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br /> <span style="color:#009900;">'finalizamos el macro, si hay errores</span><br /> If Err.Number <> 0 Or incorrecto = True Or meses > 120 Then Exit Sub<br />End If<br /><span style="color:#009900;">'nos situamos en la fila con el rótulo de los<br />'totales, de la hoja5</span><br />Hoja5.Select<br />Range("A5").Select<br />Selection.End(xlDown).Select<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br />End Sub<br /></td></tr><br /></table><br />Finalmente comentar que el procedimiento correcto para inicializar la aplicación sería este, y necesariamente en este orden que os incluyo a continuación, pues en caso de no seguir este procedimiento, la aplicación puede responder con errores o de forma inesperada:<br /><br />1. Dar de alta las formas de pago.<br />2. Dar de alta los clientes.<br />3. Dar de alta las facturas.<br /><br />A<a name="control-de-vencimientos-de-facturas-y-recibos"></a> partir de ese momento, y si nuestros clientes son los que son, y no generamos nuevos clientes, tan solo tendremos que preocuparnos por introducir las facturas. Si tenemos un cliente nuevo, deberemos darlo de alta previamente, y si su forma de pago es nueva, deberemos dar de alta ésta lo primero de todo, siguiendo el esquema explicado en el párrafo anterior.<br /><br />Espero que os sea de utilidad esta aplicación. Desde aquí podéis <a href="http://www.mediafire.com/?wtip1a1agldr7qh" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo (resubido, con mejoras en el código, el 09/07/2011).<br /><br />Si hacéis algún cambio a la aplicación, os ruego que no me pidáis modificaciones personalizadas para vuestro caso en concreto o el de vuestra empresa, porque mi tiempo es muy limitado, y prefiero utilizarlo en resolver cuestiones de uso común. Si por el contrario, crees que sería interesante introducir alguna mejora en la aplicación, para que sea de uso público y los demás puedan aprovechar esa utilidad, entonces gustoso intentaré darle solución, si mis limitados conocimientos me lo permiten.<br /><br />Si en vuestra empresa trabajáis con descuento comercial (descuento de efectos), en este otro artículo podréis descargar la aplicación para <a href=" http://www.hojasdecalculoexcel.com/2011/06/controlar-vencimientos-de-facturas-y.html " title=" controlar vencimientos de facturas y recibos, con descuento comercial ">controlar vencimientos de facturas y recibos, con descuento comercial</a>.<br /><br />Por cierto, al hilo de esta aplicación para el control de vencimientos de facturas y recibos, solo quiero recordaros a los que realizáis actividades empresariales o profesionales en territorio español, que la reciente publicación de la <a href="http://boe.es/boe/dias/2010/07/06/pdfs/BOE-A-2010-10708.pdf" title="Ley antimorosidad" rel="nofollow" target="_blank">ley de lucha contra la morosidad comercial</a>, solo permite un <strong>máximo de 60 días de crédito</strong> para aquellas operaciones que se realicen a partir del 1 de enero de 2013. Es decir, a partir de esa fecha, no podréis darle a vuestros clientes un plazo de pago superior a los 60 días (si los clientes tienen fecha fija de pago, deberéis tener en cuenta esta circunstancia, para adaptar las condiciones de pago, y que no exceda del límite marcado en la ley). No obstante, hasta esa fecha (1 de enero de 2013) uno no puede hacer lo que desee, ya que desde la entrada en vigor de la ley (7 de julio de 2010), existe un periodo transitorio para adaptarnos a ese máximo de 60 días, y no tener que bajar de golpe de los 180, 150, 120, 90 días, o los que vuestra empresa de a sus clientes. De esta forma, todas las empresas competirán en las mismas condiciones crediticias. Algo muy importante que como novedad incorpora la ley (en sustitución de la anterior ley antimorosidad), es que <strong>no admite el acuerdo entre las partes, para alargar los plazos de crédito a los clientes</strong>, es decir, bajo ningún concepto se podrá superar el límite de los 60 días de crédito comercial, pues no se permite que pactes alargar ese límite con tus clientes.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com66tag:blogger.com,1999:blog-7983188466168395484.post-48716452263947074552010-06-09T00:01:00.008+02:002012-06-30T21:35:29.245+02:00Préstamos según el método americanoExiste un método de amortización de préstamos, que consiste en liquidar únicamente intereses en cada cuota, excepto en la cuota final, que aparte de los intereses, también amortizaremos el préstamo, y además lo haremos de golpe. Este método de amortización de préstamos, se denomina método americano, y su uso aunque no está muy extendido, siempre puede sernos útil.<br /><br />Las características básicas de este tipo de préstamos, son las siguientes:<br /><br /><ul><li>Tienen casi todas las cuotas constantes (excepto la última).</li><br /><li>El capital se amortiza en la última cuota.</li><br /><li>Los intereses que se pagan, son constantes en cada cuota.</li></ul><br /><br />Como siempre, el que quiera <a href="#descarga-prestamo-americano" title="Descargar la aplicación para calcular préstamos según el sistema americano">descargar la aplicación</a> sin tener que leer todo este artículo, puede hacerlo desde el enlace que acabo de incluir, pero es recomendable una lectura rápida, al menos para saber de qué estamos hablando.<br /><br />Como en el <a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html" title="método francés de amortización de préstamos">método francés</a> (que es el sistema habitual para el cálculo de préstamos e hipotecas), expliqué detenidamente todo el código fuente, aquí solo incluiré la parte del código que varía con respecto al resto de métodos, que no es otra que las fórmulas de la tabla de amortización que se obtiene.<br /><br />Los más avispados se darán cuenta que hemos eliminado todo lo relativo a la carencia en este método de amortización de préstamos, pues implícitamente la carencia ya viene incluida en la propia metodología de cálculo del sistema americano, ya que no se amortiza el principal hasta la última cuota.<br /><br />Antes os mostraré unos pantallazos, tanto del formulario de información del método americano, como del propio formulario donde introduciremos los datos necesarios para realizar los cálculos:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFEGMTMH-CQjvC2Z1MXFseVtG9LBO-1xeQclFSC8X7G-00DFKI3_T_CKxr_Xl6H-seJgblrjd3kO_p9kn0G5wQOS_T5CAcBoyMG0aTIkuW6uOP-6nlu3erovpycL6xKTrPR0kg_DNR-Ry7/s1600/informacion-prestamos-metodo-americano.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 366px; height: 234px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFEGMTMH-CQjvC2Z1MXFseVtG9LBO-1xeQclFSC8X7G-00DFKI3_T_CKxr_Xl6H-seJgblrjd3kO_p9kn0G5wQOS_T5CAcBoyMG0aTIkuW6uOP-6nlu3erovpycL6xKTrPR0kg_DNR-Ry7/s400/informacion-prestamos-metodo-americano.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5480294493654753442" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg59_g844yNJR91XQFTE-_0rVV9oAULut729o2LvD4DZ5y1XA32Y5JFxTZ5MYpJncr_13NHipt_Eih0lgDaesMyg_JvSlqiZkYeVq-SQLxgckTDZiL9r9zA4OuiprxbNuFBT46oonGPM4uv/s1600/prestamos-metodo-americano.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 229px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg59_g844yNJR91XQFTE-_0rVV9oAULut729o2LvD4DZ5y1XA32Y5JFxTZ5MYpJncr_13NHipt_Eih0lgDaesMyg_JvSlqiZkYeVq-SQLxgckTDZiL9r9zA4OuiprxbNuFBT46oonGPM4uv/s400/prestamos-metodo-americano.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5480294500082946050" /></a><br /><br />El código fuente correspondiente a la parte más importante (las fórmulas del préstamo americano), es este:<br /><table class="tablavba"><tr><td><span style="color:#009900;">'Seguimos poniendo el capital vivo<br /> 'antes del pago de la 1ª cuota</span><br /> Range("E18").Select<br /> ActiveCell.Formula = "=R7C[1]"<br /> <span style="color:#009900;">'seguimos poniendo el capital amortizado<br /> 'en la primera cuota (que es cero)</span><br /> Range("F18").Select<br /> ActiveCell = 0<br /> <span style="color:#009900;">'seguimos poniendo los intereses pagados</span><br /> Range("G18").Select<br /> ActiveCell.Formula = "=IF(RC[-5]<=R9C6,RC[-2]*R8C6/R10C6,0)"<br /> <span style="color:#009900;">'seguimos poniendo el capital amortizado acumulado</span><br /> Range("H18").Select<br /> ActiveCell = 0<br /> <span style="color:#009900;">'seguimos poniendo los intereses acumulados</span><br /> Range("I18").Select<br /> ActiveCell.Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'seguimos poniendo la cuota total</span><br /> Range("J18").Select<br /> ActiveCell.Formula = "=RC[-4]+RC[-3]"<br /> <span style="color:#009900;">'seguimos poniendo el resto de datos, es decir<br /> 'el capital vivo antes del pago de cada cuota,<br /> 'el capital amortizado, los intereses, el capital<br /> 'amortizado acumulado, los intereses acumulados,<br /> 'y el importe de las cuotas</span><br /> Range("E18").Select<br /> For i = 1 To CuotasTotales - 1<br /> <span style="color:#009900;">'hasta la penúltima cuota...</span><br /> If i < CuotasTotales - 1 Then<br /> <span style="color:#009900;">'el capital vivo</span><br /> ActiveCell.Offset(1, 0).Formula = "=R[-1]C-R[-1]C[1]"<br /> <span style="color:#009900;">'el capital amortizado</span><br /> ActiveCell.Offset(1, 1).Formula = "=R[-1]C"<br /> <span style="color:#009900;">'los intereses pagados</span><br /> ActiveCell.Offset(1, 2).Formula = "=IF(RC[-5]<=R9C6,RC[-2]*R8C6/R10C6,0)"<br /> <span style="color:#009900;">'el capital amortizado acumulado</span><br /> ActiveCell.Offset(1, 3).Formula = "=R[-1]C"<br /> <span style="color:#009900;">'los intereses acumulados</span><br /> ActiveCell.Offset(1, 4).Formula = "=IF(RC[-7]<>0,R[-1]C+RC[-2],0)"<br /> <span style="color:#009900;">'la cuota total</span><br /> ActiveCell.Offset(1, 5).Formula = "=RC[-4]+RC[-3]"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> <span style="color:#009900;">'si estamos en la última cuota...</span><br /> Else<br /> <span style="color:#009900;">'el capital vivo</span><br /> ActiveCell.Offset(1, 0).Formula = "=R[-1]C-R[-1]C[1]"<br /> <span style="color:#009900;">'el capital amortizado</span><br /> ActiveCell.Offset(1, 1).Formula = "=RC[-1]"<br /> <span style="color:#009900;">'los intereses pagados</span><br /> ActiveCell.Offset(1, 2).Formula = "=IF(RC[-5]<=R9C6,RC[-2]*R8C6/R10C6,0)"<br /> <span style="color:#009900;">'el capital amortizado acumulado</span><br /> ActiveCell.Offset(1, 3).Formula = "=RC[-2]"<br /> <span style="color:#009900;">'los intereses acumulados</span><br /> ActiveCell.Offset(1, 4).Formula = "=IF(RC[-7]<>0,R[-1]C+RC[-2],0)"<br /> <span style="color:#009900;">'la cuota total</span><br /> ActiveCell.Offset(1, 5).Formula = "=RC[-4]+RC[-3]"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> End If<br /> Next<br /></td></tr><br /></table><br />Y el resultado que obtendríamos sería algo como lo que os muestro en este ejemplo:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfkzPRAcast3coY5GpLHwynidBrCRRf04RF9I4jk_upnWmouQTLqSed04CU7ce5MH_MxD2We-NBfra3O81r9LdWIB9noIaqp4DJwtnfRuWg8EQc7Ng8U2QLsfEaTew18RSzpT-pamGGbQT/s1600/prestamo-americano.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfkzPRAcast3coY5GpLHwynidBrCRRf04RF9I4jk_upnWmouQTLqSed04CU7ce5MH_MxD2We-NBfra3O81r9LdWIB9noIaqp4DJwtnfRuWg8EQc7Ng8U2QLsfEaTew18RSzpT-pamGGbQT/s400/prestamo-americano.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5480295983624790834" /></a><br /><br />Desde<a name="descarga-prestamo-americano"></a> aquí podéis <a href="http://www.mediafire.com/?w72nyjqh39wsko9" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo. Espero que lo disfrutéis.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com5tag:blogger.com,1999:blog-7983188466168395484.post-15453273452660997782010-05-17T10:57:00.020+02:002012-06-30T21:36:51.872+02:00Préstamos con amortización de capital constanteHoy utilizaremos nuestra potente hoja de cálculo Excel, para montar un sistema de amortización de préstamos, siguiendo el mismo mecanismo y la metodología que ya aplicamos en su momento para el modelo de amortización de préstamos siguiendo el <a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html" title="Amortización de préstamos según el sistema francés">sistema francés</a>, que es el modelo estándar para el cálculo de préstamos e hipotecas. En esta ocasión, lo que haremos será calcular la amortización del préstamo, pero amortizando en cada cuota la misma cantidad de capital, es decir, en esta ocasión trabajaremos los préstamos con amortización de capital constante. Como siempre, tendremos también en cuenta la posibilidad de que exista un periodo de carencia en el que no se amorticen cuotas del principal del préstamo.<br /><br />Las características básicas de este tipo de préstamos, son las siguientes:<br /><br /><ul><li>Los intereses se devengan al vencimiento de cada cuota.</li><br /><li>El capital que se amortiza es constante en cada cuota, es decir, el principal del préstamo que se va pagando, es siempre del mismo importe, a medida que va transcurriendo el tiempo, y a medida que vamos liquidando las cuotas.</li><br /><li>Los intereses van disminuyendo y son menores en cada cuota.</li><br /><li>Las cuotas totales que se pagan, son variables y cada vez menores, debido a que los intereses son cada vez menores.</li></ul><br /><br />Como siempre, el que quiera <a href="http://www.hojasdecalculoexcel.com/2010/05/prestamos-con-amortizacion-de-capital.html#descarga-prestamos-amortizacion-capital-constante" title="Descargar la aplicación para calcular préstamos con amortización de capital constante">descargar la aplicación</a> sin tener que leer todo este artículo, puede hacerlo en cualquier momento, pero es recomendable al menos, una lectura rápida por encima, para hacernos una idea y saber de que estamos hablando.<br />Lo primero que haremos en nuestra aplicación financiera para el cálculo de préstamos con amortización de capital constante, será construir un formulario con información sobre el préstamo, tal y como aparece en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVrYOJnKx0iSkj1Sw2K-WRj7jO4M68p1-ZN56PrZKTMTPXW7Gz886FPnh-n1XC1D76tdSLmAWbSXerJnfbSZv1GTEzqCRqRBEoVQKvowVxpQ38OMRTmHjRcbOTYo8Eog2TU6Cl2Hy23yHj/s1600/formulario-de-informacion-del-prestamo-con-amortizacion-de-capital-constante.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 366px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVrYOJnKx0iSkj1Sw2K-WRj7jO4M68p1-ZN56PrZKTMTPXW7Gz886FPnh-n1XC1D76tdSLmAWbSXerJnfbSZv1GTEzqCRqRBEoVQKvowVxpQ38OMRTmHjRcbOTYo8Eog2TU6Cl2Hy23yHj/s400/formulario-de-informacion-del-prestamo-con-amortizacion-de-capital-constante.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5472170179313455474" /></a><br />Para no escribir líneas de código innecesarias, solo añadiré aquí el código fuente (o la parte del código fuente) que sea diferente a la aplicación que ya vimos en su momento cuando estudiamos el método francés de amortización de préstamos.<br /><br />Para lanzar el formulario con la información sobre este tipo de préstamos, tal y como muestra la imagen anterior, simplemente tendremos que añadir estas líneas de código en un módulo (al formulario le hemos puesto por nombre InfoPrestamoCapitalConstante):<br /><table class="tablavba"><tr><td>Sub Prestamo_Capital_constante()<br /><span style="color:#009900;">'Lanzamos el formulario con info sobre<br />'el préstamo con amortización de capital constante</span><br />InfoPrestamoCapitalConstante.Show<br />End Sub<br /></td></tr><br /></table><br />Una vez hayamos lanzado ese formulario, y pulsemos el botón “Si”, nos aparecerá este segundo formulario, para informar directamente de las características del préstamo.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtPYnNrAd3pFRcB-0wFr6NHhL9-tEBiV-CfyFnw9xSUwIrY_jLwLmoMD96DBX69LTa52jcFYvnKssAS7aq3NA0ZxP03Z6F3IRwrFj_NQSv7dFNB9ZSsMISp2SoXwn23MMl63SGXhFHJs4G/s1600/formulario-del-prestamo-con-amortizacion-de-capital-constante.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 278px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtPYnNrAd3pFRcB-0wFr6NHhL9-tEBiV-CfyFnw9xSUwIrY_jLwLmoMD96DBX69LTa52jcFYvnKssAS7aq3NA0ZxP03Z6F3IRwrFj_NQSv7dFNB9ZSsMISp2SoXwn23MMl63SGXhFHJs4G/s400/formulario-del-prestamo-con-amortizacion-de-capital-constante.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5472166572526873954" /></a><br />Para no ser excesivamente aburrido, aquí os dejo solo la parte del código que está directamente relacionada con los préstamos con amortización de capital constante, y más concretamente la parte correspondiente a las fórmulas de la tabla resultante:<br /><table class="tablavba"><tr><td><span style="color:#009900;">'Seguimos poniendo el capital vivo<br /> 'antes del pago de la 1ª cuota</span><br /> Range("E18").Select<br /> ActiveCell.Formula = "=IF(RC[-3]<=R14C6+1,R7C6,IF(RC[-3]<=R7C6,R[-1]C-R[-1]C[1],0))"<br /> <span style="color:#009900;">'seguimos poniendo el capital amortizado<br /> 'en la primera cuota</span><br /> Range("F18").Select<br /> ActiveCell.Formula = "=IF(RC[-4]<R14C6+1,0,IF(RC[-4]<=(R9C6+R14C6),R7C6/R9C6,0))"<br /> <span style="color:#009900;">'seguimos poniendo los intereses pagados</span><br /> Range("G18").Select<br /> ActiveCell.Formula = "=IF(RC[-5]<(R14C6+1),RC[-2]*R13C6/R10C6,IF(RC[-5]<=(R9C6+R14C6)," & _<br /> "RC[-2]*R8C6/R10C6,0))"<br /> <span style="color:#009900;">'seguimos poniendo el capital amortizado acumulado</span><br /> Range("H18").Select<br /> ActiveCell.Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'seguimos poniendo los intereses acumulados</span><br /> Range("I18").Select<br /> ActiveCell.Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'seguimos poniendo la cuota total</span><br /> Range("J18").Select<br /> ActiveCell.Formula = "=IF(RC[-8]<=R18C5,RC[-3]+RC[-4],0)"<br /> <span style="color:#009900;">'seguimos poniendo el resto de datos, es decir<br /> 'el capital vivo antes del pago de cada cuota,<br /> 'el capital amortizado, los intereses, el capital<br /> 'amortizado acumulado, los intereses acumulados,<br /> 'y el importe de las cuotas</span><br /> Range("E18").Select<br /> For i = 1 To CuotasTotales - 1<br /> <span style="color:#009900;">'el capital vivo</span><br /> ActiveCell.Offset(1, 0).Formula = "=IF(RC[-3]<=R14C6+1,R7C6,IF(RC[-3]<=R7C6,R[-1]C-R[-1]C[1],0))"<br /> <span style="color:#009900;">'el capital amortizado</span><br /> ActiveCell.Offset(1, 1).Formula = "=IF(RC[-4]<R14C6+1,0,IF(RC[-4]<=(R9C6+R14C6),R7C6/R9C6,0))"<br /> <span style="color:#009900;">'los intereses pagados</span><br /> ActiveCell.Offset(1, 2).Formula = "=IF(RC[-5]<(R14C6+1),RC[-2]*R13C6/R10C6,IF(RC[-5]<=(R9C6+R14C6)," & _<br /> "RC[-2]*R8C6/R10C6,0))"<br /> <span style="color:#009900;">'el capital amortizado acumulado</span><br /> ActiveCell.Offset(1, 3).Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'los intereses acumulados</span><br /> ActiveCell.Offset(1, 4).Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'la cuota total</span><br /> ActiveCell.Offset(1, 5).Formula = "=IF(RC[-8]<=R18C5,RC[-3]+RC[-4],0)"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /></td></tr><br /></table><br />Lo que obtendremos será una tabla como la que podemos ver en este ejemplo (aquí solo sale una parte de la tabla). En ella podréis ver que en cada cuota, se amortiza siempre la misma cantidad de capital (del principal del préstamo):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJw5Tyg_w4u_Y6puj7zE_fFj9B1JdXezrwkE5W9GJDFqMPjOrupUOiKA63TGGA19D9EoLxR1Pe3n6UxuH3Fm9hgWmoaSj_Pur7WTshbrVyIqS5-USn2xywSt44L02JNK2UIh4J8FmzX7bL/s1600/calculo-de-prestamos-amortizacion-capital-constante.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 263px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJw5Tyg_w4u_Y6puj7zE_fFj9B1JdXezrwkE5W9GJDFqMPjOrupUOiKA63TGGA19D9EoLxR1Pe3n6UxuH3Fm9hgWmoaSj_Pur7WTshbrVyIqS5-USn2xywSt44L02JNK2UIh4J8FmzX7bL/s400/calculo-de-prestamos-amortizacion-capital-constante.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5472167726304269314" /></a><br /><br />Llegados<a name="descarga-prestamos-amortizacion-capital-constante"></a> a este punto, solo me queda por comunicaros a todos los lectores del blog, que desde aquí podéis <a href="http://www.mediafire.com/?777h1gifdqzh47m" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com25tag:blogger.com,1999:blog-7983188466168395484.post-27895603043858572692010-04-21T00:01:00.004+02:002012-06-30T21:17:38.487+02:00Calcular el VAN, para periodos irregularesEn un artículo anterior, ya explicamos como <a href="http://www.hojasdecalculoexcel.com/2010/02/calcular-la-tir-de-una-inversion-para.html" title="Calcular la TIR, para periodos de tiempo irregulares">calcular la TIR de una inversión, para periodos de tiempo irregulares</a> o no constantes. Ahora le toca el turno a la VAN (Valor Actual Neto), en el caso de encontrarnos con periodos también irregulares.<br /><br />Lo más habitual es que nos encontremos con periodos de tiempo siempre constantes, como por ejemplo, cuando invertimos una cantidad X hoy, y cobramos otra cantidad Y cada final de año, durante una cantidad de años determinada. En ese caso, con utilizar la función <a href="http://www.hojasdecalculoexcel.com/2009/05/calcular-la-tir-y-el-van.html" title="Calcular la TIR">TIR</a>, tenemos resuelto el tema cómo calcular la tasa interna de rendimiento. Lo mismo nos pasará con el VAN, si utilizamos la función <a href="http://www.hojasdecalculoexcel.com/2009/05/calcular-la-tir-y-el-van.html" title="Calcular el VAN">VNA</a>, para calcular el valor actual neto, en el caso de que queramos saber que cantidad deberíamos invertir (supondremos en un principio, que la inversión inicial es cero, para que el valor actual neto sea precisamente el valor actual, es decir, la inversión que tenemos que hacer), cobrando esas cantidades Y cada año, a medida que vamos jugando y probando con diferentes tipos de interés.<br /><br />Ahora vamos a ver como calcular el valor actual de una inversión, para periodos que no siempre son constantes, sabiendo los cobros futuros, y el tipo de interés, pero sin determinar el valor inicial de la inversión (para obtener ese valor actual, utilizaremos la función VNA.NO.PER). Para ello, utilizaremos un ejemplo, que es la mejor forma de explicar el funcionamiento de una función en Excel. Vamos a determinar cual debería ser la cantidad a invertir hoy (suponemos que hoy es 21 de abril de 2010), en el caso de que recibamos los siguientes cobros, en las fechas en las que se indica en la siguiente tabla, y suponiendo que el tipo de interés efectivo de mercado, sea del 4,50%:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhip5eku8JnSmzX7N1fTVhy0x9ikOBTM8YR66v7Ql8BOFlGZ8F8l-riIpQXB3Bnoazh6uQaLO5qhwzWn92vUCQgE-LIYsQ-wV_e1Vqvm980AW2sXr9LWe1-lJsa_2UBAOnanfcsotRBCXaT/s1600/tabla-cobros-valor-actual-neto.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 140px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhip5eku8JnSmzX7N1fTVhy0x9ikOBTM8YR66v7Ql8BOFlGZ8F8l-riIpQXB3Bnoazh6uQaLO5qhwzWn92vUCQgE-LIYsQ-wV_e1Vqvm980AW2sXr9LWe1-lJsa_2UBAOnanfcsotRBCXaT/s400/tabla-cobros-valor-actual-neto.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5461768289756017522" /></a><br /><br />Si nos fijamos bien, lo que queremos determinar es el valor de la celda C4, que es la inversión inicial que tenemos que hacer, para cobrar todos esos importes en las fechas dadas, sabiendo que el tipo de interés es del 4,50%. Si observamos la tabla anterior con detenimiento, veremos que en la columna de la fecha, los periodos de tiempo no son constantes, por lo que para calcular el valor actual, lo apropiado es utilizar la función VNA.NO.PER de la siguiente forma:<br /><br /><table class="tablaformula"><tr><td>=VNA.NO.PER(tipo de interés; flujos de caja; fechas)<br /></td></tr><br /></table><br /><br />Eso sí, antes de utilizar esta función aplicada a nuestro ejemplo, deberemos introducir en la celda C4, un cero, pues no debe quedar en blanco, ya que sino, la función siguiente nos daría error:<br /><br /><table class="tablaformula"><tr><td>=VNA.NO.PER(C12;C4:C9;B4:B9)<br /></td></tr><br /></table><br /><br />De tal forma que obtendríamos algo como esto que nos aparece en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHS5qZS3FX5VvYDJUj1V4jEqxX-3JdlNd8xCGsF8OFrmvZmUKAYM_cAbmDstDEVdvq-EUWdDQWeEzBqV5EDY5I-6NR-Cocn0UY61mWUybZmsUNQwCwR8bl9RxymqbqDyEEhB1f_Ul5CxZ/s1600/tabla-van-valor-actual-neto.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 163px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHS5qZS3FX5VvYDJUj1V4jEqxX-3JdlNd8xCGsF8OFrmvZmUKAYM_cAbmDstDEVdvq-EUWdDQWeEzBqV5EDY5I-6NR-Cocn0UY61mWUybZmsUNQwCwR8bl9RxymqbqDyEEhB1f_Ul5CxZ/s400/tabla-van-valor-actual-neto.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5461768662463031282" /></a><br /><br />Si nos fijamos lo que acabamos de obtener es el valor actual, es decir, el importe que debemos invertir hoy 21 de abril de 2010, sabiendo que el tipo de interés efectivo es del 4,50%, y sabiendo también que cobraremos o recuperaremos las cantidades indicadas en la tabla y en las fechas indicadas.<br /><br />Si en lugar de utilizar la función como os ponía en el ejemplo, la cambiamos y ponemos esto (fijaos que cambiamos el rango, empezando desde la fila 5, en lugar de la fila 4), estaríamos haciendo las cosas mal:<br /><br /><table class="tablaformula"><tr><td>=VNA.NO.PER(C12;C5:C9;B5:B9)<br /></td></tr><br /></table><br /><br />Lo que obtendríamos sería el valor actual, peroooooooo a la fecha del 14 de Julio de 2010, y no al 21 de abril de 2010, que es lo que nos interesa evaluar. De ahí que debamos incluir la fecha en la que queremos obtener el valor actual, poniendo cero como fujo de caja (ni cobro, ni pago).<br /><br />Podemos hacer una comprobación de que necesitaremos invertir esos 35.043,98 euros (pesos, soles, dólares, o la moneda que queráis), al 4,50% de interés efectivo anual, sabiendo que cobraremos en las fechas indicadas, las cantidades que aparecen en las tablas anteriores. Para ello, utilizaremos la función <a href="http://www.hojasdecalculoexcel.com/2010/02/calcular-la-tir-de-una-inversion-para.html" title="TIR, para periodos de tiempo irregulares">TIR.NO.PER</a> que vimos en otro artículo. Solo tendremos que construir la tabla de la siguiente forma:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjM0GzT65xlkELPy6XHMzRvCghm8pdmiZlr-vT6DfxLUKt8UJ13kdfnYNtvxerUbdiwvZ7MPJ_GP4NkQ9wLT7kKNl4W9oIAwG6nUdEVGNqJE-kmMR_6CY74wd2wpZGtDuMlFbvco_EG5kM/s1600/tabla-van-tir-valor-actual-neto.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 151px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjM0GzT65xlkELPy6XHMzRvCghm8pdmiZlr-vT6DfxLUKt8UJ13kdfnYNtvxerUbdiwvZ7MPJ_GP4NkQ9wLT7kKNl4W9oIAwG6nUdEVGNqJE-kmMR_6CY74wd2wpZGtDuMlFbvco_EG5kM/s400/tabla-van-tir-valor-actual-neto.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5461769254218944418" /></a><br /><br />Si os fijáis bien, como siempre a la hora de calcular la TIR, hemos incluido la inversión inicial en negativo, para diferenciarla de los cobros (es como si pagáramos la inversión inicial, para cobrarla posteriormente poco a poco, en los plazos indicados).El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com0tag:blogger.com,1999:blog-7983188466168395484.post-85907823058501605002010-04-07T11:14:00.012+02:002012-06-30T21:14:55.854+02:00Calculadora de tiemposDado que son muchos los usuarios que llegan a este blog, buscando como operar con unidades de tiempo, y como complemento a los artículos donde explicaba como <a href="http://www.hojasdecalculoexcel.com/2008/12/horas-de-100-minutos-y-conversin-de.html" title="Convertir horas de 100 minutos">convertir horas de 100 minutos</a>, o como <a href="http://www.hojasdecalculoexcel.com/2008/11/convertir-unidades-de-tiempo-formato.html" title="Convertir unidades de tiempo a formato hh:mm:ss">convertir unidades de tiempo a formato hh:mm:ss</a>, o como <a href="http://www.hojasdecalculoexcel.com/2008/08/convertir-unidades-de-tiempo-horas.html" title="Convertir unidades de tiempo: horas, minutos, y segundos">convertir unidades de tiempo: horas, minutos, y segundos</a>, o incluso como <a href="http://www.hojasdecalculoexcel.com/2008/10/control-horario-horas-normales-y-horas.html" title="Calcular horas normales y horas extras">calcular horas normales y horas extras</a>, hoy os presento una pequeña utilidad para convertir horas, minutos y segundos, a unidades decimales, todo ello presentado a través de un formulario, pero que se puede adaptar para cualquier otro modo de presentación, como por ejemplo incluyendo los resultados en diferentes celdas, de nuestra hoja de cálculo Excel.<br /><br />Lo que tendremos que hacer es diseñar un UserForm (un formulario), con este aspecto:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQgB0JY4vTnvv4hY91SqjxaAai67Jm4WUVnKLktq_zmYWknP4LgnQdsFpmj6-cKY5fKkpGZFhKZuJwn6-gKxNRCKyaSURAcQ8xMbjZgNkucn426b7ilFfuITRzIt9aoorxR5e55PBd_2I-/s1600/formulario-calcularora-de-tiempos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQgB0JY4vTnvv4hY91SqjxaAai67Jm4WUVnKLktq_zmYWknP4LgnQdsFpmj6-cKY5fKkpGZFhKZuJwn6-gKxNRCKyaSURAcQ8xMbjZgNkucn426b7ilFfuITRzIt9aoorxR5e55PBd_2I-/s400/formulario-calcularora-de-tiempos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5457325851179516466" /></a><br />No penséis que hay una etiqueta (label) supergrande. En realidad hay varias etiquetas, lo que pasa es que están ligeramente superpuestas, de ahí que parezca que solo hay una. <br /><br />Para lanzar el UserForm, simplemente tendremos que añadir estas líneas a un módulo:<br /><table class="tablavba"><tr><td>Sub lanzar_userform()<br /><span style="color:#009900;">'lanzamos el userform</span><br />UserForm1.Show<br />End Sub<br /></td></tr><br /></table><br />Y este sería el código para que cuando se cargue el formulario, nos llene los tres ComboBox, el de las horas, el de los minutos, y el de los segundos:<br /><table class="tablavba"><tr><td>Private Sub UserForm_Initialize()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'Al cargar el Userform, mostramos<br />'el listado de horas, minutos y segundos,<br />'para ello le pondremos un tope de 1000<br />'horas en el combobox, aunque se puede cambiar</span><br />For i = 0 To 1000<br /> <span style="color:#009900;">'Añadimos las horas</span><br /> ComboBox1.AddItem i<br /> If i <= 59 Then<br /> <span style="color:#009900;">'Añadimos los minutos</span><br /> ComboBox2.AddItem i<br /> <span style="color:#009900;">'Añadimos los segundos</span><br /> ComboBox3.AddItem i<br /> End If<br />Next<br />End Sub<br /></td></tr><br /></table><br />Este otro será el código que se ejecutará, al cliquear sobre el botón que hay en el formulario, y que tiene como etiqueta el nombre "Calcular":<br /><table class="tablavba"><tr><td>Private Sub CommandButton1_Click()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'Hacemos los cálculos que mostraremos<br />'en las diferentes etiquetas, para lo cual<br />'pasamos el item seleccionado, a variables</span><br />horas = ComboBox1.List(ComboBox1.ListIndex)<br />minutos = ComboBox2.List(ComboBox2.ListIndex)<br />segundos = ComboBox3.List(ComboBox3.ListIndex)<br />If IsEmpty(horas) Then horas = 0<br />If IsEmpty(minutos) Then minutos = 0<br />If IsEmpty(segundos) Then segundos = 0<br /><span style="color:#009900;">'mostramos los años</span><br />Label5 = Format((horas + (minutos / 60) + _<br />(segundos / 60 / 60)) / 24 / 365, "#,##0.0000") & " años"<br /><span style="color:#009900;">'mostramos los meses</span><br />Label6 = Format((horas + (minutos / 60) + _<br />(segundos / 60 / 60)) / 24 / 30, "#,##0.0000") & " meses"<br /><span style="color:#009900;">'mostramos las semanas</span><br />Label7 = Format((horas + (minutos / 60) + _<br />(segundos / 60 / 60)) / 24 / 7, "#,##0.0000") & " semanas"<br /><span style="color:#009900;">'mostramos los días</span><br />Label8 = Format((horas + (minutos / 60) + _<br />(segundos / 60 / 60)) / 24, "#,##0.0000") & " días"<br /><span style="color:#009900;">'mostramos las horas</span><br />Label9 = Format(horas + (minutos / 60) + _<br />(segundos / 60 / 60), "#,##0.0000") & " horas"<br /><span style="color:#009900;">'mostramos los minutos</span><br />Label10 = Format((horas * 60) + minutos + segundos / 60, _<br />"#,##0.0000") & " minutos"<br /><span style="color:#009900;">'mostramos los segundos</span><br />Label11 = Format((horas * 60 * 60) + (minutos * 60) + _<br />segundos, "#,##0") & " segundos"<br /><span style="color:#009900;">'mostramos un mensaje al pie del formulario</span><br />Label12 = "Los datos presentados, están en formato decimal."<br />End Sub<br /></td></tr><br /></table><br />Como veis, no tiene ninguna complejidad montar un formulario de este tipo, pues solamente tenemos que tener claro las fórmulas para convertir las horas en minutos, en segundos, etc. Aquí os dejo varios pantallazos con el formulario al cargarse, y con un ejemplo, una vez seleccionadas las horas, minutos y segundos, y tras pulsar el botón "Calcular":<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSQIKoc-W2BZpjBmstFoJd1ModoDBT4sYCcabFZd7lrs2uyL_VwtTaizHjqtlKKoIW3RzInDxtKtUgeH6h9VqJHQTAdneXGuOfceef8TOM0Jm0FjQHvaSfNcKok8GfFE-csTceLKMMrZyc/s1600/cargar-formulario-calcularora-de-tiempos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 330px; height: 351px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSQIKoc-W2BZpjBmstFoJd1ModoDBT4sYCcabFZd7lrs2uyL_VwtTaizHjqtlKKoIW3RzInDxtKtUgeH6h9VqJHQTAdneXGuOfceef8TOM0Jm0FjQHvaSfNcKok8GfFE-csTceLKMMrZyc/s400/cargar-formulario-calcularora-de-tiempos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5457327404854357250" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-i7THIChyphenhyphenn9DIYX3OrpSiEH1mK76w-hiqEHnQibaOkesStYs54JqV2OeT9miWqjwGXR2d4qR_fMUTLl6cr8RVhgg0uRWoJ8ZBIlp822eH1QExlxWlhd0JVE8PV704Bj-O-nC0nJCEjgG5/s1600/calcularora-de-tiempos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 330px; height: 351px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-i7THIChyphenhyphenn9DIYX3OrpSiEH1mK76w-hiqEHnQibaOkesStYs54JqV2OeT9miWqjwGXR2d4qR_fMUTLl6cr8RVhgg0uRWoJ8ZBIlp822eH1QExlxWlhd0JVE8PV704Bj-O-nC0nJCEjgG5/s400/calcularora-de-tiempos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5457327692638308434" /></a><br />Desde aquí <a target="_blank" rel="nofollow" href="http://www.mediafire.com/?u5bhtyt6n2ljyib">descargar el fichero de excel</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com1tag:blogger.com,1999:blog-7983188466168395484.post-91278225572356571752010-03-17T00:01:00.004+01:002012-06-30T21:13:07.652+02:00Habilitar y deshabilitar controles de un formularioQuien haya tenido la santa paciencia de mirarse con detalle el artículo en el que explicaba como <a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html" title="calcular préstamos y cuotas de una hipoteca">calcular préstamos y cuotas de una hipoteca</a>, se habrá dado cuenta que hay algunas cosillas que no he explicado, pero que a simple vista son fácilmente digeribles. Concretamente me estoy refiriendo al hecho de habilitar o deshabilitar controles (cuadros de texto especialmente), dependiendo como interactúa el usuario con el formulario.<br /><br />En ese artículo al que hacía referencia, podéis ver que hay un apartado para informar de si el préstamo tiene carencia o no. Si no tiene carencia, no tiene sentido completar la información relacionada con la misma, y que se solicita en dos TextBox, concretamente los que hay debajo del ComboBox donde se pregunta si el préstamo tiene carencia, y que corresponden al tipo de interés durante el periodo de carencia, y al número de cuotas de carencia. Parece evidente que no tiene sentido permitir que el usuario introduzca un tipo de interés para la carencia, y un número de cuotas de carencia, si el préstamo carece de esta última, ¿verdad?.<br /><br />Pues eso es lo que vamos a explicar de una forma muy sencilla, para que no tengáis que investigar a ciegas a través del código de ese artículo sobre préstamos.<br /><br />Para explicar como funciona esto, lo haremos con un ejemplo sencillo. Lo primero que haremos será crear un UserForm como el que vemos en la siguiente imagen, y que consta de tres Label, un ComboBox, un TextBox, y un CommandButton).<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2oNQs-PM9SRra2qIrIXip2fK4zsXi5AoaRhSLvJkec9WHEMi4hPaI9gTHo2vK_kbsNppKhOxSdFVCeST-HNDSyH6kbC1qo_rVCHQbDYMzII7k2eGK7xjD27hyrxgTW1jDbSkso7BkNRor/s1600-h/formulario-habilitar-deshabilitar-controles.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 228px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2oNQs-PM9SRra2qIrIXip2fK4zsXi5AoaRhSLvJkec9WHEMi4hPaI9gTHo2vK_kbsNppKhOxSdFVCeST-HNDSyH6kbC1qo_rVCHQbDYMzII7k2eGK7xjD27hyrxgTW1jDbSkso7BkNRor/s400/formulario-habilitar-deshabilitar-controles.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5449251551113433570" /></a><br />Como curiosidad, y antes de seguir con el tema, para poder escribir varias líneas en el TextBox, debemos cambiar la propiedad MultiLine a true, tal y como se muestra en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWdrM9SBa_Dt3DDBjVvAKTtKsVS68XjD99HSNxRjU1T8eEwM6F18CjN9KG9uDUqt4L4_jeMc0HNB2wUDemdnfDxCi_LB16ixFtm4uQDWUiuKWh9BPdZyY4KBWTVJFais1h12f0nWwxWIZ-/s1600-h/textbox-con-multilineas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 235px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWdrM9SBa_Dt3DDBjVvAKTtKsVS68XjD99HSNxRjU1T8eEwM6F18CjN9KG9uDUqt4L4_jeMc0HNB2wUDemdnfDxCi_LB16ixFtm4uQDWUiuKWh9BPdZyY4KBWTVJFais1h12f0nWwxWIZ-/s400/textbox-con-multilineas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5449251766804411314" /></a><br />Una vez tengamos diseñado el formulario, solo nos quedará incluir el código asociado a los controles. En nuestro caso necesitaremos los tres códigos siguientes. El primero de ellos, corresponde a lo que tiene que suceder al activarse el formulario:<br /><table class="tablavba"><tr><td>Private Sub UserForm_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'al activarse sl formulario, añadimos<br />'las opciones del desplegable</span><br />ComboBox1.AddItem "SI"<br />ComboBox1.AddItem "NO"<br /><span style="color:#009900;">'bloqueamos por defecto el TextBox2,<br />'si no se ha seleccionado en el desplegable</span><br />TextBox1.Enabled = False<br />End Sub<br /></td></tr><br /></table><br />Como veis, en el código anterior, estamos añadiendo dos elementos (ítems) al ComboBox, y que son las respuestas que el usuario puede seleccionar en el Combo, un SI y un NO. Además, al activarse el formulario, también se deshabilita el TextBox1.<br /><br />El siguiente código que necesitaremos será el que corresponde al ComboBox, y que se ejecutará al seleccionar alguno de los ítems del desplegable:<br /><table class="tablavba"><tr><td>Private Sub ComboBox1_Change()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'activamos o desactivamos el TextBox1<br />'dependiendo de la respuesta del desplegable</span><br />If ComboBox1.ListIndex = 0 Then<br /> <span style="color:#009900;">'si se elige SI habilitamos el TextBox1<br /> '(el primer valor es cero), lo activamos</span><br /> TextBox1.Enabled = True<br />Else<br /> <span style="color:#009900;">'en caso contrario, si se elige NO habilitar<br /> 'el TexBox1, entonces lo desactivamos</span><br /> TextBox1 = ""<br /> TextBox1.Enabled = False<br />End If<br />End Sub<br /></td></tr><br /></table><br />Como veis, se trata del código asociado al ComboBox, de tal manera que si el usuario elige el primer elemento del ComboBox (el ListIndex = 0, porque comienza a numerarse por 0), entonces se habilita el TextBox1 con esa línea donde pone <strong>TextBox1.Enabled = True</strong><br /><br />En caso contrario, si se selecciona el segundo elemento del desplegable (o el 3º, o el 4, o el n, si lo hubiera), eliminaremos el contenido del TextBox1, y además lo deshabilitaremos.<br /><br />Por último, el tercer código es simplemente para descargar de memoria el formulario, al pulsar sobre el CommandButton:<br /><table class="tablavba"><tr><td>Private Sub CommandButton1_Click()<br /><span style="color:#009900;">'Descargamos el formulario de memoria</span><br />Unload Me<br />End Sub<br /></td></tr><br /></table><br />Esos tres códigos, como ya sabéis, deben ir incluidos dentro del UserForm. El código que a continuación os muestro es el que lanza el formulario, y que podemos asociar a un botón. Este código debe ir en un módulo:<br /><table class="tablavba"><tr><td>Sub lanzar_userform()<br /><span style="color:#009900;">'Lanzamos el UserForm1</span><br />UserForm1.Show<br />End Sub<br /></td></tr><br /></table><br />Como veis es una muy técnica sencilla, y muy útil, que le dará un aspecto más profesional a nuestros formularios:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfC8N8QCov0nAG76TfCj0YkZWReFZsNyfCsuzMu5txWCqZinzb-Z_ysFHL3Ug78unbrbz3c8M7JmvfhKFSfIDSg3CgpV6wxy7vXYzEKTOwt15qr9bsUdrzfaIAfM6XH2GOhajtlIGUG6dH/s1600-h/habilitar-deshabilitar-controles.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 306px; height: 270px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfC8N8QCov0nAG76TfCj0YkZWReFZsNyfCsuzMu5txWCqZinzb-Z_ysFHL3Ug78unbrbz3c8M7JmvfhKFSfIDSg3CgpV6wxy7vXYzEKTOwt15qr9bsUdrzfaIAfM6XH2GOhajtlIGUG6dH/s400/habilitar-deshabilitar-controles.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5449254470999690482" /></a><br />Desde aquí podéis <a href="http://www.mediafire.com/?mj6jyspyurxyrwr" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com7tag:blogger.com,1999:blog-7983188466168395484.post-22335967922414257252010-03-01T11:25:00.007+01:002012-06-30T20:51:53.378+02:00La hoja de cálculoQuizás a estas alturas, y después de haber cumplido dos años publicando en el blog sobre las virtudes la hoja de cálculo Excel, plantearse una pregunta del tipo "<strong>¿Qué es una hoja de cálculo?</strong>", puede parecer fuera de lugar. Pero no, no creo que lo esté, precisamente porque pocas veces se ha intentado dar respuesta a preguntas tan básicas como esta.<br /><br />Como son muchos los usuarios que llegan a este blog de Excel, buscando información sobre la <i>hoja de cálculo</i>, vamos a dar unas pinceladas sin entrar en excesivos tecnicismos, intentando explicar <strong>para qué sirve una hoja de cálculo</strong>, o incluso <strong>qué es una hoja de cálculo</strong>.<br /><br />Lo primero que tenemos que decir, es que si utilizas un ordenador hoy en día, ya sea para tu trabajo o incluso para tu ocio, se hace imprescindible el uso de determinados programas, y sin los cuales es muy difícil poder decir que somos usuarios de las herramientas informáticas.<br /><br />No es difícil encontrarse hoy en día, gente que domina el uso de las redes sociales, los gadgets electrónicos del tipo de los iphones, los smatphones, las pdas, etc., los programas de retoque fotográfico como Photoshop o Paint Shop Pro, la edición de video digital, los juegos online multijugador, y mil cosas más, pero en cambio, no saben hacer un sencillo presupuesto de ingresos y gastos del mes, con el programa más adecuado para ello.<br /><br />La <strong>hoja de cálculo</strong> forma parte de ese grupo de programas que no debería faltar nunca en cualquier ordenador, ya sea del ordenador de nuestro trabajo, o del ordenador de nuestra casa. La hoja de cálculo, junto con el <strong>procesador de textos</strong>, son -o deberían ser- básicos para cualquier usuario de la informática. Si sabes encender un ordenador, pulsando el botón on/off, deberías tener las nociones mínimas para poder escribir una carta con un procesador de textos, o para hacer unas sumas y unas restas, con una hoja de cálculo. Estos dos tipos de herramientas (la hoja de cálculo y el procesador de textos), son básicos en cualquier paquete ofimático (un paquete de programas, o una suite de programas, básico para su uso en oficinas y despachos).<br /><br /><br /><br /><h3>¿Qué es una hoja de cálculo?</h3><br /><br />Una hoja de cálculo, es un documento informático formado por filas (horizontales) y columnas (verticales), donde cada intersección entre ambas (entre una fila y una columna), recibe el nombre de <strong>celda</strong> (un grupo de celdas, recibe el nombre de <strong>rango</strong>). Hacer referencia a cada celda, es tan fácil como jugar al juego de la "guerra de barcos", pues cada celda tiene unas coordenadas. De la misma forma a como jugamos a la guerra de barcos, cuando damos unas coordenadas del tipo A4, o B6, y decimos que estamos tocados, o hundidos, lo mismo podemos hacer, para referirnos a una celda, pues además esta intersección entre columna y fila, nos aparece resaltada. Podemos averiguarlo, haciendo referencia a la columna, que está formada por letras, y a la fila, que está formada por números. De tal forma, por ejemplo, podemos saber que la celda B6 nos está haciendo referencia a la segunda columna (la columna B, pues están por orden alfabético: A, B, C, D, etc...) y a la sexta fila.<br /><br />Este es el aspecto general de una hoja de cálculo (concretamente una hoja de cálculo de Excel), donde no tenemos ningún dato escrito:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJTXdVtDDSQWcPq14Z4ei2BisUhNMljwMcaABpbMdcBgs6TYVHZCJVEwJ-eEPBgx3Yf_-UJTz2ms3Ku5g_Ul3A1dHZJMg6Z0sILLAbJu7Mit7yum8SoInwt1D9csTu29FjjA9GgWSTPss/s1600-h/hoja-de-calculo.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443602496888717074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJTXdVtDDSQWcPq14Z4ei2BisUhNMljwMcaABpbMdcBgs6TYVHZCJVEwJ-eEPBgx3Yf_-UJTz2ms3Ku5g_Ul3A1dHZJMg6Z0sILLAbJu7Mit7yum8SoInwt1D9csTu29FjjA9GgWSTPss/s400/hoja-de-calculo.gif" /></a><br />En esta otra pantalla, podemos ver que estamos situados en la celda B6, pues se muestra resaltada tanto la celda, como la referencia a la columna y a la fila que forman esa intersección:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNF_J2nkMjU_OYmgepbqN9s3cRERKu24zf_boedKa9hdy66zki57DbPsTGaEjE7Ra3pD287KTYHHwX4fsrOcnyeppIbVmqavWE2cK0XhbxYdEn-r8_cT0n6x8HQtwIvppi9gydv5W0TAPg/s1600-h/hoja-de-calculo-y-celda.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443602501117034466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNF_J2nkMjU_OYmgepbqN9s3cRERKu24zf_boedKa9hdy66zki57DbPsTGaEjE7Ra3pD287KTYHHwX4fsrOcnyeppIbVmqavWE2cK0XhbxYdEn-r8_cT0n6x8HQtwIvppi9gydv5W0TAPg/s400/hoja-de-calculo-y-celda.gif" /></a><br />Desplazarnos de una celda a otra, es tan sencillo como colocar el cursor en la celda deseada. Nos situamos con el puntero del ratón en la intersección de la columna y la celda donde queramos situarnos, y pulsamos el botón izquierdo del ratón. Tan sencillo como eso, para situarnos en esa nueva celda o esa nueva ubicación, dentro de la hoja de cálculo.<br /><br />Las hojas de cálculo están integradas en lo que se denominan libros (libros de cálculo), de tal forma que en cada libro podemos tener desde una hoja de cálculo, hasta tantas como nos admita la aplicación que estamos utilizando. Por ejemplo, si ampliamos la imagen anterior, veremos que en la parte inferior de la misma, aparecen 3 pestañas, y que son cada una de las hojas que conforman el libro. Como mínimo, un libro debe contener una hoja, es decir, una pestaña, y se les puede cambiar el nombre que tienen por defecto (Hoja1, Hoja2, Hoja3, etc.).<br /><br /><br /><br /><h3>¿Para qué sirve una hoja de cálculo?</h3><br /><br />La hoja de cálculo es una herramienta informática, que nos ahorra muchísimo trabajo diario a todos aquellos que trabajamos habitualmente con números, cifras, y datos. Una hoja de cálculo nos puede servir para elaborar un presupuesto, para hacer facturas, para calcular las cuotas de un préstamo, para hacer un balance y una cuenta de resultados, o para llevar el control de notas de unos alumnos, por poner unos cuantos ejemplos. Todo aquello que sea cuantificable, y valorable económicamente, puede ser tratado, medido, ordenado y controlado, mediante una hoja de cálculo.<br /><br />Un ejemplo sencillo de la utilidad de la hoja de cálculo, podría ser la elaboración de un presupuesto mensual, como el que podemos ver en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNDgCvRWMOAlH2uxaUq7CwE9m5Ibb5BiWqw9sgHO0CF14zjdnxYt3zUwSLYzK_B04d0CsHOBOYua0yaxsebCWH7J_zW9vEPykRB6AI-C4X7hig5-lBu8IdqzWx48yEeaLS2lqtQuOCyiS2/s1600-h/hoja-de-calculo-fragmento.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 282px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443603924061434578" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNDgCvRWMOAlH2uxaUq7CwE9m5Ibb5BiWqw9sgHO0CF14zjdnxYt3zUwSLYzK_B04d0CsHOBOYua0yaxsebCWH7J_zW9vEPykRB6AI-C4X7hig5-lBu8IdqzWx48yEeaLS2lqtQuOCyiS2/s400/hoja-de-calculo-fragmento.gif" /></a><br /><br />Como podéis ver, se trata de un fragmento de una hoja de cálculo, donde solo he incluido unas pocas columnas y filas, para que lo veáis mejor. Si os fijáis, también podemos ver en esa imagen, que se pueden ampliar las columnas, para hacerlas más anchas, y ajustarlas al contenido que tengamos. También os podéis fijar que le podemos dar color a las celdas, pero lo más importante, y la verdadera utilidad de la hoja de cálculo, viene ahora...¿Qué pasaría si nos subiese la hipoteca o el alquiler de 820 euros mensuales, a 880 euros?. Si esta operación la hiciésemos sobre un papel, si ayuda de un ordenador, deberíamos hacer un par de operaciones. La primera de ellas, sería saber cuánto nos ha subido la hipoteca o el alquiler (60 euros = 880 euros – 820 euros), y segundo, sería restar al saldo neto del mes (el ahorro), esos 60 euros extras de aumento de la hipoteca o alquiler, con lo que nos quedaría un ahorro mensual, de 20 euros en lugar de 80 (20 euros = 80 euros – 60 euros).<br /><br />Si os fijáis bien, veréis que la columna C está resaltada, y la fila 14 también, con lo que la intersección entre ambas, es decir, la celda C14, está remarcada, para indicarnos que estamos situados sobre ella. Si os fijáis, precisamente arriba a la izquierda de esa imagen anterior, se ve precisamente la celda donde estamos (C14), y a la derecha, se nos muestra el contenido de esa celda. En nuestro caso pone =C5-C6. Sin saber demasiado de fórmulas, ya nos estamos haciendo una idea de lo que hay en C14, y no es otra cosa que una resta entre lo que hay en C5 y lo que hay en C6, que son los ingresos y los gastos mensuales.<br /><br />Una hoja de cálculo nos va a servir para cambiar el dato de una celda cualquiera, y que se nos recalcule todo de forma automática, sin hacer absolutamente nada. Lo primero que tenemos que saber, y siguiendo con el ejemplo anterior, es que en la celda C6 tenemos una suma de todos los gastos que hay justo debajo. Si cambiamos una de esas cifras (por ejemplo el de la hipoteca o alquiler, que aparece en la celda C7), y en lugar de tener un gasto de 820 euros, tenemos un gasto mensual de 880 euros, ocurrirán dos cosas, la primera de ellas es que se recalculará la suma de gastos, y ahora tendremos 60 euros más (1.480 euros de gasto total), y segundo, que el ahorro se reducirá en esos 60 euros de aumento de hipoteca o alquiler, pasando de 80 euros de saldo neto, a solo 20 euros. Miradlo en esa imagen que os adjunto:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XhaYQ0UCsqHPtnlO8JLNL4Dn0oWGHLeKpGscn5YTV9LcNm9rFCzoTeH3trBoWP5dH-mUqt25PfUOABghMC1TYs8MrZnuKTLopyzYW0J8XW2SH0vG3tO2by3UGrFm9n1Un39u2CV3g6j5/s1600-h/hoja-de-calculo-presupuesto.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 282px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443603928206152594" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XhaYQ0UCsqHPtnlO8JLNL4Dn0oWGHLeKpGscn5YTV9LcNm9rFCzoTeH3trBoWP5dH-mUqt25PfUOABghMC1TYs8MrZnuKTLopyzYW0J8XW2SH0vG3tO2by3UGrFm9n1Un39u2CV3g6j5/s400/hoja-de-calculo-presupuesto.gif" /></a><br />Como podéis ver, el ahorro de tiempo es considerable, ya que con tan solo cambiar un dato, la suma de gastos y el saldo neto se recalculan automáticamente, pues tiene fórmulas (sumas y restas) que evalúan esos nuevos datos que hemos cambiado, para mostrar el nuevo resultado. Por tanto, la utilidad de la hoja de cálculo es más que evidente, tanto más, cuanto más complejos sean los cálculos y las operaciones, con el consiguiente ahorro de tiempo que ello comporta.<br /><br />Este es un sencillo ejemplo de la utilidad de las <strong>hojas de cálculo</strong>, pero podemos hacer de todo lo que se nos ocurra, y que conlleve el tratamiento de datos numéricos.<br /><br /><br /><br /><h3>¿Qué es Excel?</h3><br /><br />Pues Excel es un programa con el que podemos hacer hojas de cálculo. Igual que con Photoshop podemos retocar imágenes, y con Internet Explorer podemos navegar por Internet, con Excel podemos hacer hojas de cálculo. De la misma forma que Photohop no es el único programa para retoque de fotos o imágenes, ni Internet Explorer es el único navegador para acceder a Internet, Excel tampoco es el único programa para hacer hojas de cálculo.<br /><br />Excel es un producto del fabricante Microsoft (el mismo que hace Windows XP, Windows Vista, o Windows 7, por ejemplo), y se suministra dentro del paquete Microsoft Office, en el que incluye también, entre otras aplicaciones Microsoft Word, que es un programa para tratamiento de textos (un programa para hacer escritos, cartas, informes, etc.).<br /><br />Microsoft Office, y por tanto el programa Excel que incluye, es un programa de pago, pero aún así, se trata del software para elaborar hojas de cálculo más extendido del mercado, y toda una referencia para su competencia, pues en mi opinión, es la mejor herramienta de este tipo que podemos encontrar en el mercado.<br /><br /><br /><br /><h3>¿Qué otros programas hay para hacer hojas de cálculo, aparte de Excel?</h3><br /><br />Pues aparte de Excel, podemos recurrir a otros interesantes programas para el tratamiento de hojas de cálculo. Los más extendidos, aparte de Excel, son los siguientes:<br /><br /><br /><ul><br /><li><strong>Lotus 123</strong>, propiedad de Lotus Development Corporation, adquirida por IBM. Fue una de las aplicaciones para hoja de cálculo, más famosas y extendidas en la década de los años 80, pero Excel acabaría con su hegemonía en la década siguiente:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC_7LunPYtdy0pAn-bHl1kn2w_92AkY6b6uiNnrVq4VoybI3bmSs8P5NtNmYQkK6OO2uqjbVC_TheFjIS5fo1BZ8qcpSRCCLC9l1WjKYFFyUXmyANhjlmM8UyjkuBYwZzA8pB9YKyxoadg/s1600-h/hoja-de-calculo-Lotus-123.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443604481950394242" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC_7LunPYtdy0pAn-bHl1kn2w_92AkY6b6uiNnrVq4VoybI3bmSs8P5NtNmYQkK6OO2uqjbVC_TheFjIS5fo1BZ8qcpSRCCLC9l1WjKYFFyUXmyANhjlmM8UyjkuBYwZzA8pB9YKyxoadg/s400/hoja-de-calculo-Lotus-123.gif" /></a></li><br /><br /><li><strong>Gnumeric</strong>, desarrollado para Gnome, dentro de lo que se denomina software libre, aunque también existe una versión para Windows:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpDapHMPgMdOSuVeWu3YDq1ImFK3c8iTdvY3TJ9wn9cDtMP4NRZws-z1ykH18mO5BJVsp8gV8uEcQ6FwwCwgR9Hy8B0YJQ4D55VTGJ7x-1RqoRFviBjLVinG9lE4d_BsaVvBGJCifUTyHh/s1600-h/hoja-de-calculo-Gnumeric.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443604498381553858" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpDapHMPgMdOSuVeWu3YDq1ImFK3c8iTdvY3TJ9wn9cDtMP4NRZws-z1ykH18mO5BJVsp8gV8uEcQ6FwwCwgR9Hy8B0YJQ4D55VTGJ7x-1RqoRFviBjLVinG9lE4d_BsaVvBGJCifUTyHh/s400/hoja-de-calculo-Gnumeric.gif" /></a></li><br /><br /><li><strong>Kspread</strong>, desarrollado también como software libre, para el proyecto KDE, e incorporado dentro de la suite ofimática KOffice:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVxXXZvvDFkZZ_sAfMYjljKnzSpITWkMRTQmF9cv-t6EDJOEhUF7y4nODKu3t1ta_popt92av6aKY1JVqIDauHsxHfVtwuK3YkTDt6WH1o0Tms-sOZKcpxcUy05hyphenhyphen950cIuiomkb-AbGQM/s1600-h/hoja-de-calculo-Kspread.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 278px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443604506147141842" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVxXXZvvDFkZZ_sAfMYjljKnzSpITWkMRTQmF9cv-t6EDJOEhUF7y4nODKu3t1ta_popt92av6aKY1JVqIDauHsxHfVtwuK3YkTDt6WH1o0Tms-sOZKcpxcUy05hyphenhyphen950cIuiomkb-AbGQM/s400/hoja-de-calculo-Kspread.gif" /></a></li><br /><br /><li><strong>Quatro Pro</strong>, desarrollado originalmente por Borland, ahora propiedad de Corel Corporation. Esta aplicación se suministra dentro del paquete Corel WordPerfect Office. La principal funcionalidad de esta aplicación es que ya desde su versión 9 (allá por 1999), permitía trabajar con hojas de cálculo de hasta 1.000.000 de filas, mientras que Excel tenía limitado el número de filas en 65.536 filas, hasta su versión Excel 2007:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY34hSpLEIJMTxkVzw6rLDokkMJrxPu5xesXeIt2Jhwfei6cL9Th1q8GV-8phYXorCMWFd8qmPmhsoKaXrXG6Z4ukS14FKnewnzQq86KS-tjHmgddx8lPgP2rz7pgnpdvLr_FysRTigJlq/s1600-h/hoja-de-calculo-Quattro-Pro.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443605189888927106" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY34hSpLEIJMTxkVzw6rLDokkMJrxPu5xesXeIt2Jhwfei6cL9Th1q8GV-8phYXorCMWFd8qmPmhsoKaXrXG6Z4ukS14FKnewnzQq86KS-tjHmgddx8lPgP2rz7pgnpdvLr_FysRTigJlq/s400/hoja-de-calculo-Quattro-Pro.gif" /></a></li><br /><br /><li><strong>Calc</strong>, del paquete StarOffice, de Sun Microsystems, y base de la suite ofimática de código libre OpenOffice:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc42LeCCz4fGy0tmOkB9by1gABBZjroPG3huKALkjXf2oSAgs-tJBkOT22Ddkw18orpRdAYJSk75XoRrlCQ3aZH9Fx1gdy1cLemyx-Geh-Cy_7e3Kc9mFe16Y_ngjxZ1xYDprh_45dTKvq/s1600-h/hoja-de-calculo-Calc-StarOffice.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 306px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443604495116934722" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc42LeCCz4fGy0tmOkB9by1gABBZjroPG3huKALkjXf2oSAgs-tJBkOT22Ddkw18orpRdAYJSk75XoRrlCQ3aZH9Fx1gdy1cLemyx-Geh-Cy_7e3Kc9mFe16Y_ngjxZ1xYDprh_45dTKvq/s400/hoja-de-calculo-Calc-StarOffice.gif" /></a></li><br /><br /><li><strong>Calc</strong>, que forma parte del paquete OpenOffice, software de código libre. Se trata del único software para hojas de cálculo que actualmente puede plantarle algo de cara a Excel (más que por la potencia del mismo, por lo extendido que está entre los usuarios), aunque en lo personal, creo que todavía le queda mucho para poder hacerle sombra a la todopoderosa hoja de cálculo de Microsoft:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJd8phvJWLJ0yOpFf_1D2oNoXyHdcRF5p8nBjcP-fUsho7BKNDPsJYqsC-9nO4j4qN_br3zzbK_hL53PxfuNFkolUH2Yk3VDFhY8SWccGxM70ivb93c-_fPH1LxwCiJK8gXr9ZUu1kzt7s/s1600-h/hoja-de-calculo-Calc-OpenOffice.gif"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 348px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5443604485031836466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJd8phvJWLJ0yOpFf_1D2oNoXyHdcRF5p8nBjcP-fUsho7BKNDPsJYqsC-9nO4j4qN_br3zzbK_hL53PxfuNFkolUH2Yk3VDFhY8SWccGxM70ivb93c-_fPH1LxwCiJK8gXr9ZUu1kzt7s/s400/hoja-de-calculo-Calc-OpenOffice.gif" /></a></li></ul><br />Aparte de esas aplicaciones para hoja de cálculo que hemos mencionado, y que son las más destacables, en el mercado podemos encontrar infinidad de programas, que nos van a ser igualmente útiles, incluyendo el software para hojas de cálculo online como el que integra <a title="Google Docs" href="http://www.docs.google.com/" target="_blank">Google Docs</a>.<br /><br /><br /><br /><h3>Macros</h3><br /><br />Cuando en el uso avanzado de hojas de cálculo, nos vemos ante una tarea repetitiva o compleja, donde las funciones propias que incorpora el programa en sí, no son suficientes para resolver el problema o la tarea, es cuando entra en escena la programación mediante <strong>macros</strong>. A través de los macros, podemos realizar tareas repetitivas o ciertamente complejas, añadiendo líneas de programación. No todas las aplicaciones para hojas de cálculo admiten esta programación mediante macros, pero Excel concretamente sí, y de una forma ciertamente potente.<br /><br />Algunos ejemplos del uso de macros en Excel, los tenéis en este mismo blog de Excel, por ejemplo con esta aplicación para <a title="Calcular las cuotas de una hipoteca" href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html">calcular las cuotas de una hipoteca</a>, o esta otra para <a title="Introducir datos en una hoja de cálculo, utilizando formularios" href="http://www.hojasdecalculoexcel.com/2009/11/introducir-datos-utilizando-un.html">introducir datos en una hoja de cálculo, utilizando formularios</a>.<br /><br />Las macros pueden ser muy sencillas o extremadamente complejas, dependiendo de nuestras necesidades, y del problema que pretendamos resolver. Si el primero de los macros de ejemplo del párrafo anterior tiene cierta complejidad, este otro en el que podemos <a title="Contar las hojas de un libro" href="http://www.hojasdecalculoexcel.com/2008/02/contar-las-hojas-de-un-libro.html">contar las hojas de un libro</a>, sería sumamente sencillo.<br /><br />Como veis, la hoja de cálculo es una herramienta imprescindible en cualquier ordenador de hoy en día, se llame Excel, Calc, Quattro Pro, o incluso la hoja de cálculo que Google a través de Google Docs, pone a disposición de todos los usuarios, de forma gratuita.<strong></strong>El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com22tag:blogger.com,1999:blog-7983188466168395484.post-43606228481598774312010-02-23T01:00:00.010+01:002012-06-30T20:52:48.918+02:00Calcular la TAELa TAE es la tasa anual equivalente, o también llamada, tasa anual efectiva. Lo que realmente nos interesa, es saber que significa eso, y como se calcula.<br /><br />Antes de entrar en materia, comentaros que os dejo una mini aplicación que os permitirá calcular la TAE de una operación financiera, con intereses pagaderos al vencimiento. Tan solo tendréis que informar el tipo de interés nominal, y el plazo de pago de los intereses:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSzUVBmK_auzFVU7RcxqUXN1xFRKR71_0JHrv4F9PB0X_xxzCJMF3r3l7ckKnZQfRRzslr0HdN-elAUrf24_OxsrcvhPkQdzRtEiV-E-I8Gxyyy1_C8A2G7RzqH8yKpxQGW9uHFveOgXYo/s1600-h/tae-tasa-anual-efectiva-desplegable.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 247px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSzUVBmK_auzFVU7RcxqUXN1xFRKR71_0JHrv4F9PB0X_xxzCJMF3r3l7ckKnZQfRRzslr0HdN-elAUrf24_OxsrcvhPkQdzRtEiV-E-I8Gxyyy1_C8A2G7RzqH8yKpxQGW9uHFveOgXYo/s400/tae-tasa-anual-efectiva-desplegable.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5441024009574427394" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB49mTNh1OuCTO6jY-eaYGMP9-UK5cuy1XMsmv3qt_zQYfIFPi9rbjwLVcaQBZPzfI6dZSCHremewHocf9ESI_6Cm9Jw6QbvN5Cutx8OuGg6-lkBzpF8Rt4OUs8-ivNNU9wBlAB3To1OGA/s1600-h/tae-tasa-anual-equivalente.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 177px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB49mTNh1OuCTO6jY-eaYGMP9-UK5cuy1XMsmv3qt_zQYfIFPi9rbjwLVcaQBZPzfI6dZSCHremewHocf9ESI_6Cm9Jw6QbvN5Cutx8OuGg6-lkBzpF8Rt4OUs8-ivNNU9wBlAB3To1OGA/s400/tae-tasa-anual-equivalente.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5441024013008961554" /></a><br />En un artículo anterior ya hablamos sobre el <a href="http://www.hojasdecalculoexcel.com/2009/01/solver-clculo-de-la-tir.html" title="Cálculo de la TIR">cálculo de la TIR</a> con Solver, así que gran parte de lo que aquí explicaremos, lo podéis ampliar con la información contenida allí, aunque en principio no será necesario. También podéis ver el uso de la TAE en una operación financiera como es el caso de un contrato de préstamo, pues en el artículo donde colgué la plantilla para el <a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html" title="Cálculo de préstamos">cálculo de préstamos</a>, está incorporada esta función.<br /><br />Vamos a explicar qué es la TAE con un sencillo ejemplo. Imaginemos que disponemos de 5.000 euros, y queremos invertirlos en un depósito a plazo fijo a un año, pero tenemos dos opciones:<br /><br /><ul><li>El Banco A nos ofrece un tipo de interés nominal del 7% anual, pagadero al vencimiento.</li><br /><li>El Banco B nos ofrece un tipo de interés nominal del 6,95% anual, pagadero mensualmente.</li></ul><br />Así a bote pronto, podemos pensar que la opción que nos plantea el Banco A, es más interesante, porque nos da 350 euros al cabo de ese año (5.000 x 0,07), mientras que el Banco B nos da solamente 347,50 euros (5.000 x 0,0695). Es decir, el Banco A nos da 2,50 euros más de intereses al año (350 – 347,50).<br /><br />Desde un punto de vista financiero, nuestro objetivo es siempre maximizar el beneficio procedente de una inversión, por lo que hay que analizar la rentabilidad efectiva de ambas operaciones que nos plantean los bancos, antes de decidirnos. Vamos a ver como analizar la rentabilidad efectiva, es decir, obtener la TAE de ambas operaciones.<br /><br />Si el Banco A nos paga los intereses al vencimiento, lo que está claro, es que solo podremos disponer de ellos a la finalización del contrato que hemos firmado con el banco, es decir, al vencimiento del depósito (al cabo de ese año). El Banco B en cambio, nos paga cada mes los intereses, por lo que podemos disponer de ellos mensualmente. Esto implica que podemos retirar esas cantidades (los intereses mensuales) para gastarlos en lo que queramos, o mejor aún, para invertirlos nuevamente. Es aquí donde entra en juego el concepto de la TAE, pues el propio concepto de la TAE para lleva implícito que vamos a reinvertir esos intereses.<br /><br />La opción del Banco A es muy clara, pues al cabo de un año, podremos retirar el capital inicialmente invertido (5.000 euros), más los intereses (350 euros). Es decir, al cabo de 1 año, dispondremos de 5.350 euros.<br /><br />En cambio la opción del Banco B tenemos que analizarla con más detenimiento, pues nos pagan intereses cada mes. Para saber que intereses mensuales obtendremos, tenemos dos opciones:<br /><br /><ul><li>Podemos coger el tipo de interés nominal anual, dividirlo entre los 12 meses, y aplicar ese tipo de interés a los 5.000 euros: 0,0695 / 12 x 5.000 = 28,9583 euros de intereses mensuales.</li><br /><li>O también podemos calcularlo, aplicando a los 5.000 euros, el tipo de interés que nos da el Banco B, y dividiendo esos intereses totales, por 12, porque los cobraremos mensualmente: 5.000 x 0,0695 / 12 = 28,9583 euros mensuales.</li></ul><br />Como habéis visto, ambas opciones para calcular los intereses mensuales son idénticas, porque matemáticamente son lo mismo.<br /><br />Pero... ¿qué pasaría si esos intereses de 28,9583 que cobraríamos también al cabo de un mes, y los invirtiéramos al mismo tipo de interés del 6,95%, durante los 11 meses que nos quedan hasta finalizar el contrato del depósito a plazo fijo?. Esta pregunta es básica, y es la que tendríamos que hacernos siempre, para comprender el auténtico significado de la TAE.<br /><br />Vamos a ver en una tabla de Excel, que pasaría, si los intereses que cobramos mensualmente con la opción del Banco B, los invertimos por el tiempo que reste hasta finalizar ese año, en el que recuperaríamos la inversión inicial de los 5.000 euros.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAnkQuWagHBPA-SACMQ7_12WxDYPaljk2-SxQZtuqb2qdxt4GA4Dx5_b3OPXCKpu37FzjePy1zJBgANuhi3Fvys9a6MY2lmZFQGn59KPPNeOCE1F9qlRuzVAquz0ZN3P4ghdff6bYeLqBV/s1600-h/tabla-tae.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 334px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAnkQuWagHBPA-SACMQ7_12WxDYPaljk2-SxQZtuqb2qdxt4GA4Dx5_b3OPXCKpu37FzjePy1zJBgANuhi3Fvys9a6MY2lmZFQGn59KPPNeOCE1F9qlRuzVAquz0ZN3P4ghdff6bYeLqBV/s400/tabla-tae.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5445227184430083170" /></a><br />La columna bajo el título de "Capital invertido" incluye los 5.000 euros invertidos inicialmente, más los intereses que nos van pagando cada mes, y que también se reinvierten por el periodo que resta hasta finalizar la imposición. Por ejemplo, la recuperación del capital, más los intereses que nos pagan el primer mes, los podemos reinvertir durante 11 meses. La recuperación del capital, más los intereses que nos pagan al cabo del segundo mes, los podemos reinvertir durante 10 meses, y así sucesivamente, hasta que al final, cuando cobramos los intereses del mes nº 12, ya no podemos reinvertir nada nuevamente, porque ha finalizado el plazo de tiempo por el que abrimos el depósito a plazo fijo.<br /><br />También podemos ilustrarlo con este otro ejemplo, donde más claramente se puede observar como reinvertimos los intereses:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ_G1tmF2VQ3AWyCuCbf2HNPrURMYiuYeehE6bTGuiEJmIZuaqWb37XD-JiAelHcanRney0CBLB72io8njh8w0hesbRY-oK2MvQJwYeRfj0qmR_YhbQqkMRgBS86wcTwhQwWPmZifxnQwZ/s1600/TAE-reinversion-de-intereses.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 259px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ_G1tmF2VQ3AWyCuCbf2HNPrURMYiuYeehE6bTGuiEJmIZuaqWb37XD-JiAelHcanRney0CBLB72io8njh8w0hesbRY-oK2MvQJwYeRfj0qmR_YhbQqkMRgBS86wcTwhQwWPmZifxnQwZ/s400/TAE-reinversion-de-intereses.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5527795084312162962" /></a><br />Como veis, hemos conseguido 347,50 euros de intereses con la opción del Banco B, y reinvirtiéndolos, nos darían 11,29 euros adicionales, es decir, obtendríamos un total de 358,79 euros, si optimizásemos la inversión (reinvirtiendo los intereses). También hemos calculado la TAE de la operación, que no es más que dividir los intereses totales que obtendríamos (358,79 euros), entre el capital invertido (5.000 euros), porque es a un año, lo que nos da una TAE del 7,1757%.<br /><br />Llegados a este punto, ya estamos en condiciones de saber que inversión es más rentable desde un punto de vista financiero (optimizando la inversión). El Banco A nos da unos intereses de 350 euros al año, mientras que con la opción del Banco B podemos obtener 358,79 euros.<br /><br />En el caso del Banco A, el tipo de interés nominal del 7%, es también la TAE, porque no podemos reinvertir los intereses, ya que los obtenemos al final, cuando finaliza el depósito a plazo fijo. En el caso del Banco B, el tipo de interés nominal es del 6,95%, pero la TAE es del 7,1757%, lo cual desde un punto de vista financiero, nos deja las cosas muy claras: el Banco B es la mejor opción.<br /><br />Como habéis visto, aunque aparentemente el Banco A inicialmente era la mejor opción, hemos demostrado que no es así, y que el Banco B nos ofrecía desde un punto de vista financiero, la mejor opción para maximizar nuestros beneficios (nuestros intereses).<br /><br />Para calcular la TAE de una operación financiera, os dejo una hoja de cálculo para descargar, que os simplificará mucho la tarea, pues tan solo tenéis que introducir el tipo de interés nominal anual, y los periodos de pago al año (pagos semestrales, pagos trimestrales, pagos mensuales, etc.). Es la plantilla de Excel cuyas imágenes podéis ver al principio de este artículo.<br /> <br />Desde aquí podéis <a href="http://www.mediafire.com/?7sbkb8s480gc9n5" rel="nofollow" target="_blank">descargar los dos ficheros de Excel</a>, comprimidos en formato zip, con los ejemplos que hemos visto en este artículo. En uno de ellos tenéis la tabla con el estudio de rentabilidad de la opción ofrecida por el Banco B (la tabla de la última imagen de este artículo), y en el otro fichero Excel tenéis la calculadora de la TAE.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com10tag:blogger.com,1999:blog-7983188466168395484.post-19691276499907337822010-02-08T11:09:00.007+01:002012-06-30T20:53:40.438+02:00Calcular la TIR de una inversión, para periodos irregularesCuando calculamos la TIR de una inversión, lo normal es que los flujos de caja estén todos referidos a unos mismos periodos de tiempo, es decir, que todos los momentos donde se producen los flujos guardan siempre la misma periodicidad. Por ejemplo, cuando calculamos la TIR de una inversión, lo normal es que los flujos sean siempre iguales, y si se trata de años, los flujos serán anuales, si se trata de meses, los flujos serán, y así sucesivamente.<br /><br />En el ejemplo siguiente podéis ver que hay una serie de periodos, y una serie de flujos. El primer periodo, corresponde al momento cero, es decir, al momento actual, o momento presente, y corresponde al desembolso inicial (como es la inversión inicial, es decir, un pago, debemos ponerlo en negativo, para distinguirlo de los cobros periódicos que recibiremos). Podemos ver que no nos interesan los periodos de tiempo (no sabemos a la vista de ese pantallazo, si se trata de meses, años, semestres, o cualquier otro periodo), porque se da por hecho que son todos iguales. En la fórmula que podéis ver en el pantallazo siguiente, podéis observar que hemos puesto un 5% como tipo de interés estimado, a partir del cual Excel obtendrá la TIR correcta, aunque si se omite, Excel parte de un tipo de interés del 10%, como interés inicial a partir del cual hará las estimaciones. La TIR obtenida es del 6,7075%, pero no decimos si se trata de una TIR anual, semestral, mensual, etc. ¿Por qué no lo decimos?. Pues porque esa TIR estará expresada en función del periodo. Es decir, si esos periodos 0, 1, 2, 3, 4, 5, y 6, son meses, es decir, pagos y cobros mensuales, la TIR será mensual, y si se trata de años (como es lo más habitual), pues la TIR será anual:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZ19XuXuxFDj334D_GLZ1uSPBiL-NvS0gJMwCYLn_prrMuYqX1-tTEMrzWfLWnhf4HWfhu3ymDSyNYY-5aAe8ubtYqfgAD19J99XtV3RYYn8orVC4LO4Brdmv2kv5PkByrP1irJUVjdSb/s1600-h/TIR.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZ19XuXuxFDj334D_GLZ1uSPBiL-NvS0gJMwCYLn_prrMuYqX1-tTEMrzWfLWnhf4HWfhu3ymDSyNYY-5aAe8ubtYqfgAD19J99XtV3RYYn8orVC4LO4Brdmv2kv5PkByrP1irJUVjdSb/s400/TIR.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5435812848690681810" /></a><br />Suponiendo que estamos hablando de la TIR anual, la imagen anterior, podemos hacerla más legible, de la siguiente forma, donde hemos añadido las fechas. Aparte, podéis observar que en la fórmula de la TIR, hemos omitido el tipo de interés inicial a partir del cual Excel hará la estimación de la TIR:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixNXgjS9cWlopxI_j_FP3Q-jADko0_pi1ElcY7_YhMSXjB7Cn5JhijKbfpWbcLpnbALcNya3QdhyphenhyphenS5O6F9CLE9duIaIUZ61Rvm8WwiRX3RW92wS-n12oNoje-Fy2iTUiXF9HNpJ9McXMse/s1600-h/TIR-fechas.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 173px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixNXgjS9cWlopxI_j_FP3Q-jADko0_pi1ElcY7_YhMSXjB7Cn5JhijKbfpWbcLpnbALcNya3QdhyphenhyphenS5O6F9CLE9duIaIUZ61Rvm8WwiRX3RW92wS-n12oNoje-Fy2iTUiXF9HNpJ9McXMse/s400/TIR-fechas.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5435813064628956498" /></a><br />Todo esto, junto con el cálculo del valor actual neto, ya lo habíamos explicado en un artículo donde precisamente hablábamos de cómo <a href="http://www.hojasdecalculoexcel.com/2009/05/calcular-la-tir-y-el-van.html" title="Calcular la TIR y el VAN">calcular la TIR y el VAN</a>. También habíamos visto como <a href="http://www.hojasdecalculoexcel.com/2009/01/solver-clculo-de-la-tir.html" title="Calcular la TIR con Solver">calcular la TIR con Solver</a> (una potente herramienta de Excel, para optimización).<br /><br />Ahora la cuestión es la siguiente: ¿Qué pasaría si en lugar de tener los periodos uniformes, se tratase de periodos con diferente periodicidad?. Vamos a suponer que en lugar de recibir esos flujos de cada el día 10 de cada año (ver imagen anterior), se reciben en las siguientes fechas:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9JB-UH55NkgQQ0j6B9-gGHjNhSB8gtqwZEHvjv4CiYAxtCuB5Z1F7TTpoOP1gJlrNClqHDqos54cR8IOtGzJ7hGcsOj7N90y-QQWTJ6OvmlMNtaoh65qSyLVx3VXHjeXFjKTu5EMAUoQv/s1600-h/TIR-periodos-no-uniformes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 164px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9JB-UH55NkgQQ0j6B9-gGHjNhSB8gtqwZEHvjv4CiYAxtCuB5Z1F7TTpoOP1gJlrNClqHDqos54cR8IOtGzJ7hGcsOj7N90y-QQWTJ6OvmlMNtaoh65qSyLVx3VXHjeXFjKTu5EMAUoQv/s400/TIR-periodos-no-uniformes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5435813710945499378" /></a><br />¿Sería correcto utilizar la función TIR, para evaluar la tasa interna de rentabilidad de esta inversión, teniendo en cuenta que los periodos no son homogéneos?. Efectivamente, no. Para ello, deberemos utilizar la función TIR.NO.PER, de la siguiente forma:<br /><table class="tablaformula"><tr><td>=TIR.NO.PER(flujos de caja; fechas; tipo de interés estimado)<br /></td></tr><br /></table><br />Como ocurre con la función TIR, podemos omitir el último argumento, donde se nos solitita el tipo de interés a partir del cual Excel hará las estimaciones. Si lo omitimos, Excel presupone que es el 10%.<br /><br />En nuestro ejemplo anterior, donde hay periodos que no guardan la misma periodicidad, deberemos introducir esta fórmula para calcular la TIR:<br /><table class="tablaformula"><tr><td>=TIR.NO.PER(D6:D12;C6:C12;5%)<br /></td></tr><br /></table><br />El resultado sería que nuestra TIR es de 10,8779%, como podéis ver en la siguiente imagen:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhherrmkGQiPpyqTflMcvVY3kh5l5B27wgqRiowPS_i7Dh6LPfmEtGhSkoxK_NLr6KSzpa6hy-5KnsxK4WmEcxc9rrZdsiC3pi_4X202ZHi1Su-G7xVb3SOfjaZl1eVAXI28aA5Tpr7xxLM/s1600-h/TIR-calculada-para-periodos-no-uniformes.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 174px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhherrmkGQiPpyqTflMcvVY3kh5l5B27wgqRiowPS_i7Dh6LPfmEtGhSkoxK_NLr6KSzpa6hy-5KnsxK4WmEcxc9rrZdsiC3pi_4X202ZHi1Su-G7xVb3SOfjaZl1eVAXI28aA5Tpr7xxLM/s400/TIR-calculada-para-periodos-no-uniformes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5435814534398986370" /></a><br />Si os fijáis en los dos ejemplos que ilustran este artículo, veréis que los flujos son los mismos (idénticas cantidades, tanto en pagos como en cobros), pero no son los mismos los periodos donde se producen. Es por ello, que utilizar correctamente las funciones para calcular la TIR, es básico para hacer correctamente las cosas. Solo hay que controlar si los periodos son uniformes o no, para elegir la función TIR o la función TIR.NO.PER.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com3tag:blogger.com,1999:blog-7983188466168395484.post-24548367733833295782010-01-19T00:05:00.026+01:002012-06-30T20:57:02.248+02:00Préstamos y cálculo de hipotecasAntes de entrar en materia, anticiparos que este artículo que estáis comenzando a leer, ocupa ni más ni menos que quince páginas en DIN A-4 (este primer párrafo lo he redactado, una vez tenía escrito todo lo demás), así que espero que tengáis paciencia, tiempo, y un poco de voluntad.<br /><br />Haré una mínima introducción, para comentaros que ha pasado algo más de un mes desde la última entrada que publiqué en el blog de <a href="http://www.hojasdecalculoexcel.com" title="Excel">Excel</a>, y ya era hora de ofreceros a todos los usuarios que seguís fielmente estos artículos, una nueva entrega. En esta ocasión, tocaremos un tema de carácter económico y financiero, que no solo va a serle útil a quien se dedique a estos temas, sino que va a serle útil a todo el mundo. ¿Quién no tiene una <strong>hipoteca</strong> hoy en día?. ¿Quien no paga un <strong>préstamo</strong> bancario?. ¿Quién no tiene una deuda porque ha comprado algo a plazos?. Casi todos nos encontramos o nos podemos encontrar en cualquier momento de nuestra vida, en una situación así, ¿verdad?. Pues para todos vosotros, está especialmente indicado este artículo.<br /><br />A aquellos usuarios a los que no les interesen los macros, y quieran descargarse el libro de Excel para calcular préstamos, e hipotecas, o simplemente quieran hacer simulaciones de préstamos (esta aplicación que os presento, también es un <strong>simulador de préstamos</strong>, o lo que es lo mismo, una calculadora de préstamos avanzada), pueden saltarse todo lo que explicaré a continuación, e ir directamente al final del artículo, donde encontrarán un enlace para <a href="http://www.hojasdecalculoexcel.com/2010/01/prestamos-y-calculo-de-hipotecas.html#descarga-prestamos-hipotecas" title="Descargar la aplicación para calcular préstamos e hipotecas">descargar el simulador de préstamos</a>, es decir, el fichero de Excel, con todo lo que veremos aquí. Y a aquellos usuarios que copian y pegan los artículos de este blog, en sus webs o blogs, sin mencionar la fuente, recordarles que la fuente original es http://www.hojasdecalculoexcel.com<br /><br />Antes de seguir, quiero comentaros que la metodología que se utiliza para el cálculo de préstamos, sigue el método francés. Los que no sepan que es esto del método francés, simplemente daré un par de pinceladas. El cálculo de préstamos según el método francés, se caracteriza por lo siguiente:<br /><br /><ul><li>Los intereses se devengan al vencimiento de cada cuota.</li><br /><li>El capital que se amortiza va creciendo en cada cuota, es decir, el principal del préstamo que se va pagando, es cada vez más alto, a medida que va transcurriendo el tiempo, y a medida que vamos liquidando las cuotas.</li><br /><li>Los intereses por el contrario, van disminuyendo y son menores en cada cuota.</li><br /><li>Las cuotas totales que se pagan, son todas del mismo importe. El capital que se va pagando aumenta, y los intereses disminuyen, pero las cuotas son siempre iguales.</li></ul><br />Es importante reseñar que no todas las operaciones financieras se rigen por el método francés, como por ejemplo las operaciones de arrendamiento financiero o leasing, que siguen otra metodología distinta, pero a pesar de eso, también es importante indicar que el método francés es el más extendido para el cálculo de la mayoría de operaciones de financiación.<br /><br />Ahora sí, vamos a entrar en materia. Para calcular préstamos con esta aplicación en Excel, utilizaremos un formulario para la entrada de datos. Antes de eso, crearemos otro formulario donde informaremos de las características del préstamo francés.<br /><br />Los dos formularios que utilizaremos serán estos:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKIvNA3-D3Vfb7ZdeNthE9MiFFGh7qAxVKzpxB1iIToEsXW4YidjYcu94AOIvqS9XfIoqxeQyIen2yVZrFeLdtgOSirmZzPntjpbwDluxkamz7onynj43zjkz9vTME8WuTwaiLCvPfOjEZ/s1600-h/calcular-prestamos-formulario-informando-del-metodo-frances.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKIvNA3-D3Vfb7ZdeNthE9MiFFGh7qAxVKzpxB1iIToEsXW4YidjYcu94AOIvqS9XfIoqxeQyIen2yVZrFeLdtgOSirmZzPntjpbwDluxkamz7onynj43zjkz9vTME8WuTwaiLCvPfOjEZ/s400/calcular-prestamos-formulario-informando-del-metodo-frances.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5428045084916212898" /></a><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKLNQlwxml0UB0hs4vSTL7cQhkzFwvWvqvxZGEX1NLoCFJTPWW-C0x4pqfnKbFHBQuHfrNocyfTBvZ-sKyfZFJTlcCMy_PCky3BGzrpDrkv2uDK2pnsW645qiIr2nmP_LVPWSKcn0JweU0/s1600-h/calcular-prestamos-formulario.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKLNQlwxml0UB0hs4vSTL7cQhkzFwvWvqvxZGEX1NLoCFJTPWW-C0x4pqfnKbFHBQuHfrNocyfTBvZ-sKyfZFJTlcCMy_PCky3BGzrpDrkv2uDK2pnsW645qiIr2nmP_LVPWSKcn0JweU0/s400/calcular-prestamos-formulario.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5428044958289437378" /></a><br />Aquí os dejo un pantallazo, con un ejemplo de lo que obtendremos con esta aplicación en Excel.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXQJVMmv461FTw6Qkzrte6MorZg1ovsJ3fWt13kPUhrB_MYWA-YgZ6T__1x2VIrhp89B6QzZ3EYYGI_BEhHJCVym4U5ZEPn26KMB8_sxUafjYiUDxWTA538TQiZ7IXut3ytAF99k35DWAE/s1600-h/calculo-de-prestamos.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXQJVMmv461FTw6Qkzrte6MorZg1ovsJ3fWt13kPUhrB_MYWA-YgZ6T__1x2VIrhp89B6QzZ3EYYGI_BEhHJCVym4U5ZEPn26KMB8_sxUafjYiUDxWTA538TQiZ7IXut3ytAF99k35DWAE/s400/calculo-de-prestamos.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5428045491035877954" /></a><br /><br />Entrando ya en los macros, veréis que tenemos cuatro. Uno para acceder al menú principal (desde la hoja donde calcularemos el préstamo), otro macro para imprimir, otro macro para hacer una presentación preliminar (como si utilizáramos la lupa), y otro para cargar el formulario con información sobre el préstamo francés (el formulario que vemos en la primera de las imágenes anteriores).<br /><br />Vamos a ver el código de los cuatro macros, y que tendremos que copiar en un módulo:<br /><table class="tablavba"><tr><td>Sub menu_principal()<br /><span style="color:#009900;">'Si hay errores que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'ocultamos el procedimiento</span><br />Application.ScreenUpdating = False<br /><span style="color:#009900;">'desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'eliminamos desde la fila 6 hasta el máximo<br />'que podemos tener, y que ocupa hasta la<br />'fila número 3021</span><br />Rows("6:3021").Select<br />Selection.Delete<br /><span style="color:#009900;">'ponemos el ancho estandar de 12,14 en la columna E</span><br />Columns("E:E").Select<br />Selection.ColumnWidth = 12.14<br /><span style="color:#009900;">'ponemos el ancho estandar de 11 en<br />'las columnas desde la F a la J</span><br />Columns("F:J").Select<br />Selection.ColumnWidth = 11<br /><span style="color:#009900;">'nos situamos en la celda B2</span><br />Range("B2").Select<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br /><span style="color:#009900;">'vamos a la primera hoja</span><br />Hoja1.Select<br />Range("B10").Select<br /><span style="color:#009900;">'mostramos el procedimiento</span><br />Application.ScreenUpdating = True<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Sub imprimir()<br /><span style="color:#009900;">'Si hay errores que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'imprimimos la hoja activa</span><br />ActiveWindow.SelectedSheets.PrintOut Copies:=1<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Sub presentacion_preliminar()<br /><span style="color:#009900;">'Si hay errores que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'presentación preliminar de la hoja activa</span><br />ActiveWindow.SelectedSheets.PrintPreview<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Sub prestamo_frances()<br /><span style="color:#009900;">'Lanzamos el formulario con info sobre<br />'el préstamo según el método francés</span><br />InfoPrestamoFrances.Show<br />End Sub</td></tr><br /></table><br />Ahora dentro del formulario con la información sobre el cálculo de préstamos mediante el método francés, colocaremos los siguientes códigos, uno para cuando cliqueemos en el botón "Si", y otro para cuando cliqueemos en el botón "No" (así precisamente se llaman los CommandButton):<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUF79HFvR_AJzFAvJ4jCYMfRB9_6TCEcO0LgBNt9sru5Yt7VYgZFyidIt2ajkqkPv4jDFx2_bN78KFeG7fDnEwizEpFkxT-IMhV8huNqyBuIY1Pcd4oSVO7j43qluKJ4QHP_mTPh_wSqm2/s1600-h/formulario-de-informacion-del-prestamo-frances.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 366px; height: 234px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUF79HFvR_AJzFAvJ4jCYMfRB9_6TCEcO0LgBNt9sru5Yt7VYgZFyidIt2ajkqkPv4jDFx2_bN78KFeG7fDnEwizEpFkxT-IMhV8huNqyBuIY1Pcd4oSVO7j43qluKJ4QHP_mTPh_wSqm2/s400/formulario-de-informacion-del-prestamo-frances.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5428049638032430610" /></a><br /><table class="tablavba"><tr><td>Private Sub Si_Click()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'descargamos el formulario de memoria</span><br />Unload Me<br /><span style="color:#009900;">'llamamos al formulario del préstamo francés<br />'para rellenar los datos</span><br />PrestamoFrances.Show<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub No_Click()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'descargamos el formulario de memoria</span><br />Unload Me<br />End Sub<br /></td></tr><br /></table><br />A los TextBox y botones del segundo formulario, es decir, del formulario donde rellenaremos los datos del préstamo, les he puesto nombres bien descriptivos. En lugar de llamarlos TextBox1, TextBox2, TextBox3, etc., los he llamado Principal, InteresPrestamo, CuotasAmortizacion, etc., pues así nos será más sencillo saber de qué estamos hablando, cuando leamos el código fuente del formulario.<br /><br />Este es el segundo formulario que veremos, cuando cliqueemos en el botón "Si", del formulario anterior:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlou1i3RbkEKF2qm20KHSnmmaf9kVe_dgI2L-2PtFKRk3Z2-R4cIlsMSYk_b-8Ue566HUNMfIUJVG0tU4ahN7Own7l2hYxKSYfwl_t0-9doPo5ny7xdblzT3FcilpIGNBh5sRwqyHctZCK/s1600-h/formulario-del-prestamo-frances.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlou1i3RbkEKF2qm20KHSnmmaf9kVe_dgI2L-2PtFKRk3Z2-R4cIlsMSYk_b-8Ue566HUNMfIUJVG0tU4ahN7Own7l2hYxKSYfwl_t0-9doPo5ny7xdblzT3FcilpIGNBh5sRwqyHctZCK/s400/formulario-del-prestamo-frances.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5428057400505041026" /></a><br />Y todo que viene a continuación, esto será el código que nos encontraremos dentro del formulario (aparte de una pequeña reseña informando que el código es de libre distribución, que está prohibida su venta y su explotación con fines comerciales, y que ha sido obtenido del blog http://www.hojasdecalculoexcel.com). No hace falta que comente para que sirve cada cosa, porque está todo debidamente comentado, y los procedimientos son muy claros. Comenzaremos con el código que nos permitirá controlar los datos introducidos en el formulario:<br /><table class="tablavba"><tr><td>Private Sub UserForm_Activate()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'al activarse sl formulario, añadimos<br />'las opciones del desplegable relativos<br />'a la carencia del préstamo (SI/NO)</span><br />Carencia.AddItem "SI"<br />Carencia.AddItem "NO"<br /><span style="color:#009900;">'bloqueamos por defecto, las opciones de la<br />'carencia (interés y cuotas), para que no se<br />'pueda escribir, si no se ha seleccionado en<br />'el desplegable de carencia (SI/NO)</span><br />InteresCarencia.Enabled = False<br />CuotasCarencia.Enabled = False<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub Carencia_Change()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'activamos o desactivamos los TextBox<br />'relacionados con la carencia del préstamo</span><br />If Carencia.ListIndex = 0 Then<br /> <span style="color:#009900;">'si se elige Carencia=SI (el primer valor es cero),<br /> 'activamos los restantes TextBox</span><br /> InteresCarencia.Enabled = True<br /> CuotasCarencia.Enabled = True<br />Else<br /> <span style="color:#009900;">'en caso contrario, si se elige Carencia=NO,<br /> 'desactivamos los restantes TextBox</span><br /> InteresCarencia = ""<br /> CuotasCarencia = ""<br /> InteresCarencia.Enabled = False<br /> CuotasCarencia.Enabled = False<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub Principal_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor introducido en el principal<br />'del préstamo es numérico...</span><br />If IsNumeric(Principal) Then<br /> <span style="color:#009900;">'y además de ser numérico es menor<br /> 'o igual que cero...</span><br /> If Principal <= 0 Then<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> Principal = Empty<br /> Else<br /> <span style="color:#009900;">'en caso contrario, que le de formato con<br /> 'separador de miles y dos decimales</span><br /> Principal = Format(Principal, "#,##0.00")<br /> End If<br /><span style="color:#009900;">'si no es numérico...</span><br />Else<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> Principal = Empty<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub InteresPrestamo_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor introducido en el interés<br />'del préstamo es numérico...</span><br />If IsNumeric(InteresPrestamo) Then<br /> <span style="color:#009900;">'y además de ser numérico es menor o igual<br /> 'que 100, y mayor que cero...</span><br /> If InteresPrestamo <= 100 And InteresPrestamo > 0 Then<br /> <span style="color:#009900;">'que divida el valor entre 100 (para que sea %), y<br /> 'que le de formato decimal y con cuatro decimales</span><br /> InteresPrestamo = Format(InteresPrestamo / 100, "##0.0000%")<br /> Else<br /> <span style="color:#009900;">'en caso contrario, eliminamos<br /> 'el dato introducido</span><br /> InteresPrestamo = Empty<br /> End If<br /><span style="color:#009900;">'si no es numérico...</span><br />Else<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> InteresPrestamo = Empty<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub CuotasAmortizacion_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor es numérico...</span><br />If IsNumeric(CuotasAmortizacion) Then<br /> <span style="color:#009900;">'y además de ser numérico<br /> 'es menor o igual que cero...</span><br /> If CuotasAmortizacion <= 0 Then<br /> <span style="color:#009900;">'eliminamos la entrada</span><br /> CuotasAmortizacion = Empty<br /> Else<br /> <span style="color:#009900;">'en caso contrario, que le de formato con<br /> 'separador de miles, siempre y cuando<br /> 'sea menor que 1500</span><br /> If CuotasAmortizacion <= 1500 Then<br /> <span style="color:#009900;">'si es menor o igual que 1500, le<br /> 'damos el formato con separador de miles</span><br /> CuotasAmortizacion = Format(CuotasAmortizacion, "#,##0")<br /> Else<br /> <span style="color:#009900;">'si es mayor que 1500, eliminamos<br /> 'el dato introducido</span><br /> CuotasAmortizacion = Empty<br /> End If<br /> End If<br /><span style="color:#009900;">'si no es numérico...</span><br />Else<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> CuotasAmortizacion = Empty<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub CuotasAnio_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor no es numérico, o es menor<br />'o igual que cero, o mayor que 52...</span><br />If Not IsNumeric(CuotasAnio) Or CuotasAnio <= 0 Or CuotasAnio > 52 Then<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> CuotasAnio = Empty<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td><br />Private Sub Fecha_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor no es una fecha...</span><br />If Not IsDate(Fecha) Then<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> Fecha = Empty<br /><span style="color:#009900;">'si es una fecha, que le de formato de fecha</span><br />Else<br /> Fecha = Format(Fecha, "dd-mm-yyyy")<br /> <span style="color:#009900;">'si la fecha es menor que el 01-01-1900, o mayor<br /> 'que el 31-12-3000, borramos el dato introducido<br /> '(hay que ponerlo con formato mes-día-año)</span><br /> If Fecha < #1/1/1900# Or Fecha > #12/31/3000# Then<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> Fecha = Empty<br /> End If<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub InteresCarencia_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor es numérico...</span><br />If IsNumeric(InteresCarencia) Then<br /> <span style="color:#009900;">'y además de ser numérico es menor o<br /> 'igual que 100, y mayor que cero...</span><br /> If InteresCarencia <= 100 And InteresCarencia > 0 Then<br /> <span style="color:#009900;">'que divida el valor entre 100, y<br /> 'que le de formato con cuatro decimales</span><br /> InteresCarencia = Format(InteresCarencia / 100, "##0.0000%")<br /> Else<br /> <span style="color:#009900;">'en caso contrario, eliminamos<br /> 'el dato introducido</span><br /> InteresCarencia = Empty<br /> End If<br /><span style="color:#009900;">'si no es numérico</span><br />Else<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> InteresCarencia = Empty<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub CuotasCarencia_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si el valor no es numérico, o es menor<br />'o igual que cero, o mayor que 1500...</span><br />If Not IsNumeric(CuotasCarencia) Or CuotasCarencia <= 0 Or CuotasCarencia > 1500 Then<br /> <span style="color:#009900;">'eliminamos el dato introducido</span><br /> CuotasCarencia = Empty<br />Else<br /> <span style="color:#009900;">'si es menor o igual que 1500, le damos formato</span><br /> CuotasCarencia = Format(CuotasCarencia, "#,##0")<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Sub QueEsLaCarencia_Click()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'mostramos un mensaje, informando<br />'de lo que es la carencia</span><br />MsgBox (Chr(13) & " La carencia es el periodo de tiempo durante " _<br />& Chr(13) & " el cual no se amortiza nada del principal del " _<br />& Chr(13) & " préstamo, pero en cambio, sí que se deven- " _<br />& Chr(13) & " gan y amortizan intereses. " _<br />& Chr(13) & Chr(13)), vbOKOnly, " ¿Qué es la carencia?"<br />End Sub<br /></td></tr><br /></table><br />Y ahora el código que se ejecutará cuando cliqueemos en los dos botones del formulario, empezando por el código del botón que nos hará los cálculos, y cuyo código es más extenso, y a continuación con el otro botón cuyo código es muy sencillo, y que nos permite cerrar el formulario:<br /><table class="tablavba"><tr><td>Private Sub Calcular_Click()<br /><span style="color:#009900;">'Si hay errores, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'si hay algún campo vacío, o si se ha seleccionado SI<br />'en la Carencia, pero faltan el interes y/o las cuotas<br />'de carencia, que muestre un mensaje</span><br />If Principal = Empty Or InteresPrestamo = Empty Or CuotasAmortizacion = Empty Or _<br />CuotasAnio = Empty Or Fecha = Empty Or Carencia.ListIndex = -1 Or _<br />(Carencia.ListIndex = 0 And (InteresCarencia = Empty Or CuotasCarencia = Empty)) Then<br /> <span style="color:#009900;">'mostramos el mensaje</span><br /> MsgBox (Chr(13) & " Por favor, revisa el formulario. " _<br /> & Chr(13) & Chr(13) & " Debes completar los datos necesarios, para " _<br /> & Chr(13) & " poder llevar a cabo el análisis del préstamo. " _<br /> & Chr(13) & Chr(13)), vbOKOnly, " Datos incompletos"<br /><span style="color:#009900;">'en caso contrario, si todos los datos están completos...</span><br />Else<br /> <span style="color:#009900;">'informamos que estamos efectuando<br /> 'los cálculos, en el label llamado "Informacion"</span><br /> Informacion = "Calculando..."<br /> DoEvents<br /> <span style="color:#009900;">'ocultamos el proceso</span><br /> Application.ScreenUpdating = False<br /> <span style="color:#009900;">'seleccionamos la Hoja2 (hoja del préstamo francés)</span><br /> Hoja2.Select<br /> <span style="color:#009900;">'desprotegemos la hoja</span><br /> ActiveSheet.Unprotect<br /> <span style="color:#009900;">'eliminamos desde la fila 6 hasta el máximo<br /> 'que podemos tener, y que ocupa hasta la<br /> 'fila número 3021, por si acaso no hemos<br /> 'vuelto al menú principal usando los botones</span><br /> Rows("6:3021").Select<br /> Selection.Delete<br /> <span style="color:#009900;">'escribimos en las celdas, lo que nos<br /> 'interesa, en negrita, y de color granate</span><br /> Range("B6").Select<br /> ActiveCell = "CÁLCULO DE PRÉSTAMOS (método francés)"<br /> Selection.Font.Bold = True<br /> Selection.Font.ColorIndex = 9<br /> <span style="color:#009900;">'ponemos una doble línea</span><br /> Range("B6:F6").Select<br /> With Selection.Borders(xlEdgeBottom)<br /> .LineStyle = xlDouble<br /> End With<br /> <span style="color:#009900;">'escribimos los títulos del cuadro<br /> 'resumen que colocaremos en la parte<br /> 'superior de la página</span><br /> Range("B7") = "Principal del préstamo:"<br /> Range("F7") = Principal<br /> Range("B8") = "Tipo de interés durante la amortización del préstamo:"<br /> Range("F8") = InteresPrestamo<br /> Range("B9") = "Número de cuotas de amortización:"<br /> Range("F9") = CuotasAmortizacion<br /> Range("B10") = "Número de cuotas de amortización, al año:"<br /> Range("F10") = CuotasAnio<br /> Range("B11") = "Número de años hasta la amortización del préstamo:"<br /> Range("F11") = Format(CuotasAmortizacion / CuotasAnio, "#,##0.00")<br /> Range("B12") = "Fecha del primer pago:"<br /> Range("F12") = Fecha<br /> <span style="color:#009900;">'ponemos la TAE de la amortización,<br /> 'alineando el dato a la derecha, pero antes<br /> 'miraremos si hay carencia o no, para elegir<br /> 'donde escribimos el dato de la TAE.</span><br /> If Carencia.ListIndex = 0 Then<br /> Range("J14").Select<br /> Else<br /> Range("J15").Select<br /> End If<br /> With Selection<br /> .HorizontalAlignment = xlRight<br /> End With<br /> <span style="color:#009900;">'ponemos la TAE de la operación</span><br /> TaePrestamo = (((1 + (CDec(Replace(InteresPrestamo, "%", "") / 100) / CuotasAnio)) ^ CuotasAnio) - 1) * 100<br /> ActiveCell = "TAE: " & Format(TaePrestamo / 100, "##0.0000%")<br /> <span style="color:#009900;">'seguimos escribiendo, dependiendo de si<br /> 'tenemos o no carencia en el préstamo</span><br /> If Carencia.ListIndex = 0 Then<br /> Range("B13") = "Tipo de interés durante la carencia:"<br /> Range("F13") = InteresCarencia<br /> Range("B14") = "Número de cuotas de carencia:"<br /> Range("F14") = CuotasCarencia<br /> Range("B15") = "Número de años de carencia:"<br /> Range("F15") = Format(CuotasCarencia / CuotasAnio, "#,##0.00")<br /> <span style="color:#009900;">'ponemos la TAE de la carencia</span><br /> TaeCarencia = (((1 + (CDec(Replace(InteresCarencia, "%", "") / 100) / CuotasAnio)) ^ CuotasAnio) - 1) * 100<br /> Range("J15") = "TAE carencia: " & Format(TaeCarencia / 100, "##0.0000%")<br /> With Selection<br /> .HorizontalAlignment = xlRight<br /> End With<br /> End If<br /> <span style="color:#009900;">'ponemos una doble línea,<br /> 'dependiendo de si hay carencia o no</span><br /> If Range("B13") = Empty Then<br /> <span style="color:#009900;">'si no hay carencia, ponemos la doble línea<br /> 'debajo de la fila 12</span><br /> Range("B12:F12").Select<br /> With Selection.Borders(xlEdgeBottom)<br /> .LineStyle = xlDouble<br /> End With<br /> Else<br /> <span style="color:#009900;">'si hay carencia, ponemos la doble línea<br /> 'debajo de la fila 15</span><br /> Range("B15:F15").Select<br /> With Selection.Borders(xlEdgeBottom)<br /> .LineStyle = xlDouble<br /> End With<br /> End If<br /> <span style="color:#009900;">'alineamos los datos numéricos a la derecha</span><br /> Range("F7:F15").Select<br /> With Selection<br /> .HorizontalAlignment = xlRight<br /> End With<br /> <span style="color:#009900;">'seguimos escribiendo los encabezados de la tabla</span><br /> Range("B17") = "Cuota nº"<br /> Range("C17") = "Concepto"<br /> Range("D17") = "Fecha"<br /> Range("E17") = "Capital vivo antes del pago de la cuota"<br /> Range("F17") = "Capital amortizado"<br /> Range("G17") = "Intereses a pagar"<br /> Range("H17") = "Capital amortizado acumulado"<br /> Range("I17") = "Intereses acumulados"<br /> Range("J17") = "Cuota total"<br /> <span style="color:#009900;">'alineamos los textos básicos a la izquierda (puesto que se<br /> 'centran por defecto) al estar toda la columna centrada</span><br /> Range("B6:B15").Select<br /> With Selection<br /> .HorizontalAlignment = xlGeneral<br /> End With<br /> <span style="color:#009900;">'alineamos los encabezados, vertical y horizontalmente,<br /> 'los ajustamos a su celda, y los ponemos en negrita</span><br /> Range("B17:J17").Select<br /> With Selection<br /> .HorizontalAlignment = xlCenter<br /> .VerticalAlignment = xlCenter<br /> .WrapText = True<br /> .Font.Bold = True<br /> End With<br /> <span style="color:#009900;">'ponemos valores y fórmulas, empezando<br /> 'por numerar las cuotas del préstamo</span><br /> Range("B18").Select<br /> <span style="color:#009900;">'si no hay carencia (si está vacía), ponemos<br /> 'que el nº de cuotas de carencia es cero</span><br /> If CuotasCarencia = "" Then CuotasCarencia = 0<br /> <span style="color:#009900;">'le quitaremos el separador de miles al nº de<br /> 'cuotas de carencia y de amortización del préstamo,<br /> 'pues en los textbox aparecen con el separador.<br /> 'Como no en todos los países se usa el punto, sino que<br /> 'se utiliza la coma, tendremos en cuenta esta circunstancia</span><br /> CuotasCarencia = Replace(CuotasCarencia, ",", "")<br /> CuotasCarencia = Replace(CuotasCarencia, ".", "")<br /> CuotasAmortizacion = Replace(CuotasAmortizacion, ",", "")<br /> CuotasAmortizacion = Replace(CuotasAmortizacion, ".", "")<br /> <span style="color:#009900;">'pasamos el nº total de cuotas de amortización<br /> 'y de carencia a una variable</span><br /> CuotasTotales = CInt(CuotasAmortizacion) + CInt(CuotasCarencia)<br /> <span style="color:#009900;">'ponemos el nº de las cuotas de amortización y de<br /> 'carencia, siempre que CuotasAmortizacion + CuotasCarencia<br /> 'sea mayor o igual que 1</span><br /> If CuotasTotales >= 1 Then<br /> For i = 1 To CuotasTotales<br /> <span style="color:#009900;">'ponemos el nº de la cuota</span><br /> ActiveCell = i<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> End If<br /> <span style="color:#009900;">'seguimos poniendo los conceptos</span><br /> Range("C18").Select<br /> <span style="color:#009900;">'si no hay carencia...</span><br /> If CuotasCarencia = 0 Then<br /> <span style="color:#009900;">'ponemos como concepto "Amortización"<br /> 'y debajo, comillas dobles</span><br /> ActiveCell = "Amortización"<br /> For i = 1 To CInt(CuotasAmortizacion) - 1<br /> <span style="color:#009900;">'ponemos el nº de la cuota</span><br /> ActiveCell.Offset(1, 0) = """"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> <span style="color:#009900;">'si hay carencia...</span><br /> Else<br /> <span style="color:#009900;">'ponemos como concepto "Carencia"</span><br /> ActiveCell = "Carencia"<br /> <span style="color:#009900;">'ponemos comillas dobles, si las cuotas<br /> 'de carencia son mayores que 1</span><br /> For i = 1 To CInt(CuotasCarencia) - 1<br /> <span style="color:#009900;">'ponemos el nº de la cuota</span><br /> ActiveCell.Offset(1, 0) = """"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> <span style="color:#009900;">'ponemos debajo como concepto "Amortización"</span><br /> ActiveCell.Offset(1, 0).Select<br /> ActiveCell = "Amortización"<br /> <span style="color:#009900;">'ponemos comillas dobles, si las cuotas<br /> 'de amortización son mayores que 1</span><br /> For i = 1 To CInt(CuotasAmortizacion) - 1<br /> <span style="color:#009900;">'ponemos el nº de la cuota</span><br /> ActiveCell.Offset(1, 0) = """"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> End If<br /> <span style="color:#009900;">'recuerda que todo esto ha salido del blog<br /> 'http://www.hojasdecalculoexcel.com<br /> 'seguimos poniendo las fechas</span><br /> Range("D18").Select<br /> <span style="color:#009900;">'pasamos los primera fecha a una variable</span><br /> FechaDelPrimerPago = CDate(Range("F12"))<br /> Range("D18") = FechaDelPrimerPago<br /> <span style="color:#009900;">'si las CuotasAmortizacion + CuotasCarencia son<br /> 'mayores que 1, seguimos poniendo las fechas</span><br /> If CuotasTotales > 1 Then<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br /> For i = 1 To CInt(CuotasTotales) - 1<br /> <span style="color:#009900;">'miramos el nº de cuotas anuales para<br /> 'poner la fecha dependiendo de eso</span><br /> Select Case CuotasAnio<br /> <span style="color:#009900;">'cuotas semanales</span><br /> Case 52<br /> <span style="color:#009900;">'sumamos 7 días al dato de la celda anterior</span><br /> ActiveCell.Formula = "=R[-1]C+7"<br /> <span style="color:#009900;">'cuotas mensuales, bimensuales, trimestrales,<br /> 'cuatrimestrales, semestrales, o anuales</span><br /> Case 12, 6, 4, 3, 2, 1<br /> <span style="color:#009900;">'que coincida el día exacto (si es primer<br /> 'pago es el día 12, por ejemplo, que cada<br /> 'pago coincida con el día 12)</span><br /> ActiveCell.Formula = "=IF(DATE(YEAR(R18C),MONTH(R18C),DAY(R18C))" & _<br /> "=DATE(YEAR(R18C),MONTH(R18C)+1,),DATE(YEAR(R[-1]C),MONTH(R[-1]C)+(12/R10C[2])+1,)" & _<br /> ",DATE(YEAR(R[-1]C),MONTH(R[-1]C)+(12/R10C[2]),MIN(DAY(R18C4),DAY(DATE(YEAR(R[-1]C)," & _<br /> "MONTH(R[-1]C)+(12/R10C[2])+1,)))))"<br /> <span style="color:#009900;">'si es otro tipo de cuota</span><br /> Case Else<br /> ActiveCell.Formula = "=IF(R10C[2]=12,DATE(YEAR(R[-1]C),MONTH(R[-1]C)+(12/R10C6)," & _<br /> "IF(R10C6=12,DAY(R[-1]C))),R[-1]C+INT(365/R10C[2]))"<br /> End Select<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> End If<br /> <span style="color:#009900;">'Seguimos poniendo el capital vivo<br /> 'antes del pago de la 1ª cuota</span><br /> Range("E18").Select<br /> ActiveCell.Formula = "=IF(RC[-3]<R14C6+1,R7C6,R7C6)"<br /> <span style="color:#009900;">'Seguimos poniendo el capital amortizado<br /> 'en la primera cuota</span><br /> Range("F18").Select<br /> ActiveCell.Formula = "=IF(RC[-4]<(R14C6+1),0,IF(RC[-4]<=(R9C6+R14C6),RC[4]-RC[1],0))"<br /> <span style="color:#009900;">'seguimos poniendo los intereses pagados</span><br /> Range("G18").Select<br /> ActiveCell.Formula = "=IF(RC[-5]<(R14C6+1),RC[-2]*R13C6/R10C6,IF(RC[-5]<=(R9C6+R14C6)," & _<br /> "RC[-2]*R8C6/R10C6,0))"<br /> <span style="color:#009900;">'seguimos poniendo el capital amortizado acumulado</span><br /> Range("H18").Select<br /> ActiveCell.Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'seguimos poniendo los intereses acumulados</span><br /> Range("I18").Select<br /> ActiveCell.Formula = "=IF(RC[-2]<>0,RC[-2],0)"<br /> <span style="color:#009900;">'seguimos poniendo la cuota total</span><br /> Range("J18").Select<br /> ActiveCell.Formula = "=IF(RC[-8]<(R14C6+1),RC[-4]+RC[-3],R7C6*(R8C6/R10C6)/(1-(1+(R8C6/R10C6))^-R9C6))"<br /> <span style="color:#009900;">'seguimos poniendo el resto de datos, es decir<br /> 'el capital vivo antes del pago de cada cuota,<br /> 'el capital amortizado, los intereses, el capital<br /> 'amortizado acumulado, los intereses acumulados,<br /> 'y el importe de las cuotas</span><br /> Range("E18").Select<br /> For i = 1 To CuotasTotales - 1<br /> <span style="color:#009900;">'el capital vivo</span><br /> ActiveCell.Offset(1, 0).Formula = "=IF(RC[-3]<=R14C6+1,R7C6,IF(RC[-3]<=R7C6,R[-1]C-R[-1]C[1],0))"<br /> <span style="color:#009900;">'el capital amortizado</span><br /> ActiveCell.Offset(1, 1).Formula = "=IF(RC[-4]<(R14C6+1),0,IF(RC[-4]<=(R9C6+R14C6),RC[4]-RC[1],0))"<br /> <span style="color:#009900;">'los intereses pagados</span><br /> ActiveCell.Offset(1, 2).Formula = "=IF(RC[-5]<(R14C6+1),RC[-2]*R13C6/R10C6,IF(RC[-5]" & _<br /> "<=(R9C6+R14C6),RC[-2]*R8C6/R10C6,0))"<br /> <span style="color:#009900;">'el capital amortizado acumulado</span><br /> ActiveCell.Offset(1, 3).Formula = "=IF(RC[-6]<>0,R[-1]C+RC[-2],0)"<br /> <span style="color:#009900;">'los intereses acumulados</span><br /> ActiveCell.Offset(1, 4).Formula = "=IF(RC[-7]<>0,R[-1]C+RC[-2],0)"<br /> <span style="color:#009900;">'la cuota total</span><br /> ActiveCell.Offset(1, 5).Formula = "=IF(RC[-8]<(R14C6+1),RC[-4]+RC[-3],R7C6*(R8C6/R10C6)/(1-" & _<br /> "(1+(R8C6/R10C6))^-R9C6))"<br /> <span style="color:#009900;">'bajamos a la fila siguiente<br /> 'y seguimos con el bucle</span><br /> ActiveCell.Offset(1, 0).Select<br /> Next<br /> <span style="color:#009900;">'ponemos las sumas totales, lo ponemos en negrita<br /> 'y le ponemos un nombre a la celda</span><br /> Range("F17").End(xlDown).Offset(1, 0).Select<br /> ActiveCell.Formula = "=SUM(R[-1]C:R18C)"<br /> ActiveCell.Name = "SumaDelCapitalAmortizado"<br /> ActiveCell.Font.Bold = True<br /> <span style="color:#009900;">'sumamos los intereses a pagar, y ponemos<br /> 'el valor de la celda en negrita</span><br /> ActiveCell.Offset(0, 1).Formula = "=SUM(R[-1]C:R18C)"<br /> ActiveCell.Offset(0, 1).Font.Bold = True<br /> <span style="color:#009900;">'sumamos las cuotas totales, y ponemos<br /> 'el valor de la celda en negrita</span><br /> ActiveCell.Offset(0, 4).Formula = "=SUM(R[-1]C:R18C)"<br /> ActiveCell.Offset(0, 4).Font.Bold = True<br /> <span style="color:#009900;">'ponemos las tramas alternas, es decir, celdas<br /> 'sombreadas y blancas desde B17 hasta el final</span><br /> Range("B17", Range("B17").End(xlDown).End(xlToRight)).Select<br /> <span style="color:#009900;">'borramos el formato que tengan</span><br /> Selection.FormatConditions.Delete<br /> <span style="color:#009900;">'añadimos los formatos condicionales<br /> 'a los datos de la tabla</span><br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();2)=0;VERDADERO;FALSO)"<br /> Selection.FormatConditions(1).Interior.ColorIndex = 15<br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();1)=0;VERDADERO;FALSO)"<br /> <span style="color:#009900;">'hacemos lo mismo con los totales</span><br /> Range(Range("F17").End(xlDown), Range("G17").End(xlDown)).Select<br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();2)=0;VERDADERO;FALSO)"<br /> Selection.FormatConditions(1).Interior.ColorIndex = 15<br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();1)=0;VERDADERO;FALSO)"<br /> Range("J17").End(xlDown).Select<br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();2)=0;VERDADERO;FALSO)"<br /> Selection.FormatConditions(1).Interior.ColorIndex = 15<br /> Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=SI(RESIDUO(FILA();1)=0;VERDADERO;FALSO)"<br /> <span style="color:#009900;">'ponemos bordes alrededor de los conceptos</span><br /> Range("B17:J17").Select<br /> With Selection.Borders<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> <span style="color:#009900;">'seguimos poniendo bordes desde B18 hasta el final<br /> 'si solo hay 1 cuota ponemos la fila 19 con bordes</span><br /> If CuotasTotales = 1 Then<br /> Range("B18:J18").Select<br /> With Selection.Borders<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> Else<br /> <span style="color:#009900;">'si hay más de una cuota, ponemos<br /> 'todos los datos con bordes</span><br /> Range("B18", Range("B18").End(xlDown).End(xlToRight)).Select<br /> With Selection.Borders(xlEdgeLeft)<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> With Selection.Borders(xlEdgeBottom)<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> With Selection.Borders(xlEdgeRight)<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> With Selection.Borders(xlInsideVertical)<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> End If<br /> <span style="color:#009900;">'le seguimos poniendo bordes a los totales<br /> 'del capital amortizado, e intereses a pagar</span><br /> Range(Range("F17").End(xlDown), Range("G17").End(xlDown)).Select<br /> With Selection.Borders<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> <span style="color:#009900;">'hacemos lo mismo para la suma<br /> 'de las cuotas totales</span><br /> Range("J17").End(xlDown).Select<br /> With Selection.Borders<br /> .LineStyle = xlContinuous<br /> .Weight = xlThin<br /> .ColorIndex = xlAutomatic<br /> End With<br /> <span style="color:#009900;">'configuramos página y ponemos la fila 17 fija,<br /> 'por si hay más de una página a imprimir, para<br /> 'que nos salgan los encabezados correctamente</span><br /> With ActiveSheet.PageSetup<br /> .PrintTitleRows = "$1:$17"<br /> .PrintTitleColumns = ""<br /> End With<br /> <span style="color:#009900;">'si la SumaDelCapitalAmortizado no cuadra exactamente hasta<br /> 'el segundo decimal, con el principal del préstamo, ponemos<br /> 'un mensaje al final de la tabla</span><br /> If Format(Range("SumaDelCapitalAmortizado"), "#,##0.00") <> Format(Range("E18"), "#,##0.00") Then<br /> Range("B17").End(xlDown).Offset(3, 0).Select<br /> ActiveCell = "Excel provoca un error en el cálculo, a nivel decimal, en la suma total del capital amortizado."<br /> <span style="color:#009900;">'lo alineamos dándole formato general</span><br /> With Selection<br /> .HorizontalAlignment = xlGeneral<br /> End With<br /> End If<br /> <span style="color:#009900;">'borramos el nombre de la suma<br /> 'total del capital amortizado</span><br /> ActiveWorkbook.Names("SumaDelCapitalAmortizado").Delete<br /> <span style="color:#009900;">'liberamos memoria</span><br /> Principal = Empty<br /> InteresPrestamo = Empty<br /> CuotasAmortizacion = Empty<br /> CuotasAnio = Empty<br /> Fecha = Empty<br /> Carencia = Empty<br /> InteresCarencia = Empty<br /> CuotasCarencia = Empty<br /> Informacion = Empty<br /> Unload Me<br /> <span style="color:#009900;">'autoajustamos desde la columna E a la J</span><br /> Columns("E:J").Select<br /> Selection.Columns.AutoFit<br /> <span style="color:#009900;">'nos situamos en la celda B2</span><br /> Range("B2").Select<br /> <span style="color:#009900;">'protegemos la hoja</span><br /> ActiveSheet.Protect<br /> <span style="color:#009900;">'mostramos el proceso</span><br /> Application.ScreenUpdating = True<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub cerrar_Click()<br /><span style="color:#009900;">'Descargamos el formulario de memoria</span><br />Unload Me<br />End Sub<br /></td></tr><br /></table><br />Si os habéis fijado bien (y no os habéis cansado leyendo tanto código fuente), he utilizado fórmulas de matemáticas financieras, omitiendo las funciones propias de Excel, como por ejemplo la función PAGO. Personalmente me gusta más utilizar las fórmulas matemáticas, que estas funciones que lo encapsulan todo, y en las que no se sabe exactamente que es lo que está haciendo la aplicación (bueno, sí se sabe, porque sabemos para que sirven esas funciones, pero el control sobre lo que estamos haciendo, no es el mismo). También os habréis fijado, que he utilizado las fórmulas como si las estuviéramos escribiendo directamente en las celdas de Excel, entrecomillándolas dentro del código, y escribiéndolas en inglés. El secreto de esto último, no es otro que crearlas utilizando la grabadora de macros, ...así no nos equivocaremos.<br /><br />Otra cuestión que me gustaría remarcar, es que si en el formulario donde entraremos los datos, escogemos que las cuotas del préstamo sean mensuales, bimensuales, trimestrales, cuatrimestrales, semestrales, o anuales, los cálculos se realizarán escogiendo el mismo día de pago para todas las cuotas. Vamos a explicar esto con un ejemplo sencillo. Imaginad que escogemos amortizar el préstamo de forma mensual (12 cuotas al año). Si el primer pago lo realizamos por ejemplo el día 20-01-2010, si le sumamos 30 días, las cuotas siguientes se pagarían en estas fechas:<br /><br />20/01/2010<br />19/02/2010<br />21/03/2010<br />20/04/2010<br />...<br /><br />Como vemos, no coinciden todas el día 20, que es lo normal (lo que nos aplicará la entidad financiera). En el código está contemplado todo esto, y si escogemos alguno de los periodos que os he indicado antes, el día de pago siempre será fijo (en el caso del ejemplo anterior, todos los pagos se realizarían el día 20 de cada mes).<br /><br />Como veis, ya son varios los artículos sobre temas financieros, los que he ido publicando en el blog. Espero que este tenga tan buena aceptación, como la ha tenido el artículo donde explicaba como calcular <a href="http://www.hojasdecalculoexcel.com/2009/05/calcular-la-tir-y-el-van.html" title="calcular la TIR y el VAN">la tir y el van</a>. A partir de ahora, ya no tienes excusa, para calcular las cuotas de la hipoteca, la letra del coche, o cualquier otro préstamo, porque esta aplicación se constituye como un excelente simulador de préstamos.<br /><br />Desde<a name="descarga-prestamos-hipotecas"></a> aquí podéis <a href="http://www.mediafire.com/?3k4w3et82vx4ckk" rel="nofollow" target="_blank">descargar el fichero de Excel</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com29tag:blogger.com,1999:blog-7983188466168395484.post-57419317901821024612009-12-16T00:01:00.007+01:002012-06-30T21:02:28.475+02:00Modificar datos utilizando un formularioEn una entrega anterior, habíamos visto como <a href="http://www.hojasdecalculoexcel.com/2009/11/introducir-datos-utilizando-un.html" title="introducir datos utilizando un formulario">introducir datos a través de un formulario</a>. Si vamos a utilizar la técnica de los formularios para introducir datos en Excel, es más que probable que necesitemos en alguna ocasión, modificar los datos introducidos, bien porque nos hayamos equivocado al darlos de alta, o por cualquier otro motivo.<br /><br />Pues hoy vamos a ver precisamente eso, como modificar datos de una hoja de cálculo, utilizando un formulario. He utilizado un ejemplo muy parecido al que habíamos visto en aquella entrega, para que sea más sencillo. Eso sí, una observación: si queréis integrar de forma conjunta el alta de datos y la modificación de datos, utilizando estos ejemplos, copiando y pegando los macros, deberéis tener en cuenta que en el artículo donde os hablaba de cómo <a href="http://www.hojasdecalculoexcel.com/2009/11/introducir-datos-utilizando-un.html" title="introducir datos utilizando un formulario">introducir datos a través de un formulario</a>, los controles (ComboBox, TextBox, etc.) no tienen el mismo nombre que en este artículo que estáis leyendo. Por ejemplo, en aquel artículo, el TextBox de la cantidad de producto, se llamaba TextBox2, y en este artículo lo llamaremos TextBox1.<br /><br />Una vez dicho todo esto, vamos a ponernos manos a la obra. Necesitaremos una tabla con datos -eso es evidente-, pues lo que haremos será modificarlos. Necesitaremos que los datos estén de forma continua, sin líneas en blanco, para que nos funcione este ejemplo, aunque se puede utilizar para otros ejemplos donde no se cumpla esta condición. Simplemente tendremos que cambiar un par de líneas. Más adelante os comentaré de qué estamos hablando.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRNFuTL8fvwFjnhXWU07Hc0CG2To-MYnFPgcy2X-ZYutfiNUPvVJIiMcj6uSPfbKI3iP9vaoR-bi-Omcb5N8vSE6mreXAheTGmq-FF7vVzAD6LqIp4ByUP8CX5Q-DjvNpI9TsB2tx_Jny6/s1600-h/modificar-datos-con-userform-excel.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 195px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRNFuTL8fvwFjnhXWU07Hc0CG2To-MYnFPgcy2X-ZYutfiNUPvVJIiMcj6uSPfbKI3iP9vaoR-bi-Omcb5N8vSE6mreXAheTGmq-FF7vVzAD6LqIp4ByUP8CX5Q-DjvNpI9TsB2tx_Jny6/s400/modificar-datos-con-userform-excel.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5415116650999872258" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCdlkSPr4DkCDhDtofTESQ4RvjUWUb_hvAIVJO8h_gRviM92PMDd64TOwLTikJGi1ir6NozDUGNfO2aLYgEPRUsJ0TItlKGxrifCI9YIgDi6V0MMZiRK5q7mwE4kCpfWzLjIPYot81_Z91/s1600-h/formulario-para-modificar-datos-excel.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 258px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCdlkSPr4DkCDhDtofTESQ4RvjUWUb_hvAIVJO8h_gRviM92PMDd64TOwLTikJGi1ir6NozDUGNfO2aLYgEPRUsJ0TItlKGxrifCI9YIgDi6V0MMZiRK5q7mwE4kCpfWzLjIPYot81_Z91/s400/formulario-para-modificar-datos-excel.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5421060027899240098" /></a><br /><br />Los dos macros que colocaremos dentro de un módulo serán estos:<br /><table class="tablavba"><tr><td>Sub Auto_open()<br /><span style="color:#009900;">'Protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Sub introducir_datos()<br /><span style="color:#009900;">'llamamos al formulario</span><br />UserForm1.Show<br />End Sub<br /></td></tr><br /></table><br />Dentro del Formulario (UserForm), tendremos el resto del código. Utilizaremos un macro llamado <strong>ComboBox1_Enter()</strong> que se ejecutará como su nombre indica, al hacer clic en el ComboBox1. Tendremos también otro llamado <strong>ComboBox1_Change()</strong>, que nos servirá para cargar en los TextBox los datos correspondientes al productos elegido. También utilizaremos dos macros que evalúen si estamos cambiando la cantidad de producto, y el precio unitario, para recalcular el total, a través de un <strong>TextBox1_Change()</strong> y de un <strong>TextBox2_Change()</strong>. Utilizaremos otro macro llamado <strong>CommandButton1_Click()</strong> que contendrá el código al pulsar el botón para grabar datos, y otro llamado <strong>CommandButton2_Click()</strong> que servirá, no para borrar los datos del formulario, como en el ejemplo donde introducíamos datos a través de un formulario, sino para eliminar el artículo o producto, de la tabla de Excel.<br /><br />Vamos a ver el código de todos ellos:<br /><table class="tablavba"><tr><td>Private Sub ComboBox1_Enter()<br /><span style="color:#009900;">'En caso de error, que continúe</span><br />On Error Resume Next<br /><span style="color:#009900;">'limpiamos los datos del Combobox</span><br />ComboBox1.Clear<br /><span style="color:#009900;">'Al inciar el formulario,<br />'seleccionamos la hoja con los datos</span><br />Hoja1.Select<br /><span style="color:#009900;">'Seleccionamos la celda B5</span><br />Range("B5").Select<br /><span style="color:#009900;">'Vamos a llenar dinámicamente el combobox<br />'con los nombres de los artículos, hasta<br />'encontrar una fila vacía</span><br />Do While Not IsEmpty(ActiveCell)<br /> <span style="color:#009900;">'ponemos el nombre del producto</span><br /> ComboBox1.AddItem ActiveCell.Value<br /> <span style="color:#009900;">'bajamos una fila</span><br /> ActiveCell.Offset(1, 0).Select<br />Loop<br />End Sub<br /></td></tr><br /></table><br />En el caso de que no tengamos los datos de forma continua, y hayan filas en blanco, si usamos el bucle <strong>Do While</strong> del macro anterior, solo se nos cargarán en el ComboBox1 los datos que haya hasta esa fila vacía. Si queremos usarlo correctamente y tenemos filas vacías en la tabla cuyos datos queremos modificar, tendremos que sustituir el bucle <strong>Do While</strong> por un bucle <strong>For</strong> para que recorra todas las filas, desde la fila inicial hasta la fila final. Eso sí, se nos cargarán también en el ComboBox1 las filas vacías, aunque podemos omitirlas, añadiendo solo aquellas celdas al combo que contengan datos (que no estén vacías), con un sencillo condicional que evalúe si la celda está vacía o no.<br /><br />Bien, seguimos con el resto del código que utilizaremos, y que será el siguiente:<br /><table class="tablavba"><tr><td>Private Sub ComboBox1_Change()<br /><span style="color:#009900;">'Miramos en qué fila está el producto<br />'seleccionado en el ComboBox, y le sumaremos<br />'4 porque empezamos los productos en la fila<br />'5 (celda B5). Sumaremos también un 1, porque<br />'los elementos del combobox empiezan a numerarse<br />'desde cero. Con lo cual sumaremos 4 + 1 = 5.<br />'Seleccionaremos esa fila, de la columna B, es<br />'decir, de la columna 2 (el producto)</span><br />Cells(ComboBox1.ListIndex + 5, 2).Select<br /><span style="color:#009900;">'cargamos los datos correspondientes<br />'al producto elegido</span><br />TextBox1 = ActiveCell.Offset(0, 1)<br />TextBox2 = ActiveCell.Offset(0, 2)<br />TextBox3 = ActiveCell.Offset(0, 3)<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub TextBox1_Change()<br /><span style="color:#009900;">'Si cambiamos la cantidad, modificaremos<br />'el precio total</span><br />If TextBox1 <> "" And IsNumeric(TextBox1) And _<br />TextBox2 <> "" And IsNumeric(TextBox2) Then<br />TextBox3 = TextBox1 * TextBox2<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub TextBox2_Change()<br /><span style="color:#009900;">'Si cambiamos el precio unitario, modificaremos<br />'el precio total</span><br />If TextBox1 <> "" And IsNumeric(TextBox1) And _<br />TextBox2 <> "" And IsNumeric(TextBox2) Then<br />TextBox3 = TextBox1 * TextBox2<br />End If<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub CommandButton1_Click()<br /><span style="color:#009900;">'Desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'Miramos en qué fila está el producto<br />'seleccionado en el ComboBox, y le sumaremos<br />'4 porque empezamos los productos en la fila<br />'5 (celda B5). Sumaremos también un 1, porque<br />'los elementos del combobox empiezan a numerarse<br />'desde cero. Con lo cual sumaremos 4 + 1 = 5.<br />'Seleccionaremos esa fila, de la columna B, es<br />'decir, de la columna 2 (el producto)</span><br />Cells(ComboBox1.ListIndex + 5, 2).Select<br /><span style="color:#009900;">'grabamos los datos modificados<br />'comenzando con la cantidad</span><br />ActiveCell.Offset(0, 1) = CDbl(TextBox1)<br /><span style="color:#009900;">'el precio unitario</span><br />ActiveCell.Offset(0, 2) = CDbl(TextBox2)<br /><span style="color:#009900;">'y ahora el precio total</span><br />ActiveCell.Offset(0, 3) = CDbl(TextBox3)<br /><span style="color:#009900;">'limpiamos los datos</span><br />ComboBox1.Clear<br />TextBox1 = ""<br />TextBox2 = ""<br />TextBox3 = ""<br /><span style="color:#009900;">'ponemos el focus en el TextBox1</span><br />TextBox1.SetFocus<br /><span style="color:#009900;">'protegemos la hoja</span><br />ActiveSheet.Protect<br />End Sub<br /></td></tr><br /></table><br /><table class="tablavba"><tr><td>Private Sub CommandButton2_Click()<br /><span style="color:#009900;">'Desprotegemos la hoja</span><br />ActiveSheet.Unprotect<br /><span style="color:#009900;">'borramos esa línea entera</span><br />Selection.EntireRow.Delete<br /><span style="color:#009900;">'reiniciamos los datos del formulario</span><br />ComboBox1.Clear<br />TextBox1 = ""<br />TextBox2 = ""<br />TextBox3 = ""<br />End Sub<br /></td></tr><br /></table><br />Desde aquí podéis <a href="http://www.mediafire.com/?p5lmhn47alxl3vx" rel="nofollow" target="_blank">descargar el fichero</a>, con el ejemplo que hemos visto en este artículo.El pilt®afilla - www.3piesalgato.comhttp://www.blogger.com/profile/17515836395057154507noreply@blogger.com23