<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4832124315378145262</id><updated>2012-01-24T00:47:17.538-08:00</updated><category term='Gráficos'/><category term='Fórmulas y funciones'/><category term='Vídeos'/><category term='Estadística'/><category term='Formato'/><category term='Macros y VBA'/><category term='Funciones definidas por el usuario'/><category term='General'/><category term='Tablas dinámicas'/><category term='Trucos'/><category term='Econometría y finanzas'/><title type='text'>EXCELPATAS</title><subtitle type='html'>DEJE QUE EXCEL HAGA EL TRABAJO SUCIO</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-5714758821921716824</id><published>2011-09-07T18:13:00.000-07:00</published><updated>2011-09-07T18:51:51.031-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Archivo de Excel que se elimina a sí mismo</title><content type='html'>Hace poco, hugotron, un usuario del foro de &lt;a href="http://www.mundoexcel.com/" target="_blank"&gt;mundoexcel&lt;/a&gt;, preguntó&amp;nbsp;allí (&lt;a href="http://www.mundoexcel.com/php/detalle_pregunta.php" target="_blank"&gt;Archivo suicida&lt;/a&gt;)&amp;nbsp;por la posibilidad de lograr que un archivo se elimine a sí mismo. El tema fue cerrado con una única respuesta, por parte del mismo hugotron. La respuesta no es muy alentadora:
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;
Bueno, contestando a mi propia pregunta, no es posible que un archivo sea eliminado por una macro contenida en el propio archivo.
&lt;/br&gt;
&lt;/br&gt;
La lógica es la siguiente, todo el código que se ejecuta desde el Módulo de un archivo deja de ejecutarse cuando el archivo es cerrado, y un archivo abierto no puede ser eliminado, así que al incluir cualquier línea de código VBA después de una línea que cierre el archivo desde el cual se está ejecutando una macro, resultará en la interrupción automática e inmediata del código.
&lt;/blockquote&gt;
La respuesta parace ser la correcta, pero esto no quiere decir que no se pueda encontrar una solución alternativa. &lt;br /&gt;
&lt;br /&gt;
Mis primeras ideas pasaron por enviar comandos a la consola de comandos. Hice algunas pruebas con el comando "at", que permite programar tareas a horas especificadas. Sin embargo, los resultados no fueron los esperados.

&lt;br /&gt;
&lt;br /&gt;
Otra idea que no probé podría ser la de tener un libro alternativo con una macro que se ejecute&amp;nbsp;con "ontime" pasados unos segundos después de cerrar el archivo que se quiere eliminar y lo elimine. Sin embargo, esto puede resultar un poco más complicado que la solución que planteo, que me parece es eficiente y sencilla.

&lt;br /&gt;
&lt;br /&gt;
Como bien lo dice hugotron, "no es posible que un archivo sea eliminado por una macro contenida en el propio archivo". Esto no quiere decir que no podamos eliminarlos desde otro lado, como otro libro o, en este caso, un VBScript que se crea en tiempo de ejecución dentro de la misma macro, se ejecuta, espera a que el libro se cierre y lo borra.

El código, ampliamente comentado, es el siguiente:

&lt;br /&gt;
&lt;pre&gt;
'  El siguiente procedimiento crea un archivo .vbs que
'  se ejecuta antes de cerrar el libro.
'  Dicho script, una vez ejecutado, espera el tiempo indicado
'  en la constante TIEMPO_ESPERA_CIERRE_ARCHIVO_SEG para luego
'  pasar a eliminar el archivo una vez se encuentre cerrado.
'  Al final siempre quedará como residuo el vbScript que sólo
'  contiene tres líneas de código y el archivo que contenga 
'  este código se habrá borrado.

'  Creado por: Mauricio Robayo, AKA mjrofra
'  http://excelpatas.blogspot.com/2011/09/archivo-que-se-elimina-si-mismo.html
'  7 de septiembre de 2011

Sub Matarme_con_VBscript()


    '  Variable que almacena la ruta y el nombre
    '  del archivo .vbs que va a borrar este archivo.
    Dim VBScript As String
    
    
    '  Tiempo, en segundos, que se va a dar de
    '  espera mientras se cierra el archivo.
    '  Es necesario dar un tiempo de espera para
    '  asegurarse de que el archivo ha sido cerrado.
    '  Si el script se ejecuta con el archivo
    '  abierto, no se podrá borrar el archivo.
    '  En este caso, el tiempo de espera es de 2 segundos.
    Const TIEMPO_ESPERA_CIERRE_ARCHIVO_SEG = 2
    
    
    '  Si el archivo ha sido grabado por el usuario, tendrá una ruta.
    '  De lo contrario, la ruta se encontrará vacia y no será
    '  necesario borrar el archivo depués de cerrarlo pues ya
    '  no existirá.
    If ThisWorkbook.Path &amp;lt;&amp;gt; vbNullString Then
    
    
    
        '  Almacena la ruta y el nombre que se la va a dar al script.
        '  En este caso se usa la carpeta temporales, para evitar
        '  dejar rastros evidentes:
        VBScript = VBA.Environ$("Temp") &amp;amp; Application.PathSeparator &amp;amp; "MatarLibro.vbs"
    
    
    
        '  Crea el VBScript para borrar este archivo
        Open VBScript For Output As #1
        
        Print #1, "Set obj = CreateObject(""Scripting.FileSystemObject"")"
        Print #1, "WScript.sleep " &amp;amp; TIEMPO_ESPERA_CIERRE_ARCHIVO_SEG * 1000
        Print #1, "obj.DeleteFile """ &amp;amp; ThisWorkbook.FullName &amp;amp; """"
        
        Close #1

        
        
        '  Ejecuta el VBScript para borrar este archivo
        Shell "cmd /c " &amp;amp; VBScript

    
    End If
    
    
    
    '  Cierra el libro sin guardar cambios.
    ThisWorkbook.Close False
    


End Sub&lt;/pre&gt;
&lt;/br&gt;
Esta macro deberá ser llamada cuando se quiera borrar el archivo que la contiene. La macro creará un archivo vbscript (.vbs) que se ejecutará inmediatamente, esperará unos segundos (los que se le indiquen) a que cierre el archivo y luego pasará a eliminarlo sin dejar rastro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-5714758821921716824?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/5714758821921716824/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/09/archivo-que-se-elimina-si-mismo.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5714758821921716824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5714758821921716824'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/09/archivo-que-se-elimina-si-mismo.html' title='Archivo de Excel que se elimina a sí mismo'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-5710958612866714630</id><published>2011-08-17T20:56:00.000-07:00</published><updated>2011-08-17T21:06:16.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Estadística'/><title type='text'>Diagrama de caja y bigotes (box and whisker) en Excel II</title><content type='html'>Antes que nada agradecer a quienes participaron en la primera publicación de Diagrama de caja y bigotes con Excel.&lt;br /&gt;
&lt;br /&gt;
En la primera versión, &lt;a href="http://excelpatas.blogspot.com/2011/01/diagrama-de-caja-y-bigotes-box-and.html#more"&gt;Diagrama de caja y bigotes (box and whisker) en Excel&lt;/a&gt;, algunos lectores a quienes les agradezco, se tomaron el tiempo de descargar y probar el archivo. Dos errores fueron reportados:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;span style="color: #660000;"&gt;Error I:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;Hola, me he descargado el archivo, que tiene muy buena pinta, le he dado al  botón y me ha salido un mensaje de Visual Basic de Error de compilación en  &lt;br /&gt;
---------------------------&lt;br /&gt;
Microsoft Visual  Basic&lt;br /&gt;
---------------------------&lt;br /&gt;
Error de compilación:&lt;br /&gt;
&lt;br /&gt;
No se puede  encontrar el proyecto o la biblioteca&lt;br /&gt;
&lt;br /&gt;
y en color azul esta linea del  código:&lt;br /&gt;
ReDim arrdatos(1 To lngVariables) As Variant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y antes, en  amarillo:&lt;br /&gt;
Public Sub CrearBoxPlot(ByRef Datos As Excel.Range, _&lt;br /&gt;
ByVal  Encabezados As Boolean, _&lt;br /&gt;
ByVal FactorRIC As Double, _&lt;br /&gt;
ByVal Atipicos As  Boolean, _&lt;br /&gt;
ByVal Mediana As Boolean, _&lt;br /&gt;
ByVal Media As Boolean)&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;span style="color: #660000;"&gt;Error II:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;Aparece un error "1004" de depuración al tratar de generar el diagrama de  cajas y bigotes con una sola serie de datos, es decir al tomar solamente una  columna. Espero mi estimado que tome en cuenta esto. Nuevamente gracias por el  aporte. &lt;span class="interaction-iframe-guide"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
Creo poder afirmar que ambos errores se solucionan en esta nueva versión. Todo el código, como siempre, es abierto.&lt;br /&gt;
&lt;br /&gt;
Agradezco una vez más cualquier comentario reportando cualquier otro error que pueda aparecer.&lt;br /&gt;
&lt;br /&gt;
El archivo puede ser descargado acá: &lt;a href="https://sites.google.com/site/excelpatas/archivador-2/Diagramas_de_Caja2.xls?attredirects=0&amp;amp;d=1"&gt;Diagramas_de_Caja2.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Aunque últimamente he tenido abandonado el blog pues no he tenido mucho tiempo, espero pronto poder subir ya una versión inicial para descargar como complemento, de manera gratuita y&amp;nbsp;con el código disponible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-5710958612866714630?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/5710958612866714630/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/08/digrama-de-caja-y-bigotes-ii.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5710958612866714630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5710958612866714630'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/08/digrama-de-caja-y-bigotes-ii.html' title='Diagrama de caja y bigotes (box and whisker) en Excel II'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7622663353763987296</id><published>2011-02-13T15:57:00.000-08:00</published><updated>2011-02-13T16:32:44.078-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Ordenar las hojas de un libro de Excel</title><content type='html'>Es frecuente encontrarse con libros llenos de hojas cuyos nombres corresponden a números. También es frecuente encontrarse con libros que tienen las pestañas de sus hojas de distintos colores. En el primer de los casos, por lo general buscamos tener las hojas ordenadas. En el segundo, buscamos tener las hojas agrupadas por color. Las macros que se presentan a continuación permiten hacer esto fácilmente.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Para ordenar hojas numeradas se puede usar una macro como esta, que se basa en el algoritmo de ordenamiento burbuja (buble sort). No he probado la macro exhaustivamente, pero parece arrojar buenos resultados (tenga en cuenta que las hojas con nombres no numéricos serán tratados por la macro como de valor 0 (cero). Si desea excluir una o varias hojas de la ordenación, haga uso de los argumentos &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Desde&lt;/span&gt; y &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Hasta&lt;/span&gt; como se indica más adelante) :&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Public Sub OrdenarHojas(ByVal Desde As Long, ByVal Hasta As Long)


    Dim i As Long
    Dim j As Long
    
    
    For i = Desde To Hasta - 1
    
        For j = i + 1 To Hasta
            
            If VBA.Val(Sheets(i).Name) &amp;gt; VBA.Val(Sheets(j).Name) Then
                
                Sheets(j).Move before:=Sheets(i)
                
            End If
            
        Next j
    
    Next i
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Para agrupar las hojas por el color de sus pestañas, pruebe con esta macro:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Public Sub AgruparColorHojas(ByVal Desde As Long, ByVal Hasta As Long)

    
    Dim i As Long
    Dim j As Long
    
    
    For i = Desde To Hasta
    
        For j = i + 1 To Hasta
        
            If Sheets(i).Tab.ColorIndex = Sheets(j).Tab.ColorIndex Then
                
                Sheets(j).Move after:=Sheets(i)
                
            End If
    
        Next j
    
    Next i
    

End Sub&lt;/pre&gt;&lt;br /&gt;
Puede llamar las macros indicando de qué hoja a qué hoja quiere ordenar o agrupar, por ejemplo, para agrupar todas las hojas de un libro, podría usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    &lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;OrdenarHojas Desde:=1, Hasta:=Sheets.Count&lt;/span&gt;
    
    Application.ScreenUpdating = True
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Observe que estoy desactivando la actualización de pantalla antes de pasar a ordenar las hojas, ya que el procedimiento OrdenarHojas, al ir moviendo las hojas de una posición a otra, puede ser lento y si no se desactiva la actualización de pantalla se notará cómo se van cambiando de posición las hojas.&lt;br /&gt;
&lt;br /&gt;
Tenga en cuenta que puede combinar ambas macros para lograr resultados combinados. Suponiendo que tiene hojas con nombres numéricos y con colores, y desea tanto ordenarlas como agruparlas, podría probar con:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    &lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;OrdenarHojas Desde:=1, Hasta:=Sheets.Count&lt;/span&gt;
    &lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;AgruparColorHojas Desde:=1, Hasta:=Sheets.Count&lt;/span&gt;
    
    Application.ScreenUpdating = True
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Esto dará como resultado las hojas agrupadas por color y ordenadas para cada color.&lt;br /&gt;
&lt;br /&gt;
También observe que puede ordenar sólo un rango de hojas, suponiendo que no quiere ordenar o agrupar las dos primeras hojas, podría probar con:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    &lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;OrdenarHojas &lt;span class="Apple-style-span"&gt;Desde:=&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;, Hasta:=Sheets.Count&lt;/span&gt;&lt;/span&gt;
    
    Application.ScreenUpdating = True
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Al usar &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sheets.Count&lt;/span&gt; se está indicando que se ejecute hasta el total de hojas en el libro activo. Si, por ejemplo, quisiera ordenar todas las hojas sin incluir la última, podría usar:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Sub prueba()
    
    
    Application.ScreenUpdating = False
    
    &lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;OrdenarHojas &lt;span class="Apple-style-span"&gt;Desde:=1, Hasta:=Sheets.Count &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;- 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    
    Application.ScreenUpdating = True
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Con una ligera modificación se puede usar la macro &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;OrdenarHojas&lt;/span&gt; para que ordene hojas con nombres no numéricos, por ejemplo: "C", "D", "A", que pasaría a ser "A", "C", "D" tras ejecutar la macro:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Public Sub OrdenarHojas(ByVal Desde As Long, ByVal Hasta As Long)


    Dim i As Long
    Dim j As Long


    For i = Desde To Hasta - 1

        For j = i + 1 To Hasta

            If &lt;span class="Apple-style-span" style="color: blue;"&gt;Sheets(i).Name&lt;/span&gt; &amp;gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;Sheets(j).Name&lt;/span&gt; Then

                Sheets(j).Move before:=Sheets(i)

            End If

        Next j

    Next i


End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7622663353763987296?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7622663353763987296/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/02/ordenar-o-agrupar-por-color-las-hojas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7622663353763987296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7622663353763987296'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/02/ordenar-o-agrupar-por-color-las-hojas.html' title='Ordenar las hojas de un libro de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-8408926922077349698</id><published>2011-01-16T16:09:00.000-08:00</published><updated>2011-08-26T18:16:43.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Estadística'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Diagrama de caja y bigotes (box and whisker) en Excel</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_eDfEXcxBNuk/TTOQUEDt_9I/AAAAAAAAAS8/DxSjxp3PGXw/s1600/XL2003.png" imageanchor="1"&gt;&lt;img border="0" height="302" src="http://2.bp.blogspot.com/_eDfEXcxBNuk/TTOQUEDt_9I/AAAAAAAAAS8/DxSjxp3PGXw/s320/XL2003.png" style="border: 1px solid maroon;" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
Es fácil encontrar en la red algunos tutoriales para realizar en Excel diagramas de caja y bigotes (que de ahora en adelante llamaré simplemente diagramas de caja o boxplot).&lt;br /&gt;
&lt;br /&gt;
Sin embargo, la gran mayoría de los tutoriales que se encuentran, tanto en inglés como en español, explican como hacer un diagrama de caja usando los máximos y los mínimos. No he encontrado ninguno que explique cómo realizar un diagráma de caja que se base en el rango intercuartílico y que además explique como trazar los datos atípicos.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Por ello, he estado trabajando en el código para crear en Excel un diagrama de caja con todas las de la ley. Espero terminar de depurar pronto y subirlo como un complemento, sin restricciones para consultar o modificar el código y de uso gratuito (al parecer, todas las utilidades que se encuentran en la red para graficar Boxplots de manera profesional tiene costo. Quizás el más popular sea el &lt;a href="http://peltiertech.com/Utility/BoxPlotUtility.html" target="_nlank"&gt;PTS&amp;nbsp;Box and Whisker Chart Utility&lt;/a&gt;&amp;nbsp;&amp;nbsp;de Jon Peltier).&lt;br /&gt;
&lt;br /&gt;
Para entender los parametros predeterminados que he puesto en el formulario, es necesario entender cómo se grafica un diagrama de caja:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;La caja cubre el 50% de los datos, siendo su parte superior el cuartil 1 (Q1) y la parte inferior el cuartil 3 (Q3).&lt;/li&gt;
&lt;li&gt;La caja presenta un línea en la mitad que corresponde al cuartil 2 o mediana y permite identificar facilmente si existe sesgo en los datos.&lt;/li&gt;
&lt;li&gt;Los bigotes (whiskers) muestran los valores máximos y mínimos, a menos que hayan datos atípicos, que son aquellos que están más allá de 1.5 veces el rango intercualtílico (Q3 - Q1).&lt;/li&gt;
&lt;li&gt;En caso de existir atípicos, los bigotes corresponder al dato más cercano a 1.5 veces el rango intercuartílico y los datos atípicos se presentan como puntos más allá de los bigotes.&lt;/li&gt;
&lt;li&gt;Se puede graficar la media como un diamante en la caja.&lt;/li&gt;
&lt;/ol&gt;El archivo contiene un formulario, tras cargarlo, el formulario permite configurar las características que queramos para el diagrama de caja.&amp;nbsp;Por defecto, se mostrará el diagrama de caja como se explicó anteriormente, pero sin incluir el diamante para la media. Si se quiere ver la media, basta con seleccionarla en el formulario.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_eDfEXcxBNuk/TTODn773VPI/AAAAAAAAASs/6-ss0Er24cM/s1600/BoxPlot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_eDfEXcxBNuk/TTODn773VPI/AAAAAAAAASs/6-ss0Er24cM/s400/BoxPlot.png" width="260" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
He contrastado el resultado producido con Excel por el producido con R (&lt;a href="http://www.r-project.org/"&gt;http://www.r-project.org/&lt;/a&gt;). El siguiente es el gráfico arrojado por R y el arrojado por Excel (usando el motor gráfico de Excel 2003).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_eDfEXcxBNuk/TTOMpkusQiI/AAAAAAAAAS0/8t_qLqKTWhk/s1600/Comparaci%25C3%25B3n.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://3.bp.blogspot.com/_eDfEXcxBNuk/TTOMpkusQiI/AAAAAAAAAS0/8t_qLqKTWhk/s640/Comparaci%25C3%25B3n.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Al parecer, el resultad obtenido con el código en Excel es bastante preciso. Sin embargo, antes de afirmar que el código funciona correctamente, agradezco a quien pueda descargar el archivo y hacer algunas pruebas con él, para identificar errores y publicarlos en los comentarios. Yo continuaré en la tarea de depurar el código para dejar el complemento listo para usar.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: red;"&gt;&lt;strong&gt;Gracias a todos los que participaron en la sección de comentarios. He publicado una nueva entrada con la última versión en la que se da solución (espero) a los errores&amp;nbsp;reportados:&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://excelpatas.blogspot.com/2011/08/digrama-de-caja-y-bigotes-ii.html" target="_blank"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;Diagrama de caja y bigotes con Excel II&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-8408926922077349698?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/8408926922077349698/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/01/diagrama-de-caja-y-bigotes-box-and.html#comment-form' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8408926922077349698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8408926922077349698'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/01/diagrama-de-caja-y-bigotes-box-and.html' title='Diagrama de caja y bigotes (box and whisker) en Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eDfEXcxBNuk/TTOQUEDt_9I/AAAAAAAAAS8/DxSjxp3PGXw/s72-c/XL2003.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4019624581241896019</id><published>2011-01-13T11:55:00.000-08:00</published><updated>2011-01-15T08:23:46.921-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Copiar valores y conservar el formato dado mediante formato condicional</title><content type='html'>La siguiente macro permite copiar como valores todas las fórmulas en las celdas que usan formato condicional, permitiendo además conservar el formato dado por medio de formato condicional, pero ahora de manera estática, simplemente como formato de celda.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;La macro se basa en un truco publicado por "sagrat" en el foro de Ayuda Excel:&amp;nbsp;&lt;a href="http://www.ayudaexcel.com/foro/showthread.php?t=15838&amp;amp;highlight=word"&gt; Pegar color del formato condicional&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Sagrat menciona que se puede copiar el rango de datos con formato condicional a Word y luego copiarlo de vuelta a Excel, lo que hace que el formato dado por el formato condicional quede como formato de celda.&lt;br /&gt;
&lt;br /&gt;
La macro, que se basa en este truco, crea una instancia invisible de Word y pasa a copiar a Word e inmediatamente a copiar de vuelta a Excel las celdas con formato condicional de cada una de las hojas del libro activo. Esto tiene 3 efectos:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Convierte todas las fórmulas de las celdas con formato condicional de cada hoja del libro activo a valores;&lt;/li&gt;
&lt;li&gt;Convierte el formato condicional de todas las celdas con formato condicional de cada hoja del libro activo a formato de celda;&lt;/li&gt;
&lt;li&gt;Usa la precisión visible en la celda. Es decir, si la celda con formato condicional tiene formato para mostrar dos decimales, pero el valor en la celda tiene más de dos decimales, tras ejecutar la macro, el valor resultante sólo tendrá los dos decimales visibles, perdiéndose los demás.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;pre&gt;Sub BorrarFormatoCondicional_LibroActivo()


    Dim WordApp As Object
    Dim wsHoja As Excel.Worksheet
    Dim rngArea As Excel.Range
    Dim rngCeldasFormatoCondicional As Excel.Range
    
    
    On Error GoTo err_BorrarFormatoCondicional
    
    
    With Application
        .ScreenUpdating = False
        .StatusBar = "Creando instancia de Word..."
    End With
    
    
    Set WordApp = CreateObject("Word.Application")
    
    
    For Each wsHoja In ActiveWorkbook.Worksheets
    

        Set rngCeldasFormatoCondicional = wsHoja.UsedRange.SpecialCells(xlCellTypeAllFormatConditions)

    
        If Not rngCeldasFormatoCondicional Is Nothing Then
        
            wsHoja.Select
    
            For Each rngArea In rngCeldasFormatoCondicional.Areas
        
                With rngArea
                    .Select
                    .Copy
                End With
                
                With WordApp
                    .documents.Add
                    With .Selection
                        .PasteSpecial
                        .wholestory
                        .Copy
                        .Delete
                    End With
                End With

                wsHoja.PasteSpecial "HTML"
                
            Next rngArea
              
        End If
        
    Next wsHoja
    
    
Salir:
    
    If Not WordApp Is Nothing Then
        WordApp.Quit False
        Set WordApp = Nothing
    End If
    
    With Application
        .StatusBar = False
        .ScreenUpdating = True
    End With
    
    Exit Sub
    
    
err_BorrarFormatoCondicional:
    
    If Err.Number = 1004 Then
        Resume Next
    Else
        MsgBox "Error " &amp;amp; Err.Number &amp;amp; ": " &amp;amp; Err.Description, vbCritical, Err.Source
        Resume Salir
    End If
    
    
End Sub
&lt;/pre&gt;&lt;br /&gt;
Si sólo se desea copiar uno o varios rangos de una hoja, se puede probar de la siguiente forma, seleccionando cuando la macro lo pida los rangos en cuestión:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub BorrarFormatoCondicional_Seleccion()


    Dim WordApp As Object
    Dim rngTrabajo As Excel.Range
    Dim rngArea As Excel.Range
    Dim rngCeldasFormatoCondicional As Excel.Range
    
    
    On Error GoTo err_BorrarFormatoCondicional
    

    Set rngTrabajo = Application.InputBox(Prompt:="Por favor, seleccione el rango de celdas con el que desea trabajar.", _
                                          Title:="Fijar formato condicional", _
                                          Type:=8)
                                       
    Application.ScreenUpdating = False
    
    Set rngCeldasFormatoCondicional = rngTrabajo.SpecialCells(xlCellTypeAllFormatConditions)

    If Not rngCeldasFormatoCondicional Is Nothing Then
                      
        Set WordApp = CreateObject("Word.Application")
        
        For Each rngArea In rngCeldasFormatoCondicional.Areas
    
            With rngArea
                .Select
                .Copy
            End With
            
            With WordApp
                .documents.Add
                With .Selection
                    .PasteSpecial
                    .wholestory
                    .Copy
                    .Delete
                End With
            End With

            Selection.Parent.PasteSpecial "HTML"

        Next rngArea
                    
        Set rngCeldasFormatoCondicional = Nothing
        
    End If
        
    
    
Salir:
    
    If Not WordApp Is Nothing Then
        WordApp.Quit False
        Set WordApp = Nothing
    End If
    
    Application.ScreenUpdating = True
    
    Exit Sub
    
    
err_BorrarFormatoCondicional:
    
    If Err.Number &lt;&gt; 424 Then
        MsgBox "Error " &amp; Err.Number &amp; ": " &amp; Err.Description, vbInformation, Err.Source
    End If
    
    Resume Salir
    
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4019624581241896019?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4019624581241896019/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/01/copiar-valores-y-conservar-el-formato.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4019624581241896019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4019624581241896019'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/01/copiar-valores-y-conservar-el-formato.html' title='Copiar valores y conservar el formato dado mediante formato condicional'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-1306200103488518397</id><published>2011-01-06T19:07:00.000-08:00</published><updated>2011-01-15T21:53:29.992-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>¿Qué es un arreglo en programación?</title><content type='html'>El uso de la palabra arreglo en programación como traducción de la palabra &lt;i&gt;array &lt;/i&gt;se ha difundido ampliamente. Desafortunadamente, esto no&lt;i&gt;&amp;nbsp;&lt;/i&gt;es más que una pésima y lastimosa traducción que no corresponde en significado con el original en inglés.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Al parecer, algunos traductores que no supieron cómo volcar al español la palabra inglesa &lt;i&gt;array&lt;/i&gt;, decidieron, por similitud fonética (pero sin ninguna similitud semántica) usar la palabra arreglo. Gracias a ese pésimo trabajo de traducción (y descuidado trabajo de edición), se ha difundido su uso sin que esto quiera decir que sea correcto.&lt;br /&gt;
&lt;br /&gt;
La palabra arreglo no guarda ninguna equivalencia semántica con la inglesa &lt;i&gt;array&lt;/i&gt;. Quizás una traducción más cercana, aunque no precisa, pudiera ser conjunto.&lt;br /&gt;
&lt;br /&gt;
En su sexta acepción, según el &lt;a href="http://buscon.rae.es/" target="_blank"&gt;Diccionario de la Lengua Española de la Real Academía&lt;/a&gt;, conjunto se define como:&lt;br /&gt;
&lt;blockquote class="X1"&gt;Totalidad de los elementos o cosas poseedores de una propiedad común, que los distingue de otros; p. ej., los números pares.&lt;/blockquote&gt;Sin embargo, conjunto suena demasiado simple como traducción de &lt;i&gt;array &lt;/i&gt;y parece que a muchos no nos gusta recurrir a lo simple cuando nos expresamos, sino que preferimos usar términos oscuros que impresionen y confundan a nuestra audiencia, así sean un disparate completo en el contexto en el que los usamos.&lt;br /&gt;
&lt;br /&gt;
Quizás lo mejor sea conservar la palabra &lt;i&gt;array &lt;/i&gt;como se conserva la palabra software o hardware a falta de una palabra en español que las reemplace, pero no atropellar al español traduciéndola como arreglo.&lt;br /&gt;
&lt;br /&gt;
Las palabras software y hardware&amp;nbsp;ya han sido incorporadas como anglicismos al idioma español. Quizás pronto se incorpore la palabra &lt;i&gt;array &lt;/i&gt;como otro anglicismo, aunque como vamos, los académicos de nuestra lengua van a tener que crear una nueva acepción para la palabra arreglo.&lt;br /&gt;
&lt;br /&gt;
Mientras tanto, puede usted mismo consultar en el &lt;a href="http://buscon.rae.es/draeI/" target="_blank"&gt;Diccionario de la Lengua Española&lt;/a&gt; el significado de arreglo, para que trate de descifrar según sus distintas acepciones qué es lo que alguien quiere decir cuando se refiere, por ejemplo, a un arreglo de enteros:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;1. m. Acción y efecto de arreglar.&lt;br /&gt;
2. m. Regla, orden, coordinación.&lt;br /&gt;
3. m. Avenencia, conciliación.&lt;br /&gt;
4. m. Transformación de una obra musical para poder interpretarla con instrumentos o voces distintos a los originales.&lt;br /&gt;
5. m. coloq. amancebamiento.&lt;br /&gt;
~ de cuentas.&lt;br /&gt;
1. m. Acto de tomarse la justicia por su mano o vengarse.&lt;br /&gt;
~ parroquial.&lt;br /&gt;
1. m. Reforma de las categorías y demarcaciones de las parroquias de una diócesis.&lt;br /&gt;
con ~ a.&lt;br /&gt;
1. loc. prepos. Conformemente con, según.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-1306200103488518397?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/1306200103488518397/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/01/que-es-un-arreglo-en-programacion.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1306200103488518397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1306200103488518397'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/01/que-es-un-arreglo-en-programacion.html' title='¿Qué es un arreglo en programación?'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-1769010351732280275</id><published>2011-01-03T18:12:00.000-08:00</published><updated>2011-01-03T18:47:24.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Borrar todas los vínculos (referencias) a otros archivos de Excel</title><content type='html'>La siguiente macro elimina todos los vínculos (referencias) a otro archivo de Excel, dejando sólo el valor resultante:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub BorrarVinculosOtrosArchivos_XL()
    
    
    Dim lks As Variant
    Dim i As Long
    
    
    With ActiveWorkbook
        
        lks = .LinkSources(xlExcelLinks)
        
        If IsEmpty(lks) Then
        
            MsgBox "No hay vínculos para borrar."
            
        Else
        
            For i = LBound(lks) To UBound(lks)
                .BreakLink lks(i), xlExcelLinks
            Next i
            
        End If
        
    End With
    
    
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-1769010351732280275?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/1769010351732280275/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2011/01/macro-para-borrar-todas-los-vinculos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1769010351732280275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1769010351732280275'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2011/01/macro-para-borrar-todas-los-vinculos.html' title='Borrar todas los vínculos (referencias) a otros archivos de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-5102656699745337095</id><published>2010-12-27T09:15:00.000-08:00</published><updated>2011-01-03T18:52:17.352-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Convertir a valores todas las fórmulas de un libro de Excel</title><content type='html'>La siguiente macro convierte a valores todos las fórmulas de todas las hojas de un libro, dejando sólo el resultado:&lt;br /&gt;
&lt;pre&gt;Sub Convertir_a_valores()


    Dim wshHoja As Excel.Worksheet
   

    For Each wshHoja In ThisWorkbook.Worksheets
   
        wshHoja.UsedRange.Value = wshHoja.UsedRange.Value     
   
    Next wshHoja


End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-5102656699745337095?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/5102656699745337095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/12/convertir-valores-todas-las-formulas-de.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5102656699745337095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5102656699745337095'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/12/convertir-valores-todas-las-formulas-de.html' title='Convertir a valores todas las fórmulas de un libro de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-1149761770651920179</id><published>2010-12-24T18:22:00.000-08:00</published><updated>2010-12-24T19:05:46.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Econometría y finanzas'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Análisis técnico con Excel: Promedio móvil simple, exponencial y MACD</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_eDfEXcxBNuk/TRVa2Vva8GI/AAAAAAAAASg/GsuZTRmD7vY/s1600/Tech_Analysis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_eDfEXcxBNuk/TRVa2Vva8GI/AAAAAAAAASg/GsuZTRmD7vY/s1600/Tech_Analysis.png" style="border-bottom-color: maroon; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: maroon; border-left-style: solid; border-left-width: 1px; border-right-color: maroon; border-right-style: solid; border-right-width: 1px; border-top-color: maroon; border-top-style: solid; border-top-width: 1px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;En el siguiente archivo se presentan los cálculos correspondientes para obtener un promedio móvil simple y uno exponencial (no centrados), así como el MACD (convergencia / divergencia de promedios móviles).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;De igual forma, se presenta el gráfico de velas japonesas con los indicadores para realizar el análisis de la acción del precio correspondiente. Para desarrollarlo he descargado datos de Yahoo Finance para Google Inc.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;En las celdas amarillas se pueden modificar los parámetros para las medias y para el MACD (que se calcula a partir de dos promedios móviles exponenciales).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://sites.google.com/site/excelpatas/archivador-2/An%C3%A1lisist%C3%A9cnico.xls?attredirects=0&amp;amp;d=1"&gt;Análisis técnico.xls&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-1149761770651920179?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/1149761770651920179/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/12/analisis-tecnico-con-excel-promedio.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1149761770651920179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1149761770651920179'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/12/analisis-tecnico-con-excel-promedio.html' title='Análisis técnico con Excel: Promedio móvil simple, exponencial y MACD'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_eDfEXcxBNuk/TRVa2Vva8GI/AAAAAAAAASg/GsuZTRmD7vY/s72-c/Tech_Analysis.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3006036730392988757</id><published>2010-12-20T09:07:00.000-08:00</published><updated>2011-11-02T22:50:29.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Funciones definidas por el usuario'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Concatenar celdas en un rango de Excel</title><content type='html'>La siguiente Función Definida por el Usuario (UDF) permite concatenar un rango de celdas en una fila o una columna en una sola celda con el separador que se le indique.&lt;br /&gt;
&lt;br /&gt;
Este tipo de función resulta útil pues la función Concatenar de Excel no es muy flexible y no es muy práctica para este tipo de trabajo. Si se tienen, por ejemplo, 100 o más celdas en una columna y se quieren concatenar usando el punto y coma, no resultaría nada práctico usar algo como =Concatenar(a1,";",a2,";",a3, ... ";",a100).&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Public Function Concat1(ByVal Rango As Excel.Range, ByVal Sep As String) As String
&amp;nbsp;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim Datos As Variant
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp; &amp;nbsp;Datos = Rango.Value
&amp;nbsp;
&amp;nbsp;&amp;nbsp; &amp;nbsp;If UBound(Datos, 1) &amp;gt; 1 Then
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Concat1 = VBA.Join(Application.Transpose(Datos), Sep)
&amp;nbsp;&amp;nbsp; &amp;nbsp;Else
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Concat1 = VBA.Join(Application.Index(Datos, 1, 0), Sep)
&amp;nbsp;&amp;nbsp; &amp;nbsp;End If
&amp;nbsp;&amp;nbsp; 
End Function&lt;/pre&gt;&lt;br /&gt;
Para llamar a la UDF siga la sintaxis:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;Concatenar(&lt;b&gt;Rango&lt;/b&gt;, &lt;b&gt;Sep&lt;/b&gt;)&lt;/blockquote&gt;&lt;br /&gt;
En donde &lt;b&gt;Rango&lt;/b&gt; es el rango de celdas y &lt;b&gt;Sep&lt;/b&gt; es el separador que desea. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=Concatenar(a1:a100,";")&lt;/blockquote&gt;&lt;br /&gt;
Tenga en cuenta que estoy usando la coma "," como separador de argumentos. Si su separador de argumentos es el punto y coma ";", entonces deberá usar algo como:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=Concatenar(a1:a100;";")&lt;/blockquote&gt;&lt;br /&gt;
La UDF expuesta anteriormente es sencilla y cumple con su cometido, pero si se desea un poco más de control sobre el rango a concatenar, se podría probar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Public Function Concat2(ByVal Rango As Excel.Range, _
                        ByVal Sep As String, _
                        Optional ByVal Orden As Integer = 1, _
                        Optional ByVal PrioridadFilas As Boolean = True) As String
 
 
    Dim Datos As Variant
    Dim Fila As Long
    Dim Columna As Long
    Dim InicioFila As Long
    Dim InicioColumna As Long
    Dim FinFila As Long
    Dim FinColumna As Long
    
   
    Datos = Rango.Value
    
    
    If Orden &gt; 0 Then 'Orden ascendente
    
        InicioFila = LBound(Datos, 1)
        InicioColumna = LBound(Datos, 2)
        FinFila = UBound(Datos, 1)
        FinColumna = UBound(Datos, 2)
    
    Else ' Orden descendente
    
        InicioFila = UBound(Datos, 1)
        InicioColumna = UBound(Datos, 2)
        FinFila = LBound(Datos, 1)
        FinColumna = LBound(Datos, 2)
    
    End If
    
     
    If PrioridadFilas Then '  Concatenar por filas
    
        For Fila = InicioFila To FinFila Step Orden
        
            For Columna = InicioColumna To FinColumna Step Orden
                
                Concat2 = Concat2 &amp; Sep &amp; Datos(Fila, Columna)
                    
            Next Columna
        
        Next Fila
    
    Else '  Concatenar por columnas
        
        For Columna = InicioColumna To FinColumna Step Orden
        
            For Fila = InicioFila To FinFila Step Orden
                
                Concat2 = Concat2 &amp; Sep &amp; Datos(Fila, Columna)
                    
            Next Fila
        
        Next Columna
    
    End If
    
    
    Concat2 = VBA.Replace(Concat2, Sep, "", 1, 1)
   
   
End Function&lt;/pre&gt;&lt;br /&gt;
Este UDF tiene la siguiente sintaxis:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;Concatenar(&lt;b&gt;Rango&lt;/b&gt;, &lt;b&gt;Sep&lt;/b&gt;, &lt;b&gt;[Orden]&lt;/b&gt;, &lt;b&gt;[PrioridadFilas]&lt;/b&gt;)&lt;/blockquote&gt;&lt;br /&gt;
Los dos últimos argumentos que incluye de más esta UDF (&lt;b&gt;Orden&lt;/b&gt; y &lt;b&gt;PrioridadFilas&lt;/b&gt;) son opcionales  e indican si se desea concatenar el rango en orden ascendente o descendente y, en caso de rangos de dos dimensiones, si se desea dar prioridad a las filas o a las columnas. &lt;br /&gt;
&lt;br /&gt;
Si se omite el argumento orden, el valor predeterminado es 1 (orden ascendente). Para indicar orden descendente use -1.&lt;br /&gt;
&lt;br /&gt;
Tenga en cuenta que cualquier valor positivo para este argumento indicará orden ascendente mientras que cualquier valor negativo indicará orden descendente. Si se ingresa 2 como valor para el argumento orden, se concatenará cada dos celdas del rango en orden ascendente, es decir, se concatenará el rango dejando una celda de por medio. Si se ingresa 3, se concatenará cada tres celdas del rango en orden ascendente, es decir dejando 2 celdas de por medio, etc. Exactamente lo mismo aplica para el orden descendente con valores negativos.&lt;br /&gt;
&lt;br /&gt;
Finalmente, el argumento opcional &lt;b&gt;PrioridadFilas&lt;/b&gt; se usará cuando se pretenda concatenar una matriz de dos dimensiones. Tenga en cuenta que la UDF propuesta inicialmente (Concat1) no acepta rangos de dos dimensiones (es decir, de más de una columna y más de una fila). Con Concat2 podrá pasar como argumento &lt;b&gt;Rango&lt;/b&gt; un rango de dos dimensiones (más de una fila y una columna. Por ejemplo: A1:C3, siendo este un rango de 3 fila por 3 columnas). El valor predeterminado es Verdadero, indicando que se concatenará primero por filas y luego por columnas. Si se indica Falso ó 0 para este argumento, se concatenarán primero las columnas y luego las filas.&lt;br /&gt;
&lt;br /&gt;
Si tiene dudas sobre cómo usar una UDF lea la sección "Para usar una Función Definida por el Usuario (FDU o UDF)" en el siguiente vínculo: &lt;a href="http://excelpatas.blogspot.com/p/que-hago-con-este-codigo.html" target="_blank"&gt;¿Qué hago con este código?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3006036730392988757?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3006036730392988757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/12/concatenar-celdas-en-un-rango-de-excel.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3006036730392988757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3006036730392988757'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/12/concatenar-celdas-en-un-rango-de-excel.html' title='Concatenar celdas en un rango de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3939123921286063861</id><published>2010-12-11T12:04:00.000-08:00</published><updated>2010-12-24T18:48:39.655-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Simulación de Monte Carlo para estimar el valor de PI</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;En el adjunto se presenta una simulación de Monte Carlo para estimar el valor de PI de acuerdo con el número de ensayos que se indique.&lt;/div&gt;&lt;br /&gt;
A su vez, se presenta tres gráficos animados.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_eDfEXcxBNuk/TQPc4qNwOcI/AAAAAAAAASQ/KwRj8hEJmXg/s1600/Est_Pi_SM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="332" src="http://1.bp.blogspot.com/_eDfEXcxBNuk/TQPc4qNwOcI/AAAAAAAAASQ/KwRj8hEJmXg/s640/Est_Pi_SM.png" width="640" style="border: 1px solid maroon;"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
El libro contiene pocas fórmulas pues casi todo está basado en código VBA.&lt;br /&gt;
&lt;br /&gt;
En el siguiente vínculo puede descargar el archivo:&amp;nbsp;&lt;a href="https://sites.google.com/site/excelpatas/archivador-2/Est_Pi_SM.xls?attredirects=0&amp;amp;d=1"&gt;Estimación de Pi mediante simulación de Monte Carlo.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3939123921286063861?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3939123921286063861/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/12/simulacion-de-monte-carlo-para-estimar.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3939123921286063861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3939123921286063861'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/12/simulacion-de-monte-carlo-para-estimar.html' title='Simulación de Monte Carlo para estimar el valor de PI'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_eDfEXcxBNuk/TQPc4qNwOcI/AAAAAAAAASQ/KwRj8hEJmXg/s72-c/Est_Pi_SM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-1896328619535548175</id><published>2010-11-25T20:54:00.000-08:00</published><updated>2010-11-26T05:24:50.326-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Mostrar todas las fórmulas de uno o varios rangos</title><content type='html'>&lt;p$1&gt;&lt;p$1&gt;El siguiente código permitirá crear una matriz mostrando la dirección, el valor y la fórmula de uno o varios rangos seleccionados. Recuerde que puede seleccionar rangos no continuos manteniendo presionado la tecla Ctrl mientras los selecciona. &lt;br /&gt;
&lt;br /&gt;
He comentado ampliamente el código para que sea fácil seguirlo y modificarlo según necesidades particulares.&lt;br /&gt;
&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;También le puede resultar de interés la función definida por el usuario que se encuentra en este otro tema: &lt;a href="http://excelpatas.blogspot.com/2010/05/mostrar-formula-en-una-celda_19.html" target="_blank"&gt;Mostrar fórmula en una celda&lt;/a&gt;.  &lt;p$1&gt;&lt;p$1&gt;&lt;a name='more'&gt;&lt;/a&gt; &lt;pre&gt;Sub MatrizValoresFormulas()
        
        
    Dim i As Long
    Dim lngTotalCeldas As Long
    Dim bytContinuar As Byte
    Dim rngCelda As Excel.Range
    Dim rngEntrada As Excel.Range
    Dim rngSalida As Excel.Range
    Dim arrResultado() As Variant
    
    '  Control de errores
    On Error GoTo err_MatrizValoresFormulas
    
    '  Asigna el rango de entrada. Se pueden seleccionar rangos
    '  no continuos manteniendo presionada la tecla Ctrl
    Set rngEntrada = Application.InputBox(prompt:="Seleccione las celdas cuya fórmula desea ver:", _
                                          Title:="Inspección", _
                                          Type:=8)
    
    '  Asigna el rango de salida a partir de una celda seleccionada
    Set rngSalida = Application.InputBox(prompt:="Seleccione una celda de salida:", _
                                         Title:="Inspección", _
                                         Type:=8)
        
    lngTotalCeldas = rngEntrada.Cells.Count
    
    ReDim arrResultado(0 To lngTotalCeldas, 1 To 3)
    
    '  Encabezados
    arrResultado(0, 1) = "Celda"
    arrResultado(0, 2) = "Valor"
    arrResultado(0, 3) = "Fórmula"
    
    '  Se construye la matriz con la dirección, el valor
    '  y la fórmula de cada celda del rango seleccionado
    For Each rngCelda In rngEntrada.Cells
        i = i + 1
        With rngCelda
        
            '  Dirección:
            '  RowAbsolute y ColumnAbsolute: Usar True para ref Absolutas ($A$1) y False para relativas (A1)
            '  ReferenceStyle: Usar xlA1 para ref tipo A1 y xlR1C1 para referencias tipo R1C1
            '  External: Usar True para mostrar la referencia completa (incluida la hoja y el libro) y False
            '            para mostrar solo la dirección de la celda
            arrResultado(i, 1) = .Address(RowAbsolute:=True, _
                                          ColumnAbsolute:=True, _
                                          ReferenceStyle:=xlA1, _
                                          External:=True)
                                          
            '  Valor
            arrResultado(i, 2) = .Value
            
            '  Fórmula de la celda
            If .HasFormula Then
                '  Si la celda tiene fórmula
                If .HasArray Then
                    '  Si es matricial encierra la fórmula entre {}
                    arrResultado(i, 3) = "{" &amp;amp; .FormulaLocal &amp;amp; "}"
                Else
                    '  De lo contrario, copia la fórmula
                    arrResultado(i, 3) = "'" &amp;amp; .FormulaLocal
                End If
            Else
                '  Si la celda no tiene fórmula devuelve #N/A
                arrResultado(i, 3) = VBA.CVErr(xlErrNA)
            End If
            
        End With
        
    Next rngCelda
    
    With rngSalida.Areas(1)
    
        bytContinuar = vbYes

        '  Verifica que no se vayan a borrar datos existentes en el rango de salida
        With .Resize(lngTotalCeldas + 1, 3)
            If Application.WorksheetFunction.CountA(.Cells) Then
                bytContinuar = VBA.MsgBox(prompt:="Esta operación borrará datos existentes en el rango de salida." _
                                                  &amp;amp; vbNewLine &amp;amp; vbNewLine &amp;amp; _
                                                  "¿Desea continuar?", _
                                          Buttons:=vbYesNo + vbQuestion, _
                                          Title:="Inspección")
            End If
            
            '  Se imprimen los resultado en el rango de salida
            If bytContinuar = vbYes Then
                .ClearFormats
                .Rows(1).Font.Bold = True
                .Value = arrResultado
            End If
            
        End With
          
    End With
    
    
Salir:
    Set rngSalida = Nothing
    Set rngEntrada = Nothing
    Erase arrResultado
    Exit Sub
    
err_MatrizValoresFormulas:
    Select Case Err.Number
        Case 424  '  Se canceló alguno de los inputbox
        'Case ...
        Case Else
            MsgBox "Error " &amp;amp; ": " &amp;amp; Err.Description, vbCritical, Err.Source
    End Select
    Resume Salir

End Sub&lt;/pre&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-1896328619535548175?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/1896328619535548175/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/11/mostrar-todas-las-formulas-de-uno-o.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1896328619535548175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1896328619535548175'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/11/mostrar-todas-las-formulas-de-uno-o.html' title='Mostrar todas las fórmulas de uno o varios rangos'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2696619237849682883</id><published>2010-11-03T10:09:00.000-07:00</published><updated>2010-12-24T18:35:03.948-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estadística'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Prueba de normalidad en Excel</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_eDfEXcxBNuk/TNGfrLPS20I/AAAAAAAAASM/jfCC6CQXYpM/s1600/Prueba+de+normalidad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://4.bp.blogspot.com/_eDfEXcxBNuk/TNGfrLPS20I/AAAAAAAAASM/jfCC6CQXYpM/s640/Prueba+de+normalidad.png" style="border: 1px solid maroon;" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
El siquiente archivo permite ingresar cualquier conjunto de datos (pooco más de 65000 en Excel 2003 y anteriores y poco más de un millón si se convierte el archivo a .xlsx).&lt;br /&gt;
&lt;br /&gt;
Lo único que hay que hacer es ingresar los datos a partir de A2 y el archivo hace el resto.&lt;br /&gt;
&lt;br /&gt;
También es posible escoger el número de grupos para trazar el histograma (desde 5 hasta 20 grupos).&lt;br /&gt;
&lt;br /&gt;
Los datos para los gráficos se encuentran en nombres definidos, lo que permite ahorrar espacio pues no se usan celdas para calculos.&lt;br /&gt;
&lt;br /&gt;
El único problema que se puede presentar es con los gráficos, que se congelen o que no grafiquen todos los puntos (me parece que son 32.000 puntos por serie y me parece haber leído que para&amp;nbsp;Excel &amp;nbsp;2010 se aumentó él limite al númer de filas, esto es un poco más de un millón. En todo caso no estoy seguro de esta información).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;a href="https://sites.google.com/site/excelpatas/archivador-2/Pruebadenormalidad.xls?attredirects=0&amp;amp;d=1"&gt;Prueba de normalidad.xls&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;El archivo fue creado originalmente para el foro de Ayuda Excel, en este tema:&amp;nbsp;&lt;a href="http://www.ayudaexcel.com/foro/f6/test-de-normalidad-14350/" target="_blank"&gt;test de normalidad&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2696619237849682883?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2696619237849682883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/11/prueba-de-normalidad-en-excel.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2696619237849682883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2696619237849682883'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/11/prueba-de-normalidad-en-excel.html' title='Prueba de normalidad en Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_eDfEXcxBNuk/TNGfrLPS20I/AAAAAAAAASM/jfCC6CQXYpM/s72-c/Prueba+de+normalidad.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3201628432228198797</id><published>2010-06-22T21:52:00.000-07:00</published><updated>2010-06-22T22:16:01.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Desplazarse rápidamente por las hojas de un libro de Excel</title><content type='html'>Con frecuencia nos encontramos con libros que tienen muchas hojas y queremos desplazarnos rápidamente por ellas. En el siguiente vídeo se presentan algunas formas de hacerlo.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2CulkaS_MoQ&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2CulkaS_MoQ&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Si quiere usar un botón o un atajo del teclado para llamar al menú que se activa cuando da clic derecho sobre las flechas para desplazarse por las hojas en la parte inferior izquierda de la hoja, puede usar esta macro:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub MenúHojas()

    With Application.CommandBars("Workbook Tabs").Controls(16)
    
        If VBA.Right(.Caption, 3) = "..." Then
            .Execute
        Else
            .Parent.ShowPopup
        End If
        
    End With

End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3201628432228198797?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3201628432228198797/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/desplazarse-rapidamente-por-las-hojas.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3201628432228198797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3201628432228198797'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/desplazarse-rapidamente-por-las-hojas.html' title='Desplazarse rápidamente por las hojas de un libro de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6092834477590313385</id><published>2010-06-16T19:20:00.000-07:00</published><updated>2010-06-18T18:34:19.524-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Cambiar el registro por medio de VBA - Options6: Color de la selección</title><content type='html'>En &lt;a href="http://excelpatas.blogspot.com/2010/06/cambiar-el-predeterminado-de-la.html" target="_blank"&gt;Cambiar  el color predeterminado de la selección en una hoja de Excel&lt;/a&gt; vimos como modificar el registro para cambiar el color de la selección en una hoja de Excel. Existen también algunas alternativas para modificar el registro por medio de VBA. La más usada es por medio de llamadas API, como se describe en el sitio de Chip Pearson: &lt;a href="http://www.cpearson.com/excel/Registry.htm" target="_blank"&gt;http://www.cpearson.com/excel/Registry.htm&lt;/a&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Otra forma de hacerlo, a mi parecer un poco más sencilla, es por medio de un objeto &lt;a href="http://msdn.microsoft.com/en-us/library/aew9yb99%28VS.85%29.aspx" target="_blank"&gt;WScript.Shell&lt;/a&gt;. Los métodos que soporta un objeto WScript.Shell para modificar el registro son:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/293bt9hh%28v=VS.85%29.aspx" target="_blank"&gt;RegDelete &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/x05fawxd%28v=VS.85%29.aspx" target="_blank"&gt;RegRead &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/yfdfhz1b%28v=VS.85%29.aspx" target="_blank"&gt;RegWrite &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Para este caso en específico, vamos a usar los métodos &lt;span style="background-color: #cccccc;"&gt;RegRead&lt;/span&gt; y &lt;span style="background-color: #cccccc;"&gt;RegWrite&lt;/span&gt;. Usamos RegRead para leer el valor de Options6 en la ruta especificada del registro y RegWrite para escribir el nuevo valor.&lt;br /&gt;
&lt;br /&gt;
La macro modificará el valor de Options6 y luego reiniciará Excel para que se hagan efectivos los cambios. Por esto, cierre cualquier libro de Excel en el que esté trabajando, abra un libro nuevo y vaya al editor de VB, allí inserte un nuevo módulo, copie la macro y ejecútela.&lt;br /&gt;
&lt;br /&gt;
También puede descargar este archivo con la macro lista para utilizar: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Cambiarelcolorpredeterminadodelaselecci%C3%B3n.xls?attredirects=0&amp;d=1"&gt;Cambiar el color predeterminado de la selección.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Cambiar_Color_Selec()


    Dim Options6 As String
    Dim Valor As Byte
    Dim oShell As Object


    Options6 = "HKEY_CURRENT_USER\Software\Microsoft\Office\" &amp; Application.Version &amp; "\Excel\Options\Options6"
    

    Set oShell = CreateObject("WScript.Shell")
    
    
    On Error Resume Next
    Valor = oShell.RegRead(Options6)
    On Error GoTo 0
    

    Valor = VBA.IIf(Valor = 16, 0, 16)
    

    oShell.RegWrite Options6, Valor, "REG_DWORD"
        
    If MsgBox(prompt:="Se ha modificado exitosamente el registro." &amp; vbLf &amp; vbLf &amp; _
                      "¿Desea reiniciar Excel para terminar el proceso?" &amp; vbLf &amp; vbLf &amp; _
                      "Tenga en cuenta que se cerrarán todos los libros abiertos" &amp; vbLf &amp; _
                      "y no se guardará ningún cambio que haya realizado.", _
              Buttons:=vbYesNo + vbQuestion, _
              Title:="Registro modificado") = vbYes Then
              
        With CreateObject("Excel.Application")
            .Workbooks.Add
            .Visible = True
        End With
        
        With Application
            .DisplayAlerts = False
            .Quit
        End With
        
    Else
    
        MsgBox prompt:="Recuerde que el cambio se hará efectivo" &amp; vbLf &amp; _
                       "una vez reinicie Excel.", _
               Buttons:=vbInformation, _
               Title:="Registro modificado"
    
    End If
    
    
    Set oShell = Nothing
    
        
End Sub
&lt;/pre&gt;&lt;br /&gt;
&lt;div style="color: #660000;"&gt;&lt;b&gt;¡IMPORTANTE! Antes de modificar el registro asegúrese de crear una copia. Modificar el registro de Windows puede crear graves problemas si no se sabe exactamente qué es lo que está haciendo. La macro la he probado con Excel 2000, 2003 y 2007, y no me ha presentado ningún problema y funciona correctamente, pero no por ello puedo responder por cualquier otro cambio que usted haga del registro o por un uso indebido de la macro. Modifique el registro bajo su propia responsabilidad.&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6092834477590313385?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6092834477590313385/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/cambiar-el-registro-por-medio-de-vba.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6092834477590313385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6092834477590313385'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/cambiar-el-registro-por-medio-de-vba.html' title='Cambiar el registro por medio de VBA - Options6: Color de la selección'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7783171054165329313</id><published>2010-06-14T14:13:00.000-07:00</published><updated>2010-06-16T19:29:15.006-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato'/><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Cambiar el color predeterminado de la selección en una hoja de Excel</title><content type='html'>Antes que nada, advertir que este truco implica modificar las opciones de Excel direcctamente en el registro, lo cual, si no se hace con cuidado, puede traer serios problemas. Por esto mismo, siempre es recomendable hacer una copia del registro antes de efectuar cualquier modificación.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="background-color: #cccccc;"&gt;Este truco ha sido publicado por &lt;a href="http://j-walk.com/" target="_blank"&gt;John Walkenbach&lt;/a&gt; en su libro &lt;a href="http://www.amazon.com/Excel-Power-Programming-Spreadsheets-Bookshelf/dp/0470044012" target="_blank"&gt;Excel 2007 Power Programming with VBA&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;
En la sección &lt;a href="http://excelpatas.blogspot.com/p/manuales-sobre-excel-por-donde-empiezo.html" target="_blank"&gt;Manuales Excel y VBA&lt;/a&gt; encuentra un vínculo en el que puede leer gran parte de ese libro de manera gratuita, a través de Google Libros.&lt;br /&gt;
&lt;br /&gt;
Dicho esto, nos remangamos la camisa y hacemos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
1-. Cierre Excel.&lt;br /&gt;
&lt;br /&gt;
2-. Vaya a Inicio y seleccione "Ejecutar...".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBaa1sQ6kgI/AAAAAAAAARE/RTKstj-e-3I/s1600/Ejecutar....jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBaa1sQ6kgI/AAAAAAAAARE/RTKstj-e-3I/s320/Ejecutar....jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
3-. Allí escriba "Regedit" para abrir el Editor del Registro y seleccione "Aceptar".&lt;br /&gt;
&lt;br /&gt;
4-. En el Editor del Registro vaya a la siguiente carpeta&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Excel &lt;b&gt;2003&lt;/b&gt;: HKEY_CURRENT_USER\Software\Microsoft\Office\&lt;b&gt;11.0&lt;/b&gt;\Excel\Options &lt;/li&gt;
&lt;li&gt;Excel &lt;b&gt;2007&lt;/b&gt;: HKEY_CURRENT_USER\Software\Microsoft\Office\&lt;b&gt;12.0&lt;/b&gt;\Excel\Options&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBaa8aQjcnI/AAAAAAAAARM/Va8khSXKtMM/s1600/Editor+del+Registro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBaa8aQjcnI/AAAAAAAAARM/Va8khSXKtMM/s400/Editor+del+Registro.jpg" width="400" /&gt; &lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
5-. En la columna "Nombre" busque "Options6", si no lo encuentra, sobre la carpeta "Options", con el botón derecho del ratón seleccione "Nuevo..." &amp;gt; "Valor de DWORD" y dele el nombre "Options6".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_eDfEXcxBNuk/TBacNgExeHI/AAAAAAAAARk/qb4Irnsg5es/s1600/Options6-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/_eDfEXcxBNuk/TBacNgExeHI/AAAAAAAAARk/qb4Irnsg5es/s400/Options6-1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
6-. Con el botón derecho del ratón sobre "Options6" seleccione "Modificar" y en el cuadro de diálogo que se abre, seleccione "Decimal" e ingrese el valor 16 y presione "Aceptar".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_eDfEXcxBNuk/TBabHG5y-EI/AAAAAAAAARU/un4v0QwV1jU/s1600/Options6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_eDfEXcxBNuk/TBabHG5y-EI/AAAAAAAAARU/un4v0QwV1jU/s320/Options6.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
7-. Cierre el Editor del Registro y abra Excel. El color de fondo de la selección ahora deberá ser negro.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBabVxMF--I/AAAAAAAAARc/ZzIqEvwMvQI/s1600/Color+selecci%C3%B3n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://1.bp.blogspot.com/_eDfEXcxBNuk/TBabVxMF--I/AAAAAAAAARc/ZzIqEvwMvQI/s400/Color+selecci%C3%B3n.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora, si lo que en realidad le interesa es resaltar de alguna manera la selección o la fila de una celda seleccionada, revise este otro tema: &lt;a href="http://excelpatas.blogspot.com/2010/05/resaltar-la-fila-de-la-celda.html" target="_blank"&gt;Resaltar la fila de la celda seleccionada&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Si le interesa saber cómo modificar el registro por medio de VBA, consulte este artículo: &lt;a href="http://excelpatas.blogspot.com/2010/06/cambiar-el-registro-por-medio-de-vba.html" target="_blank"&gt;Cambiar  el registro por medio de VBA - Options6: Color de la selección.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7783171054165329313?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7783171054165329313/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/cambiar-el-predeterminado-de-la.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7783171054165329313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7783171054165329313'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/cambiar-el-predeterminado-de-la.html' title='Cambiar el color predeterminado de la selección en una hoja de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_eDfEXcxBNuk/TBaa1sQ6kgI/AAAAAAAAARE/RTKstj-e-3I/s72-c/Ejecutar....jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-9061581935663846461</id><published>2010-06-12T00:45:00.000-07:00</published><updated>2010-06-12T16:03:38.126-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Encontrar el último dato ingresado para un caso en particular</title><content type='html'>En el siguiente vídeo se explica cómo encontrar el último valor que se haya registrado para un dato en particular en un conjunto de datos. Para hacerlo, hemos hecho uso de una fórmula que ha sido ampliamente difundida por Internet pero cuyo funcionamiento puede resultar un poco oscuro. El vídeo, más que simplemente exponer la fórmula, busca explicar su funcionamiento.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
La fórmula hace uso de la función BUSCAR, si desea entender un poco más sobre esta función y comprender cómo nos ayuda en este caso, revise este tema: &lt;a href="http://excelpatas.blogspot.com/2010/05/encontrar-el-ultimo-valor-en-un.html"&gt;Encontrar  el último valor en un conjunto de datos: Búsqueda binaria&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
También puede que le ayude a comprender un poco mejor algunos de los mecanismos utilizados en la fórmula el siguiente tema: &lt;a href="http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-ii.html"&gt;Coaccionar valores en una fórmula II: Valores lógicos a valores numéricos&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/bsEFtjtUSig&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/bsEFtjtUSig&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Si usted conoce otro forma de llevar a cabo este procedimiento, no dude en compartirla en la sección de comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-9061581935663846461?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/9061581935663846461/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/encontrar-el-ultimo-dato-ingresado-para.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/9061581935663846461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/9061581935663846461'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/encontrar-el-ultimo-dato-ingresado-para.html' title='Encontrar el último dato ingresado para un caso en particular'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2646510805456171933</id><published>2010-06-11T14:24:00.000-07:00</published><updated>2010-06-11T14:48:22.896-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Coaccionar valores en una fórmula II: Valores lógicos a valores numéricos</title><content type='html'>En la &lt;a href="http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-i.html"&gt;Parte I&lt;/a&gt; de este tema veíamos cómo Excel coacciona valores numéricos diferentes a 0 como VERDADERO y el 0 como FALSO cuando son introducidos en una fórmula que espera un argumento lógico. También es posible lograr lo contrario: coaccionar los valores lógicos VERDADERO y FALSO A valores numéricos.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Lo primero que hay que tener en cuenta es que Excel coacciona el valor lógico VERDADERO como 1 y el valor lógico FALSO como 0.&lt;br /&gt;
&lt;br /&gt;
Podemos lograr esto de diferentes formas. Incluso, podemos usar la función N. Aunque el uso de la función N no caería en la categoría de coaccionar los valores. Al decir coaccionar, queremos decir que Excel 'obliga' a un valor tomar otro valor dentro del contexto esperado. Por esto, podemos decir que cuando usamos =Y(1), Excel coacciona el 1 como VERDADERO, pues dentro del contexto de la función Y(), el argumento que se la ha pasado es obligado a asumir la forma de un valor lógico.&lt;br /&gt;
&lt;br /&gt;
En el caso de la función N, ésta convierte el valor que se le indique de acuerdo a unas reglas predefinidas, no está coaccionando el valor ingresado para que se comporte de acuerdo a un valor esperado. Así, al usar algo como:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=N(FALSO)&lt;/blockquote&gt;&lt;br /&gt;
de acuerdo con la regla establecida por la función, ésta convierte el FALSO al valor numérico 0. Por otro lado, si usamos algo como:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=1*FALSO&lt;/blockquote&gt;&lt;br /&gt;
estamos coaccionando (forzando) el valor lógico FALSO para que se comporte de acuerdo a un valor como lo esperaría el operador * (multiplicación). Por lo que el FALSO es coaccionado a 0.&lt;br /&gt;
&lt;br /&gt;
Teniendo esto en consideración y continuando con los ejemplos para simplificar la función SI que veníamos exponiendo en la &lt;a href="http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-i.html"&gt;Parte I&lt;/a&gt; de este tema, podemos coaccionar los valores lógicos VERDADERO o FALSO para prescindir de la función SI.&lt;br /&gt;
&lt;br /&gt;
Así, si quisiéramos que de acuerdo con una condición se devolviera un valor dado, por ejemplo, que cuando el valor en A1 sea igual a "Prueba" entonces devuelva 1 y de lo contrario devuelva 0, inicialmente podríamos usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(A1="Prueba";1;0)&lt;/blockquote&gt;&lt;br /&gt;
pero también podríamos simplemente convertir por medio de la función N el valor lógico devuelto en la comparación A1="Prueba", así:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=N(A1="Prueba")&lt;/blockquote&gt;&lt;br /&gt;
lo que dará 1 en el caso que A1 sea igual a Prueba y 0 en el caso contrario. Finalmente, también podríamos prescindir de cualquier función y simplemente coaccionar el valor lógico al introducirlo en un contexto en el cual se espera un valor numérico, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=1*(A1="Prueba")&lt;/blockquote&gt;&lt;br /&gt;
o también:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=0+(A1="Prueba")&lt;/blockquote&gt;&lt;br /&gt;
o cualquier otra operación que obligue al valor lógico (VERDADERO o FALSO) a convertirse en un valor numérico (1 o 0).&lt;br /&gt;
&lt;br /&gt;
Otra forma más de coaccionar el valor lógico arrojado por la función (y que quizás usted ya haya visto en alguna fórmula) es antecediéndolo de dos signos negativos (--).&lt;br /&gt;
&lt;br /&gt;
En términos de rendimientos, quizás esta sea la forma más rápida de coaccionar valores lógicos a valores numéricos y quizás por eso mismo sea bastante frecuente encontrar este método.&lt;br /&gt;
&lt;br /&gt;
Cuando antecedemos un signo negativo, estamos colocando el valor lógico en un contexto en el que espera un número, por ello es coaccionado a una número. Puede comprobar esto ingresando en una celda la siguiente fórmula:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=&lt;span style="color: red;"&gt;-&lt;/span&gt;VERDADERO&lt;/blockquote&gt;&lt;br /&gt;
observará que el resultado es -1, pues el signo menos antecediendo al valor lógico VERDADERO que es coaccionado a 1 por Excel dará como resultado -1.&lt;br /&gt;
&lt;br /&gt;
Como lo que en realidad queremos es un 1, no un menos 1, pues simplemente anteponemos otro signo negativo, que sería algo equivalente a multiplicar negativo por negativo lo cual sabemos que da positivo, por eso al ingresar:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=&lt;span style="color: red;"&gt;--&lt;/span&gt;VERDADERO&lt;/blockquote&gt;&lt;br /&gt;
obtenemos 1. De esta forma, volviendo a la fórmula original, podríamos reemplazarla con:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=--(A1="Prueba")&lt;/blockquote&gt;&lt;br /&gt;
lo que será coaccionado a 1 en caso de ser verdadero y a 0 en caso de ser FALSO, que es lo mismo que buscábamos inicialmente.&lt;br /&gt;
&lt;br /&gt;
Continuará...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2646510805456171933?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2646510805456171933/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-ii.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2646510805456171933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2646510805456171933'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-ii.html' title='Coaccionar valores en una fórmula II: Valores lógicos a valores numéricos'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4706252072777931566</id><published>2010-06-11T10:48:00.000-07:00</published><updated>2010-06-11T10:50:33.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Eliminar datos con una característica determinada de una tabla de datos</title><content type='html'>El siguiente vídeo muestra cómo eliminar datos de una tabla de datos, de acuerdo con una característica en específico, haciendo uso de autofiltros y del comando "Ir a". El atajo del teclado para activar / desactivar el autofiltro es Ctrl+Mayus+L (Ctrl+Shift+L). Puede que de acuerdo con la configuración del equipo la combinación de teclas cambie.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: auto;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yn1y7tZkeKI&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/yn1y7tZkeKI&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Se puede lograr lo mismo haciendo uso de una macro como esta:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Eliminar_filas_cero()

    '  Desactiva la actulización de pantalla
    Application.ScreenUpdating = False

    '  Trabajar con todo el conjunto de datos a partir de
    '  A1 de la hoja "Hoja1"
    With Sheets("Hoja1").Range("a1").CurrentRegion
        
        '  Aplica el autofiltro al campo 3 con el criterio igual a 0
        .AutoFilter Field:=3, Criteria1:="0"
        
        '  Elimina las celdas visibles de los datos, excluyendo los
        '  encabezados
        .Offset(1).Resize(.Rows.Count - 1).SpecialCells(12).EntireRow.Delete
        
        '  Elimina el autofiltro
        .AutoFilter
        
    End With
    
    '  Activa la actualización de pantall
    Application.ScreenUpdating = True
    
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4706252072777931566?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4706252072777931566/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/eliminar-datos-con-una-caracteristica.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4706252072777931566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4706252072777931566'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/eliminar-datos-con-una-caracteristica.html' title='Eliminar datos con una característica determinada de una tabla de datos'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6107913493952334534</id><published>2010-06-09T19:56:00.000-07:00</published><updated>2010-06-11T14:46:50.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Coaccionar valores en una fórmula I: Valores numéricos a valores lógicos</title><content type='html'>Por lo general, cuando usamos la función SI especificamos en ella una comparación con un operador lógico cuyo resultado evaluará VERDADERO o FALSO. Sin embargo, en algunos casos en concreto se puede omitir la comparación, aprovechando que Excel coacciona el cero como FALSO y cualquier otro valor numérico como VERDADERO cuando son introducidos en una función que espera un valor lógico.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Esto quiere decir que si ingresa el valor 0 en una función que espera un valor lógico (VERDADERO o FALSO), la función lo leerá como FALSO. Cualquier otro número que ingrese en la función lo leerá como VERDADERO.&lt;br /&gt;
&lt;br /&gt;
Quizás la forma más fácil de comprobarlo sea ingresando la siguiente fórmula en una celda:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=O(0)&lt;/blockquote&gt;&lt;br /&gt;
como verá, el resultado devuelto por la fórmula introducida es FALSO.&lt;br /&gt;
&lt;br /&gt;
¿Qué provecho se puede sacar de esto?&lt;br /&gt;
&lt;br /&gt;
Bueno, supongamos que usted quiere que una celda se muestre en blanco si el valor en otra es 0 y de lo contrario que muestre cualquier otro resultado. La forma 'tradicional' de hacerlo sería:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(A1=0;"";"Prueba")&lt;/blockquote&gt;&lt;br /&gt;
Lo que hará esta fórmula es mostrar "Prueba" en caso de que en la celda A1 haya un valor distinto de 0. Si el valor en A1 es 0, la fórmula mostrará como resultado "" (en blanco).&lt;br /&gt;
&lt;br /&gt;
Ahora, aprovechando que Excel va a coaccionar el valor 0 como FALSO, no es necesario hacer la comparación y se podría reescribir la fórmula así:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(A1;"Prueba";"")&lt;/blockquote&gt;&lt;br /&gt;
En este caso, si el valor de A1 es 0 (FALSO), la función SI devolverá como resultado "", que es lo que queremos. En caso de que en A1 se introduzca cualquier otro valor, que será leído como VERDADERO, entonces la función arrojará como resultado "Prueba".&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: #660000;"&gt;&lt;b&gt;Importante, tenga en cuenta que Excel sólo coacciona valores numéricos a valores lógicos, no texto. Por lo que si el valor en A1 para el ejemplo anterior es algún texto, la fórmula arrojará ERROR.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
Avanzando un poco más con esta noción, vemos como podríamos reemplazar también las funciones O e Y por operaciones matemáticas. Es decir, en lugar de usar algo como:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(O(A1=0;A2=0);"";"Prueba")&lt;/blockquote&gt;&lt;br /&gt;
podríamos usar esto:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(A1+A2;"Prueba";"")&lt;/blockquote&gt;&lt;br /&gt;
En el primer caso la función evaluará el valor de A1, si el valor de A1 es igual a 0 arrojará VERDADERO. Luego evaluará A2, si el valor de A2 es 0 entonces arrojará verdadero. Luego usará la función O y ya que ambos valores son verdaderos, devolverá VERDADERO. Finalmente, al evaluar la función SI devolverá "" que es lo que queremos que la función arroje en caso de que el valor en A1 o en A2 sea igual a cero. &lt;br /&gt;
&lt;br /&gt;
En el segundo caso el proceso es mucho más simple e igual de efectivo. Si tanto el valor en A1 como A2 es 0, la suma de ellos dará 0, que será evaluado como FALSO y por lo tanto devolverá "", que es lo mismo que buscábamos con la función original.&lt;br /&gt;
&lt;br /&gt;
Siguiendo esta misma lógica vemos cómo la función Y puede ser reemplazada por la multiplicación:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(Y(A1=0;A2=0);"";"Prueba")&lt;/blockquote&gt;&lt;br /&gt;
arrojará el miso resultado que:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=SI(A1*A2;"Prueba";"")&lt;/blockquote&gt;&lt;br /&gt;
pues con que una de las dos celdas contenga un 0, el resultado de la multiplicación será 0 y por lo tanto será evaluado como FALSO y la función devolverá "". Será necesario que en ambas celdas sean introducidos valores distintos a 0 para que el resultado de la multiplicación no sea 0 y por lo tanto evalúe como VERDADERO.&lt;br /&gt;
&lt;br /&gt;
Continué leyendo la segunda parte: &lt;a href="http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-ii.html"&gt;Valores lógicos a valores numéricos&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6107913493952334534?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6107913493952334534/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-i.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6107913493952334534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6107913493952334534'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/coaccionar-valores-en-una-formula-i.html' title='Coaccionar valores en una fórmula I: Valores numéricos a valores lógicos'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-578705782621311455</id><published>2010-06-07T00:29:00.000-07:00</published><updated>2010-06-09T20:11:25.332-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Listar gráficos y la información de cada uno de ellos por medio de VBA</title><content type='html'>La siguiente macro listará todos los gráficos que se encuentren en la hoja que se le indique (en este caso "&lt;span style="color: red;"&gt;Hoja1&lt;/span&gt;"). La macro creará una nueva hoja y en ella mostrará el nombre de cada uno de los gráficos de la hoja en cuestión, el tipo de gráfico, el nombre de cada una de las series del gráfico y la fórmula para cada serie.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
La función Gráfico_Tipo que acompaña a la macro, asigna el nombre correspondiente a la constante del tipo de gráfico. El select case que he construido para asígnar el tipo de gráfico correspondiente lo he construido con base en la información que se encuentra &lt;a href="http://msdn.microsoft.com/en-us/library/bb241008.aspx" target="_blank"&gt;acá&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Listar_Graficos()


&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oGraf As Excel.ChartObject
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim shHoja As Excel.Worksheet
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim scserie As Excel.Series
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fila As Long
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set shHoja = Sheets("&lt;span style="color: red;"&gt;Hoja1&lt;/span&gt;")
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.ScreenUpdating = False
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; If shHoja.ChartObjects.Count = 0 Then
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox "No hay graficos en las hoja."
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With Sheets.Add
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Range("a1:d1") = VBA.Array("Nombre", "Tipo", "Serie", "Formula")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With .Range("a2")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each oGraf In shHoja.ChartObjects
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Offset(fila).Resize(, 2) = VBA.Array(oGraf.Name, Grafico_tipo(oGraf.Chart.ChartType))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each scserie In oGraf.Chart.SeriesCollection
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Offset(fila, 2).Resize(, 2) = VBA.Array(scserie.Name, "'" &amp;amp; scserie.Formula)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fila = fila + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next scserie
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fila = fila + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next oGraf
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .UsedRange.Columns.AutoFit
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.ScreenUpdating = True
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
End Sub&lt;/pre&gt;&lt;pre&gt;Private Function Grafico_tipo(ByVal Tipo As Integer) As String

&amp;nbsp;&amp;nbsp;&amp;nbsp; Select Case Tipo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4098: Grafico_tipo = "3D Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 78:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Stacked Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 79:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 60:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Clustered Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 61:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Stacked Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 62:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D 100% Stacked Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4100: Grafico_tipo = "3D Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 54:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Clustered Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 55:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Stacked Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 56:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D 100% Stacked Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4101: Grafico_tipo = "3D Line"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4102: Grafico_tipo = "3D Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 70:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Exploded 3D Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 76:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 77:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Area"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 57:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 71:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Bar of Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 58:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 59:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 15:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Bubble"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 87:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Bubble with 3D effects"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 51:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 52:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 53:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 102:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Cone Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 103:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Cone Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 104:&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Cone Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 105:&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 99:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 100:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 101:&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 95:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Cylinder Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 96:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Cylinder Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 97:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Cylinder Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 98:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Cylinder Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 92:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 93:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Cone Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 94:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Cylinder Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4120: Grafico_tipo = "Doughnut"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 80:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Exploded Doughnut"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 4:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Line"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 65:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Line with Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 66:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Line with Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 67:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Line with Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 63:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Line"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 64:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Line"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 5:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 69:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Exploded Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 68:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Pie of Pie"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 109:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Pyramid Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 110:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Pyramid Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 111:&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Pyramid Bar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 112:&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Pyramid Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 106:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Clustered Pyramid Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 107:&amp;nbsp;&amp;nbsp; Grafico_tipo = "Stacked Pyramid Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 108:&amp;nbsp;&amp;nbsp; Grafico_tipo = "100% Stacked Pyramid Column"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4151: Grafico_tipo = "Radar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 82:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Filled Radar"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 81:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Radar with Data Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 88:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "High-Low-Close"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 89:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Open-High-Low-Close"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 90:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Volume-High-Low-Close"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 91:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Volume-Open-High-Low-Close"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 83:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Surface"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 85:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Surface (Top View)"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 86:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Surface (Top View wireframe)"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 84:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "3D Surface (wireframe)"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case -4169: Grafico_tipo = "Scatter"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 74:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Scatter with Lines"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 75:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Scatter with Lines and No Data Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 72:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Scatter with Smoothed Lines"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case 73:&amp;nbsp;&amp;nbsp;&amp;nbsp; Grafico_tipo = "Scatter with Smoothed Lines and No Data Markers"
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Select

End Function&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-578705782621311455?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/578705782621311455/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/listar-graficos-y-la-informacion-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/578705782621311455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/578705782621311455'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/listar-graficos-y-la-informacion-de.html' title='Listar gráficos y la información de cada uno de ellos por medio de VBA'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-5090674930963008371</id><published>2010-06-04T11:14:00.000-07:00</published><updated>2010-06-04T15:21:52.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Notación abreviada para referirse a un rango versus Range</title><content type='html'>La llamada &lt;a href="http://msdn.microsoft.com/en-us/library/Aa221553" target="_blank"&gt;notación abreviada&lt;/a&gt;&amp;nbsp;es una forma de referirse a un rango (o a algún otro objecto en Excel, como una hoja) haciendo uso del &lt;a href="http://msdn.microsoft.com/en-us/library/aa223886%28office.11%29.aspx" target="_blank"&gt;método Evaluate&lt;/a&gt;. El método Evaluate es quizás uno de los más poderosas en VBA y tiene múltiples usos. Sin embargo, en este caso hablaremos exclusivamente de su uso para referirse a un rango.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Leyendo la ayuda sobre Evaluate en el editor de VB encontramos esto:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;Convierte un nombre de Microsoft Excel en un objeto o un valor.&lt;/blockquote&gt;&lt;br /&gt;
Esto quiere decir que si tenemos un nombre de un objeto de Excel (por ejemplo, "A1" que es el nombre de la celda A1, podemos convertir ese nombre en el objecto al que hace referencia por medio de Evaluate: Evaluate("A1"). Si tenemos una hoja llamada "Hoja1", podemos convertir ese nombre en un objeto pasándoselo al método Evaluate: Evaluate("Hoja1"), etc.&lt;br /&gt;
&lt;br /&gt;
Ciertamente, aún no hemos hecho uso de la notación abreviada. La notación abreviada es una forma 'abreviada' de utilizar el método Evaluate y quizás usted ya la haya visto en alguna ocasión: [A1].&lt;br /&gt;
&lt;br /&gt;
En este caso [A1] equivale a Evaluate("A1"), que será convertido por el método Evaluate a Range("A1").&lt;br /&gt;
&lt;br /&gt;
Así, resulta muy conveniente usar la notación abreviada: [A1].select, [A1] = "Prueba", etc.&lt;br /&gt;
&lt;br /&gt;
Lo que se debe tener en cuenta es que [A1] &lt;b&gt;no&lt;/b&gt; equivale a Range("A1"), equivale a Evaluate("A1") y lo que hará Evaluate("A1") será convertir el texto entre paréntesis en el objecto correspondiente: Range("A1").&lt;br /&gt;
&lt;br /&gt;
Esto quiere decir que el uso de [A1] necesariamente implica un paso de más a usar directamente Range("A1"), pues antes se deberá convertir "A1" al objeto Range correspondiente por medio Evaluate.&lt;br /&gt;
&lt;br /&gt;
Por supuesto, esto implicará un pequeña desventaja en cuanto a rendimiento al usar [A1] versus Range("A1"). Se pueden hacer algunas pruebas para comparar los desempeños de Evaluate versus Range. A continuación copio dos funciones que he escrito con este fin y que devuelven el tiempo que tomó en ejecutarse cada una:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Haciendo uso de la notación abreviada para referirse a A1&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;Private Function Tiempo_Evaluate(ByVal iteraciones As Long) As Single

&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim inicio As Single
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim x As Long
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim y As Long
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; inicio = Timer
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; For x = 1 To iteraciones
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [a1].Select
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [a1].value = iteraciones
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = [a1].value
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Next x
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Tiempo_Evaluate = Timer - inicio
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
End Function&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Haciendo uso de Range para referirse a A1&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;Private Function Tiempo_Range(ByVal iteraciones As Long) As Single
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim inicio As Single
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim x As Long
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim y As Long
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; inicio = Timer
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; For x = 1 To iteraciones
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Range("a1").Select
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Range("a1").value = iteraciones
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = Range("a1").value
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Next x
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Tiempo_Range = Timer - inicio
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
End Function&lt;/pre&gt;&lt;br /&gt;
Como se ve, cada función se refiere tres veces al rango "A1": Una para seleccionarlo, otra para escribir en él un valor y otra para leer de él un valor. La única diferencia es que en la función &lt;b&gt;Tiempo_Evaluate&lt;/b&gt; se usa la notación abreviada de Evaluate para referirse al rango "A1", mientras que en la función &lt;b&gt;Tiempo_Range&lt;/b&gt; se usa Range("A1") para referirse al mismo rango.&lt;br /&gt;
&lt;br /&gt;
Ahora podemos llamar a las dos funciones y comparar sus tiempos de ejecución, indicando cuatas veces queresmo repetir el bucle en las funciones:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Public Sub Comparar()

&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim prueba As Byte

&amp;nbsp;&amp;nbsp;&amp;nbsp; Const iteraciones As Long = 1000
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; For prueba = 1 To 3
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.Print "Evaluate:", Tiempo_Evaluate(iteraciones); "segundos"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.Print "Range:", Tiempo_Range(iteraciones); "segundos"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.Print VBA.String$(32, "=")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Next prueba
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
End Sub&lt;/pre&gt;&lt;br /&gt;
He llevado a cabo tres pruebas con esta macro (y las dos funciones correspondientes): Una con 1.000 iteraciones, otra con 10.000 y otra con 50.000 (Const iteraciones as long). En todos los casos la macro repite tres veces la llamada a las funciones, obteniendo tres resultados para cada número de iteraciones especificado. En los tres casos: 1.000, 10.000 y 50.000 (de tres ensayos cada uno) fue más rápido el uso de Range y como se ve (de acuerdo con los resultados obtenidos en mi equipo), la diferencia puede llegar a ser importante:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Const iteraciones As Long = 1000&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,632813 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,277344 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,457031 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,121094 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,5625 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,042969 segundos&lt;br /&gt;
================================&lt;/blockquote&gt;&lt;br /&gt;
&lt;b&gt;Const iteraciones As Long = 10000&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18,17578 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14,00391 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18,90625 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,73438 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18,87109 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,55469 segundos&lt;br /&gt;
================================&lt;/blockquote&gt;&lt;br /&gt;
&lt;b&gt;Const iteraciones As Long = 50000&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 70,47266 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50,14063 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 71,40625 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 51,66406 segundos&lt;br /&gt;
================================&lt;br /&gt;
Evaluate:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 73,28516 segundos&lt;br /&gt;
Range:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 52,70313 segundos&lt;br /&gt;
================================&lt;/blockquote&gt;&lt;br /&gt;
Tenga en cuenta que acá se está discutiendo el uso de la notación abreviada de Evaluate para referirse a un objeto tipo Range. El uso de Evaluate va mucho más allá de esto y puede ser realmente poderoso cuando se usa para evaluar una fórmula, permitiendo en muchos casos evitar bucles y ahorrando ahí sí, mucho tiempo en la ejecución de una macro.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, en el caso específico que nos ocupa, esto es, el uso de la notación abreviada de Evaluate para referirse a un rango, pues vemos que aunque nos puede ahorrar algunas teclas al momento de escribir el código, al momento de ejecutarlo pude enlentecer la macro en la que se use... claro, la diferencia no va a ser significativa si se usa una vez, pero en definitiva, si se quisiera ganar hasta la última mílesima de segundo en rendimiento, quizás convenga evitar siempre la notación abreviada para referirse a un rango.&lt;br /&gt;
&lt;br /&gt;
Sería interesante que usted mismo hiciera unas pruebas y ver si sus resultados respaldan lo expuesto... así que lo animo a que haga las pruebas correspondientes y comparta sus resultados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-5090674930963008371?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/5090674930963008371/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/notacion-abreviada-para-referirse-un.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5090674930963008371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5090674930963008371'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/notacion-abreviada-para-referirse-un.html' title='Notación abreviada para referirse a un rango versus Range'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6184164582160026730</id><published>2010-06-01T18:27:00.000-07:00</published><updated>2010-06-01T19:20:03.453-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Orden de las operaciones y uso del paréntesis en Excel</title><content type='html'>Para muchas personas puede resultar confuso el uso de los paréntesis y la prioridad de cierta operación matemática en una fórmula ingresada en Excel. En realidad, el orden de las operaciones que lleva a cabo Excel sigue unas reglas establecidas que se aplican desde las matemáticas.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Para recordar estas reglas fácilmente, se suelen llamar &lt;a href="http://www.disfrutalasmatematicas.com/operaciones-orden-pemdas.html" target="_blank"&gt;PEMDAS&lt;/a&gt;, estos es:&lt;br /&gt;
&lt;br /&gt;
P : Paréntesis&lt;br /&gt;
E : Exponentes y raíces&lt;br /&gt;
M : Multiplicación&lt;br /&gt;
D : División&lt;br /&gt;
A : Adición &lt;br /&gt;
S : Substracción&lt;br /&gt;
&lt;br /&gt;
Sin embargo, este mnemotécnico (PEMDAS) puede generar confusión, pues no es del todo exacto. En realidad, la multiplicación y la división tienen el mismo orden, y la suma y la resta también. Por lo que quizás sea mejor usar algo como:&lt;br /&gt;
&lt;br /&gt;
P : Paréntesis&lt;br /&gt;
E : Exponentes y raíces&lt;br /&gt;
M : Multiplicación y división&lt;br /&gt;
A : Adición y substracción&lt;br /&gt;
&lt;br /&gt;
En Excel se puede comprobar fácilmente que la adicción y la substracción tienen el mismo orden de precedencia en una operación, ingresando:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=1+2-3&lt;/blockquote&gt;&lt;br /&gt;
y&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=3-1+2&lt;/blockquote&gt;&lt;br /&gt;
En el primer caso el resultado es 0, pues se llevan a cabo las operaciones de izquierda a derecha:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;1+2 = 3 ; 3–3 = 0&lt;/blockquote&gt;&lt;br /&gt;
En el segundo caso el resultado es 4, pues de la misma forma se llevan a cabo las operaciones de izquierda a derecha sin que haya precedencia de la suma sobre la resta:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;3–1 = 2 ; 2+2 = 4&lt;/blockquote&gt;&lt;br /&gt;
Para forzar la precedencia de la suma sobre la resta, habría que encerrarla entre paréntesis:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=3–(1+2)&lt;/blockquote&gt;&lt;br /&gt;
Que se resolvería:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;(1+2) = 3 ; 3–3 = 0&lt;/blockquote&gt;&lt;br /&gt;
&lt;table align="center" class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Formula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=1+2-3&lt;/td&gt;&lt;td style="text-align: right;"&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=3-1+2&lt;/td&gt;&lt;td style="text-align: right;"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=3-(1+2)&lt;/td&gt;&lt;td style="text-align: right;"&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Por esto mismo, se podría prescindir de los paréntesis en una fórmula como esta:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=(A1/A$1)*100&lt;/blockquote&gt;&lt;br /&gt;
pues de cualquier forma se va a llevar a cabo primero la división (ya que no hay precedencia de la multiplicación sobre la división, simplemente se resolverá la fórmula de izquierda a derecha). Si se quisiera forzar la multiplicación en primera instancia, sí habría que encerrarla entre paréntesis, pues éstos se resolverán antes de resolver cualquier otro operador:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=A1/(A$1*100)&lt;/blockquote&gt;&lt;br /&gt;
&lt;table align="center" class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Formula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=(50/2)*100&lt;/td&gt;&lt;td style="text-align: right;"&gt;2500&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=50/2*100&lt;/td&gt;&lt;td style="text-align: right;"&gt;2500&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=50/(2*100)&lt;/td&gt;&lt;td style="text-align: right;"&gt;0.25&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Falta mencionar los operadores lógicos (&amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;=, =), que son los últimos en resolverse. Por lo que:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=1=1*2&lt;/blockquote&gt;&lt;br /&gt;
es distinto de:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;=(1=1)*2&lt;/blockquote&gt;&lt;br /&gt;
En el primer caso, ya que los operadores lógicos se resuelven en última instancia, la operación que se llevará a cabo sería:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;1*2 = 2 ; 1=2 = FALSO&lt;/blockquote&gt;&lt;br /&gt;
En el segundo caso, los paréntesis obligan a resolver primero la  comparación lógica y luego multiplicar el resultado por 2:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;1=1  =   VERDADERO ; VERDADERO * 2 = 2&lt;/blockquote&gt;&lt;br /&gt;
&lt;table align="center" class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Formula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=1=1*2&lt;/td&gt;&lt;td style="text-align: right;"&gt;FALSO&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=(1=1)*2&lt;/td&gt;&lt;td style="text-align: right;"&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Si desea observar cómo Excel va  resolviendo una fórmula introducida en una celda, puede usar el  Evaluador de Fórmulas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://office.microsoft.com/es-es/excel/HP030656263082.aspx?pid=CH010004943082" target="_blank"&gt;Excel 2003&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://office.microsoft.com/es-es/excel/HP100662543082.aspx" target="_blank"&gt;Excel 2007&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Para más y mejor información, consulte la ayuda de Excel bajo el tema &lt;a href="http://office.microsoft.com/es-es/excel/HP100788863082.aspx?pid=CH100648413082" target="_blank"&gt;Operadores de cálculo y prioridad&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6184164582160026730?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6184164582160026730/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/06/orden-de-las-operaciones-y-uso-del.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6184164582160026730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6184164582160026730'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/06/orden-de-las-operaciones-y-uso-del.html' title='Orden de las operaciones y uso del paréntesis en Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2256177293721011997</id><published>2010-05-30T19:03:00.000-07:00</published><updated>2010-05-30T19:35:57.206-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Enviar información desde Excel a Internet por medio de VBA</title><content type='html'>El siguiente código permite enviar el texto que se desea a la sección de comentarios de esta entrada. El código permite ilustrar cómo enviar información a una página Web una vez identificado el elemento de la página al cual se quiere enviar la información:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Sub Comentar(ByVal Comentario As String)

    Dim ie As Object
    
    Set ie = CreateObject("internetexplorer.application")

    With ie
        .navigate "http://www.blogger.com/comment-iframe.g?blogID=4832124315378145262&amp;amp;postID=2256177293721011997"
        Do While .readystate &amp;lt;&amp;gt; 4: Loop
        .document.forms(0).Item(18).Value = Comentario
        .Visible = True
    End With
    
    Set ie = Nothing
      
End Sub&lt;/pre&gt;&lt;br /&gt;
Tenga en cuenta que la macro no publicará el comentario, sólo escribirá el texto que usted decida en el espacio para escribir comentarios.&lt;br /&gt;
&lt;br /&gt;
En el siguiente archivo he usado un Userform para pasarle la información a la macro: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Enviarinformaci%C3%B3naunap%C3%A1ginaWeb.xls?attredirects=0&amp;amp;d=1"&gt;Enviar información a una página Web.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
También podría probar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Prueba()
    
    Comentar Comentario:="Este es un comentario de prueba enviado desde Excel."
    
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2256177293721011997?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2256177293721011997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/enviar-informacion-por-medio-de-vba.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2256177293721011997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2256177293721011997'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/enviar-informacion-por-medio-de-vba.html' title='Enviar información desde Excel a Internet por medio de VBA'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4540471918071333092</id><published>2010-05-29T23:17:00.000-07:00</published><updated>2010-05-29T23:18:12.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>La guerra de las hojas de cálculo</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" flashvars="config={&amp;quot;key&amp;quot;:&amp;quot;#$b6eb72a0f2f1e29f3d4&amp;quot;,&amp;quot;playlist&amp;quot;:[{&amp;quot;url&amp;quot;:&amp;quot;http://www.archive.org/download/CC606_spreadsheet_wars/format=Thumbnail?.jpg&amp;quot;,&amp;quot;autoPlay&amp;quot;:true,&amp;quot;scaling&amp;quot;:&amp;quot;fit&amp;quot;},{&amp;quot;url&amp;quot;:&amp;quot;http://www.archive.org/download/CC606_spreadsheet_wars/CC606_spreadsheet_wars_512kb.mp4&amp;quot;,&amp;quot;autoPlay&amp;quot;:false,&amp;quot;accelerated&amp;quot;:true,&amp;quot;scaling&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;h264streaming&amp;quot;}],&amp;quot;clip&amp;quot;:{&amp;quot;autoPlay&amp;quot;:false,&amp;quot;accelerated&amp;quot;:true,&amp;quot;scaling&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;h264streaming&amp;quot;},&amp;quot;canvas&amp;quot;:{&amp;quot;backgroundColor&amp;quot;:&amp;quot;0x000000&amp;quot;,&amp;quot;backgroundGradient&amp;quot;:&amp;quot;none&amp;quot;},&amp;quot;plugins&amp;quot;:{&amp;quot;audio&amp;quot;:{&amp;quot;url&amp;quot;:&amp;quot;http://www.archive.org/flow/flowplayer.audio-3.0.3-dev.swf&amp;quot;},&amp;quot;controls&amp;quot;:{&amp;quot;playlist&amp;quot;:false,&amp;quot;fullscreen&amp;quot;:true,&amp;quot;gloss&amp;quot;:&amp;quot;high&amp;quot;,&amp;quot;backgroundColor&amp;quot;:&amp;quot;0x000000&amp;quot;,&amp;quot;backgroundGradient&amp;quot;:&amp;quot;medium&amp;quot;,&amp;quot;sliderColor&amp;quot;:&amp;quot;0x777777&amp;quot;,&amp;quot;progressColor&amp;quot;:&amp;quot;0x777777&amp;quot;,&amp;quot;timeColor&amp;quot;:&amp;quot;0xeeeeee&amp;quot;,&amp;quot;durationColor&amp;quot;:&amp;quot;0x01DAFF&amp;quot;,&amp;quot;buttonColor&amp;quot;:&amp;quot;0x333333&amp;quot;,&amp;quot;buttonOverColor&amp;quot;:&amp;quot;0x505050&amp;quot;},&amp;quot;h264streaming&amp;quot;:{&amp;quot;url&amp;quot;:&amp;quot;http://www.archive.org/flow/flowplayer.h264streaming-3.0.5.swf&amp;quot;}},&amp;quot;contextMenu&amp;quot;:[{&amp;quot;View+CC606_spreadsheet_wars+at+archive.org&amp;quot;:&amp;quot;function()&amp;quot;},&amp;quot;-&amp;quot;,&amp;quot;Flowplayer 3.0.5&amp;quot;]}" height="504" src="http://www.archive.org/flow/flowplayer.commercial-3.0.5.swf" type="application/x-shockwave-flash" w3c="true" width="640"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4540471918071333092?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4540471918071333092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/la-guerra-de-las-hojas-de-calculo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4540471918071333092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4540471918071333092'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/la-guerra-de-las-hojas-de-calculo.html' title='La guerra de las hojas de cálculo'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4650177148593291044</id><published>2010-05-28T14:07:00.000-07:00</published><updated>2010-11-27T16:52:23.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Borrar gráficos en un libro de Excel por medio de VBA</title><content type='html'>La siguiente macro borrará todos los gráficos del libro activo de Excel. Los gráficos en un libro pueden ser de dos tipos: Gráficos insertados en una hoja (Chartobject) o gráficos como tal, en una hoja independiente cada uno (Chart). La macro borrará ambos tipos de gráficos:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Sub Borrar_gráficos()


    Dim x As Long
    
    
    Application.DisplayAlerts = False
    
    
    For x = ActiveWorkbook.Sheets.Count To 1 Step -1

        If VBA.TypeName(Sheets(x)) = "Chart" Then
        
            Sheets(x).Delete
            
        ElseIf Sheets(x).Type = xlWorksheet Then
        
            Sheets(x).ChartObjects.Delete
            
        End If
    
    Next x
    
    
    Application.DisplayAlerts = True
    

End Sub&lt;/pre&gt;&lt;br /&gt;
Si se desean borrar sólo los gráficos insertados en las hojas (ChartObjects), esto lo hará, borrando de todas las hojas del libro activo todos los gráficos insertados que encuentre:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Borrar_ChartObjects_libro()


    Dim sh As Excel.Worksheet
    
    
    For Each sh In ActiveWorkbook.Worksheets
        
        sh.ChartObjects.Delete
            
    Next sh
    

End Sub&lt;/pre&gt;&lt;br /&gt;
Para borrar sólo los gráficos en una hoja, bastará con quitar el bucle que recorre las hojas y especificar la hoja en la que se quiere borrar los gráficos, por ejemplo, la hoja "&lt;span class="Apple-style-span" style="color: blue;"&gt;Hoja1&lt;/span&gt;":&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Borrar_ChartObjects_hoja()
 
    Sheets("&lt;span class="Apple-style-span" style="color: blue;"&gt;Hoja1&lt;/span&gt;").ChartObjects.Delete

End Sub&lt;/pre&gt;&lt;br /&gt;
Finalmente, para borrar sólo los gráficos en hojas independientes (Charts), conservando los gráficos insertados en las hojas, se podrías usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Borrar_Charts()


    Dim Ch As Excel.Chart
    
    
    Application.DisplayAlerts = False
    
    
    For Each Ch In ActiveWorkbook.Charts
        
       Ch.Delete
         
    Next Ch
    
    
    Application.DisplayAlerts = True
    
    
End Sub&lt;/pre&gt;&lt;br /&gt;
Se podría escribir una función que reciba como argumentos el tipo de gráficos que se desea borrar y el ámbito (todo el libro o alguna hoja en específico) y que arroje un valor de verificación (por ejemplo, Verdadero si se han borrado con éxito o Falso si se ha presentado algún error). Si se trabaja con gráficos de manera frecuente, una función de ese tipo puede ser útil. &lt;br /&gt;
&lt;br /&gt;
Sin embargo, puede resultar ilustrativo ver las diferencias entre Chart y ChartObject y distintas formas de abordar el problema. Tenga en cuenta que un ChartObject contiene un Chart: Sheets("Hoja1").ChartObjects(1).Chart se refiere al gráfico que se encuentra en el ChartObject 1 insertado en la hoja "Hoja1". Un gráfico insertado en una hoja siempre será un ChartObject que contendrá un Chart. Un gráfico en una hoja independiente será un Chart, pasando la hoja a ser una hoja tipo Chart y no una hoja WorkSheet. Puede comprobarlo haciendo uso de la función TypeName: debug.print TypeName(Sheets(1)). Si Sheets(1) es un gráfico, typename devolverá "Chart", de lo contrario devolverá "Worksheet".&lt;br /&gt;
&lt;br /&gt;
Si la ha parecido interesante esta información o tiene alguna corrección o comentario u otra forma de hacerlo, no dude en escribir en la sección de comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4650177148593291044?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4650177148593291044/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/distintas-macros-para-borrar-graficas.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4650177148593291044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4650177148593291044'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/distintas-macros-para-borrar-graficas.html' title='Borrar gráficos en un libro de Excel por medio de VBA'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6325496846672219827</id><published>2010-05-27T10:39:00.000-07:00</published><updated>2010-05-27T10:55:53.107-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Los orígenes de Microsoft Excel: VisiCalc</title><content type='html'>Investigando un poco sobre los orígenes de Excel me he encontrado con lo  que me ha parecido una verdadera curiosidad: el programa original de  VisiCalc en su totalidad, para descargar y usar gratuitamente.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://lh4.ggpht.com/_eDfEXcxBNuk/S_6wplQTbNI/AAAAAAAAAQw/hflL885prvc/Visicalc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://lh4.ggpht.com/_eDfEXcxBNuk/S_6wplQTbNI/AAAAAAAAAQw/hflL885prvc/Visicalc.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Claro, es un objeto de anticuario. No creo que nadie vaya a cambiar su versión de Microsoft Excel, por antigua que sea, por el viejo VisiCalc. Pero si se quiere tener un ‘objeto de colección’ (si es que existe algo así en el mundo de las hojas de Cálculo) y uno es aficionado a Excel, se sentirá como con un auto de colección en el garaje.&lt;br /&gt;
&lt;br /&gt;
VisiCalc es nada más y nada menos que la primera hoja de cálculo, creada por dos estudiantes del MIT: Dan Bricklin y Bob Frankston. En Octubre de 1979 salió al mercado VISIble CALCulator para Apple IIe, con el nombre de VisiCalc.&lt;br /&gt;
&lt;br /&gt;
Si quiere descargarlo, acá lo encuentra, así como toda una página museo con documentación sobre su história y su uso: &lt;a href="http://www.danbricklin.com/history/vcexecutable.htm"&gt;VisiCalc&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Nota al pie de página: Sabia que en Excel usted puede ingresar una función precedida de "@", por ejemplo: @SUMA(A1:A10). Si no recuerdo mal, esto es para compatibilidad con Lotus y remontándonos a los orígenes... en VisiCalc las funciones se invocaban de esa forma: @SUM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6325496846672219827?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6325496846672219827/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/los-origenes-de-microsoft-excel.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6325496846672219827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6325496846672219827'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/los-origenes-de-microsoft-excel.html' title='Los orígenes de Microsoft Excel: VisiCalc'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_eDfEXcxBNuk/S_6wplQTbNI/AAAAAAAAAQw/hflL885prvc/s72-c/Visicalc.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6262670366388292643</id><published>2010-05-25T19:40:00.000-07:00</published><updated>2010-05-26T13:07:59.466-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Escribir datos por medio de una conexión ADO en un libro de Excel cerrado</title><content type='html'>He estado tratando de encontrar una forma sencilla para escribir datos por medio de VBA en un libro de Excel cerrado . Esto parece ser posible estableciendo una conexión ADO (ActiveX Data Objects).&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Para poder trabajar con una conexión ADO, es necesario establecer una referencia a &lt;b&gt;Microsft ActiveX Data Objects&lt;/b&gt; (elija la versión más reciente que encuentre). &lt;br /&gt;
&lt;br /&gt;
Para los códigos que voy a usar, estoy suponiendo un libro llamado "Libro1.xls", que en el rango A1:F1 de la hoja "Hoja1" tiene estos encabezados, a partir de los cuales vamos a ingresar datos:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Libro1.xls - Hoja1&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
La macro para ingresar los datos, ejecutándola desde Excel 2007, podría ser algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Escribir_datos()

&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Data As ADODB.Co&lt;span style="background-color: white;"&gt;&lt;/span&gt;nnection
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Datos As String


&amp;nbsp;&amp;nbsp;&amp;nbsp; 'DATOS DEL ARCHIVO EN EL QUE SE VA A ESCRIBIR
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si el archivo en el que va a escribir los datos es versión
&amp;nbsp;&amp;nbsp;&amp;nbsp; '2007, cambie "Excel 8.0" por "Excel 12.0"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Const &lt;b style="color: blue;"&gt;Archivo&lt;/b&gt; As String = "C:\Users\Mauricio\Desktop\Libro1.xls"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Const &lt;b style="color: blue;"&gt;Version&lt;/b&gt; As String = "Excel 8.0"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Const Hoja As String = "Hoja1"
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'DATOS DE LA CONEXION
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Corresponde a la versión de Excel desde la cual va a ejecutar la macro
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si ejecuta la macro desde Excel 2003 use "Microsoft.Jet.OLEDB.4.0"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Const &lt;b style="color: blue;"&gt;Proveedor&lt;/b&gt; As String = "Microsoft.ACE.OLEDB.12.0"
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Los datos que se van a ingresar, separados por comas.
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos = "'Prueba1', 1, 'Prueba2', 0.02, 3, 4"
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Data = New ADODB.Connection
&amp;nbsp;&amp;nbsp; &amp;nbsp;
    with Data
&amp;nbsp;&amp;nbsp;&amp;nbsp;     .Open "Provider=" &amp;amp; Proveedor &amp;amp; ";" &amp;amp; _
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Data Source=" &amp;amp; Archivo &amp;amp; ";" &amp;amp; _
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Extended Properties=""" &amp;amp; Version &amp;amp; ";HDR=Yes"";"
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;     .Execute "INSERT INTO [" &amp;amp; Hoja &amp;amp; "$] VALUES(" &amp;amp; Datos &amp;amp; ");", , adCmdText Or adExecuteNoRecords
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;     .Close
    End with
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Data = Nothing
&amp;nbsp;&amp;nbsp; &amp;nbsp;

End Sub&lt;/pre&gt;&lt;br /&gt;
Para la constante &lt;b style="color: blue;"&gt;Archivo&lt;/b&gt;, ingrese la ruta completa del archivo en el que quiere escribir los datos, en este caso: "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;C:\Users\Mauricio\Desktop\Libro2.xls&lt;/span&gt;"&lt;br /&gt;
&lt;br /&gt;
Para la constante &lt;b style="color: blue;"&gt;Version&lt;/b&gt;, ingrese "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Excel 8.0&lt;/span&gt;" si el archivo en el que quiere escribir los datos es .xls (como en este caso) o "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Excel 12.0&lt;/span&gt;" si el archivo en el que quiere escribir los datos es versión 2007 (.xlsx o .xlsm).&lt;br /&gt;
&lt;br /&gt;
Para la constante &lt;b style="color: blue;"&gt;Proveedor&lt;/b&gt;, ingrese "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Microsoft.ACE.OLEDB.12.0&lt;/span&gt;" si la macro la ejecuta desde Excel 2007 o "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Microsoft.Jet.OLEDB.4.0&lt;/span&gt;" si la ejecuta desde Excel 2003.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: #660000;"&gt;Imprtante, la constante&lt;b&gt; Versión &lt;/b&gt;se refiere al libro al cual quiere escribir lo datos. La constante &lt;b&gt;Proveedor &lt;/b&gt;corresponde a la versión de Excel desde la cual ejecute la macro.&lt;/div&gt;&lt;br /&gt;
Si decide realizar algunas pruebas, recuerde hacerlo manteniendo el archivo en el que desea escribir cerrado, pues de mantenerlo abierto mientras ejecuta la macro se puede generar una pérdida en el uso de memoria de Excel: &lt;a href="http://support.microsoft.com/kb/319998"&gt;http://support.microsoft.com/kb/319998&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resultado tras ejecutar la macro&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td&gt;Prueba1&lt;/td&gt;&lt;td style="text-align: left;"&gt;1&lt;/td&gt;&lt;td&gt;Prueba2&lt;/td&gt;&lt;td style="text-align: left;"&gt;0,02&lt;/td&gt;&lt;td style="text-align: left;"&gt;3&lt;/td&gt;&lt;td style="text-align: left;"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Note que todos los valores han sido ingresados como texto. Al ingresar datos por medio de una conexión ADO, de manera predeterminada se ingresarán los valores con el formato de la celda que encuentre arriba (aunque esto no es del todo exacto, sirve para entender qué ha pasado. Para información más detallada, revise este artículo: &lt;a href="http://support.microsoft.com/kb/257819"&gt;http://support.microsoft.com/kb/257819&lt;/a&gt;). Fíjese que todos los encabezados están en forma de texto. Si quisieramos especificar un tipo de dato y formato para los datos que vayamos a pasar, podríamos indicar con una fila dummy el formato que queremos para cada columna.&lt;br /&gt;
&lt;br /&gt;
Vamos a cambiar los datos en la tabla de la Hoja1 y los vamos a disponer así:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Usando una segunda fila dummy para indicar el tipo de datos que queremos en cada columna&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1.00&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1%&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;$ 1.00&lt;/span&gt; &lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
La fila2, que he ingresado manualmente, sirve para indicar el tipo y el formato para los datos que se quiere en esas columnas. Para las columnas B, D, E y F he ingresado datos numéricos y le he dado un formato específico a cada uno. Para las columnas A y C estoy ingresando texto. Esta fila se puede ocultar y la macro igual ingresará correctamente los datos:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resultado tras ejecutar la macro con fila dummy indicando el tipo de datos&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1.00&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1%&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;$ 1.00&lt;/span&gt; &lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;3&lt;/td&gt;&lt;td&gt;Prueba1&lt;/td&gt;&lt;td style="text-align: right;"&gt;1.00&lt;/td&gt;&lt;td&gt;Prueba2&lt;/td&gt;&lt;td style="text-align: right;"&gt;2%&lt;/td&gt;&lt;td style="text-align: right;"&gt;$ 3.00 &lt;/td&gt;&lt;td style="text-align: right;"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Si se quisiera hacer algo un poco más global y hasta de pronto crear una función para escribir datos en un libro sin necesidad de abrirlo, se podría pensar en algo así (la función devolverá verdadero si se han pasado los datos con éxito o Falso si se ha presentado algún error durante la transferencia):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Function Pasar_datos(ByVal Archivo As String, ByVal Hoja As String, ByRef Datos() As Variant) As Boolean
&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Registro As ADODB.Recordset
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Data As ADODB.Connection
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Proveedor As String
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Version As String
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim x As Byte, y As Byte
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Pasar_datos = False
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; On Error GoTo Salir
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Tipo de conexión según el archivo en el que se use la función
&amp;nbsp;&amp;nbsp;&amp;nbsp; If VBA.Val(VBA.Mid(Application.Version, 1, VBA.InStr(1, Application.Version, ".") - 1)) &amp;gt;= 12 Then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Proveedor = "Microsoft.ACE.OLEDB.12.0" 'Excel 2007
&amp;nbsp;&amp;nbsp;&amp;nbsp; Else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Proveedor = "Microsoft.Jet.OLEDB.4.0" 'Excel 2003
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Version = VBA.Right(Archivo, VBA.Len(Archivo) - VBA.InStr(Archivo, "."))
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Versión del archivo destino
&amp;nbsp;&amp;nbsp;&amp;nbsp; If Version Like "xls?" Then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version = "Excel 12.0" 'Excel 2003
&amp;nbsp;&amp;nbsp;&amp;nbsp; ElseIf Version Like "xls" Then 'Excel 2007
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version = "Excel 8.0"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'No se está trabajando con una archivo de Excel válido
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Data = New ADODB.Connection
&amp;nbsp;&amp;nbsp;&amp;nbsp; Data.Open "Provider=" &amp;amp; Proveedor &amp;amp; ";" &amp;amp; _
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Data Source=" &amp;amp; Archivo &amp;amp; ";" &amp;amp; _
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Extended Properties=""" &amp;amp; Version &amp;amp; ";HDR=Yes"";"
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Registro = New ADODB.Recordset
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; With Registro
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorLocation = adUseClient
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Open "Select * from [" &amp;amp; Hoja &amp;amp; "$]", Data, adOpenStatic, adLockOptimistic
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNew
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For x = LBound(Datos) To UBound(Datos)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(VBA.Val(y)).Value = Datos(x)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = y + 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next x
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Update
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Close
&amp;nbsp;&amp;nbsp;&amp;nbsp; End With
&amp;nbsp;&amp;nbsp; &amp;nbsp;
Salir:

&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Registro = Nothing
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Data.Close
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Data = Nothing
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Pasar_datos = Not VBA.CBool(Err.Number)
&amp;nbsp; &amp;nbsp;
End Function&lt;/pre&gt;&lt;br /&gt;
Los argumentos que deberá pasar a la función son:&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b&gt;Archivo as String&lt;/b&gt;&lt;br /&gt;
La ruta del archivo en el que desea escribir los datos, por ejemplo: "C:\Users\Mauricio\Desktop\Libro2.xls"&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;b&gt;Hoja as String&lt;/b&gt;&lt;br /&gt;
El nombre de la hoja del archivo en la que desea escribir los datos, por ejemplo: "Hoja1"&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;b&gt;Datos() as Variant&lt;/b&gt;&lt;br /&gt;
Una matriz de datos de una dimensión con el mismo número de elementos al de las columnas en las que se van a ingresar los datos&lt;/blockquote&gt;Suponiendo que vamos a ingresar datos en la "Hoja1" del libro "Libro1.xls" y que esta es la estructura de la tabla en la cual vamos a ingresar datos (observe que a la columna B, en la fila dummy que indica el tipo de&amp;nbsp; datos, estoy indicando que quiero pasar allí dato de tipo Fecha, para lo cual he ingresado un fecha cualquiera y le he dato el formato de fecha que quiero):&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Libro1.xls - Hoja1&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1/1/2001&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto2&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1%&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;$ 1.00&lt;/span&gt; &lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Podríamos usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()

&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Datos(1 To 6) As Variant
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(1) = "Prueba1"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(2) = VBA.DateSerial(2010, 5, 25)
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(3) = "Prueba2"
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(4) = 0.02
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(5) = 3
&amp;nbsp;&amp;nbsp;&amp;nbsp; Datos(6) = 4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; If Pasar_datos("C:\Users\Mauricio\Desktop\Libro1.xls", "Hoja1", Datos) Then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox "Se ha completado con éxito la transferencia de datos."
&amp;nbsp;&amp;nbsp;&amp;nbsp; Else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox "Se ha presentado algún error durante la transferencia."
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If
&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Erase Datos
&amp;nbsp;&amp;nbsp; &amp;nbsp;
End Sub&lt;/pre&gt;&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resultado tras usar la función Pasar_datos(Archivo, Hoja, Datos())&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Consolas,Arial; font-size: 10pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;col style="width: 100px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;1&lt;/td&gt;&lt;td&gt;Dato1&lt;/td&gt;&lt;td&gt;Dato2&lt;/td&gt;&lt;td&gt;Dato3&lt;/td&gt;&lt;td&gt;Dato4&lt;/td&gt;&lt;td&gt;Dato5&lt;/td&gt;&lt;td&gt;Dato6&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1/1/2001&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black;"&gt;&lt;span style="color: #999999;"&gt;Texto&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1%&lt;/span&gt;&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;$ 1.00&lt;/span&gt; &lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;&lt;span style="color: #999999;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;3&lt;/td&gt;&lt;td&gt;Prueba1&lt;/td&gt;&lt;td style="text-align: right;"&gt;25/5/2010&lt;/td&gt;&lt;td&gt;Prueba2&lt;/td&gt;&lt;td style="text-align: right;"&gt;2%&lt;/td&gt;&lt;td style="text-align: right;"&gt;$ 3.00 &lt;/td&gt;&lt;td style="text-align: right;"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&lt;b&gt;¡Importante!&lt;/b&gt; &lt;/span&gt;Ya sea que use la subrutina o la función,&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;la cantidad de datos que ingrese debe coincidir con el número de columnas que tenga la tabla en la hoja de destino;&lt;/li&gt;
&lt;li&gt;Cuando pase los datos, debe 'respetar' el tipo de datos que esté indicando en la fila dummy. Es decir, si en la fila dummy está indicando que el tipo de datos para la columna 2 es Fecha (como en el último ejemplo), el dato que pase para dicha columna debe ser una Fecha. &lt;/li&gt;
&lt;/ol&gt;Para más información sobre ADO, en la página de Microsoft encontrará más que suficiente documentación y ejemplos: &lt;a href="http://msdn.microsoft.com/en-us/library/ms675532%28VS.85%29.aspx" target="_&amp;quot;blank&amp;quot;"&gt;Microsoft ActiveX Data Objects&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Si esta información le ha parecido útil o interesante, déjelo saber en los comentarios. También advierto que no soy un experto en conexiones de datos, así que si usted conoce una mejor forma de hacerlo o encuentra algún error, le agradeceré que lo comente. En todo caso, lo mostrado acá tiene sus ventajas y desventajas, y en muchos casos puede ser mucho más sencillo simplemente abrir el libro, pasar los datos y cerrarlo nuevament :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6262670366388292643?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6262670366388292643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/escribir-datos-en-un-libro-cerrado-por.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6262670366388292643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6262670366388292643'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/escribir-datos-en-un-libro-cerrado-por.html' title='Escribir datos por medio de una conexión ADO en un libro de Excel cerrado'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6645059321539998846</id><published>2010-05-24T20:20:00.000-07:00</published><updated>2010-05-24T20:21:13.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><title type='text'>Importar datos en tiempo real desde un página Web a Excel</title><content type='html'>El siguiente vídeo muestra cómo importar datos desde una tabla en una página Web a Excel haciendo uso de una Conexión a Datos. El procedimiento está explicado para Excel 2007 pero igual aplica para otras versiones.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rq_viHJO60A&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Rq_viHJO60A&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Si quiere más información, consulte la página de Microsoft Excel:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; &lt;a href="http://office.microsoft.com/es-es/excel/HP030741903082.aspx"&gt;Consulta para recuperar datos de una página Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://office.microsoft.com/es-es/excel/HA010929293082.aspx"&gt;Demostración: Importar datos financieros desde la Web &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6645059321539998846?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6645059321539998846/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/importar-datos-en-tiempo-real-desde-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6645059321539998846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6645059321539998846'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/importar-datos-en-tiempo-real-desde-un.html' title='Importar datos en tiempo real desde un página Web a Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7287786257308447724</id><published>2010-05-22T21:59:00.000-07:00</published><updated>2010-11-27T16:47:28.371-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Estadística'/><category scheme='http://www.blogger.com/atom/ns#' term='Gráficos'/><title type='text'>Demostración experimental del Teorema del Límite Central</title><content type='html'>&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;El Teorema del Límite Central es quizás la principal razón por la cual la distribución normal es tan importante. En pocas palabras, el teorema postula que sin importar cuál sea la distribución de una población, si se obtiene  un  número grande de muestras aleatorias, los promedios o las sumas de esas  muestras  se aproximarán a una distribución normal.&lt;br /&gt;
&lt;p$1&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p$1&gt;&lt;p$1&gt;La plantilla que acompaña a esta entrada presenta una demostración experimental del teorema. En el archivo se deben especificar el número de muestras que se desean obtener y su tamaño. A continución, por medio de una macro, se crearán las muestras indicadas del tamaño indicado usando la función ALEATORIO(). La función aleatorio devuelve valores entre 0 y 1, con una distribución uniforme, esto es, cada valor en ese rango tiene la misma probabilidad de salir.&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;Posteriormente, la macro calculará los promedios de todas las muestras obtenidas y por medio de fórmulas y nombres definidos se calculá una tabla de frecuencias que alimenta el histograma, en el que se puede ver la distribución final. Pruebe ingresando en la plantilla distintos tamaños y cantidades de muestras para comprobar por usted mismo el teorema.&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;El siguiente gráfico corresponde a 10 muestras de tamaño 10 cada una (es decir, la macro calcula 10 filas, cada una siendo una muestra, por diez columnas, cada una siendo una dato de la muestra correspondiente):&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;p$1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iXathTJQI/AAAAAAAAAQk/BOwxkWNsKj0/s10n10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iXathTJQI/AAAAAAAAAQk/BOwxkWNsKj0/s10n10.jpg" style="border: 1px solid maroon;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;Como se ve, el resultado está lejos de una distribución normal. Pero si aumentamos el número de muestras incluidas empezamos a ver el poder del teorema. El siguiente gráfico fue calculado con 1000 muestras de tamaño 10 cada una (calculadas en 1000 filas x 10 columnas con la función aleatorio):&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iYU1k6syI/AAAAAAAAAQo/e4uBLeRHABo/s100n10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iYU1k6syI/AAAAAAAAAQo/e4uBLeRHABo/s100n10.jpg" style="border: 1px solid maroon;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p$1&gt;Como se ve (y no sé si sea yo el único que se emocione), el gráfico empieza a acercarse a una distribución normal, a pesar de que la distribución de los datos originales sea una distribución uniforme 0-1.&lt;/p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;Finalmente, este último gráfico corresponde a un millón de muestras. Si si, eso dije, un millón de muestras calculadas en Excel 2007, de 10 elementos cada una (esto es un millón de filas x 10 columnas con la función aleatorio). Como se ve, y esto es absolutamente impresionante, el resultado está bastante cerca de una distribución normal, aunque la distribución de los datos originales sea uniforme:&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iTisAvgyI/AAAAAAAAAQg/GPuFC9ubDYo/TLC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://lh6.ggpht.com/_eDfEXcxBNuk/S_iTisAvgyI/AAAAAAAAAQg/GPuFC9ubDYo/TLC.jpg" style="border: 1px solid maroon;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;Si este tema le resulta interesante y quiere explorar un poco más, quizás esta otra demostración le interese: &lt;a href="http://onlinestatbook.com/simulations/CLT/clt.html" target="_blank"&gt;onlinestatbook&lt;/a&gt;.&lt;/p$1&gt;&lt;/p$1&gt;&lt;br /&gt;
&lt;p$1&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;p$1&gt;&lt;p$1&gt;Adjunto una nueva versión del archivo ya que he tenido problemas con el archivo anterior (el que se muestra en las gráficas): &lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;p$1&gt;&lt;a href="http://sites.google.com/site/excelpatas/archivador-2/TeoremadelL%C3%ADmiteCentral.xls?attredirects=0&amp;amp;d=1"&gt;Teorema del Límite Central.xls &lt;/a&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;/p$1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7287786257308447724?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7287786257308447724/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/demostracion-experimental-del-teorema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7287786257308447724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7287786257308447724'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/demostracion-experimental-del-teorema.html' title='Demostración experimental del Teorema del Límite Central'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_eDfEXcxBNuk/S_iXathTJQI/AAAAAAAAAQk/BOwxkWNsKj0/s72-c/s10n10.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-8881256878853725337</id><published>2010-05-20T20:20:00.000-07:00</published><updated>2010-05-21T17:19:25.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Encontrar el último valor en un conjunto de datos: búsqueda binaria</title><content type='html'>El archivo que se encuentra al final de esta entrada presenta una animación por medio de VBA para ilustrar el algoritmo de búsqueda binaria y sirve para entender por qué para encontrar el último valor en un conjunto de datos podemos usar una fórmula como esta:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;=BUSCAR(9E+307;A:A)&lt;/blockquote&gt;&lt;br /&gt;
El valor 9e+307 es notación científica y equivale a 9 x 10 ^ 307, que con seguridad será un número mayor a cualquier otro que se encuentre en el rango de búsqueda. Al buscar un número mayor a cualquier otro dentro del rango de búsqueda, la fórmula traerá el último valor que encuentre.&lt;br /&gt;
&lt;br /&gt;
Suponiendo que el conjunto de datos en el que queremos realizar la busqueda es este:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: black; text-align: right;"&gt;42&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;3&lt;/td&gt;&lt;td style="text-align: right;"&gt;10&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;4&lt;/td&gt;&lt;td style="text-align: right;"&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;5&lt;/td&gt;&lt;td style="text-align: right;"&gt;31&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;6&lt;/td&gt;&lt;td style="text-align: right;"&gt;14&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;7&lt;/td&gt;&lt;td style="text-align: right;"&gt;15&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;8&lt;/td&gt;&lt;td style="text-align: right;"&gt;16&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;9&lt;/td&gt;&lt;td style="text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;10&lt;/td&gt;&lt;td style="text-align: right;"&gt;23&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;11&lt;/td&gt;&lt;td style="text-align: right;"&gt;9&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;12&lt;/td&gt;&lt;td style="text-align: right;"&gt;36&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;13&lt;/td&gt;&lt;td style="text-align: right;"&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;14&lt;/td&gt;&lt;td style="text-align: right;"&gt;47&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;15&lt;/td&gt;&lt;td style="text-align: right;"&gt;21&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;16&lt;/td&gt;&lt;td style="text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;17&lt;/td&gt;&lt;td style="text-align: right;"&gt;26&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;18&lt;/td&gt;&lt;td style="text-align: right;"&gt;48&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;19&lt;/td&gt;&lt;td style="text-align: right;"&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;20&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Entonces usando la fórmula propuesta tendremos este resultado:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Búsqueda binaria&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Fórmula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=BUSCAR(9E+307;A:A)&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Pero... ¿por qué arroja ese resultado la fórmula? Es más, si cambiamos el 9e+307 por algún otro valor, empezamos a tener resultados extraños:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Búsqueda binaria&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Valor buscado&lt;/td&gt;&lt;td&gt;Fórmula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;b style="color: red;"&gt;9&lt;/b&gt;&lt;/td&gt;&lt;td&gt;=BUSCAR(&lt;b style="color: red;"&gt;9&lt;/b&gt;;A:A)&lt;/td&gt;&lt;td style="text-align: center;"&gt;#N/A&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;b style="color: red;"&gt;42&lt;/b&gt;&lt;/td&gt;&lt;td&gt;=BUSCAR(&lt;b style="color: red;"&gt;42&lt;/b&gt;;A:A)&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;b style="color: red;"&gt;16&lt;/b&gt;&lt;/td&gt;&lt;td&gt;=BUSCAR(&lt;b style="color: red;"&gt;16&lt;/b&gt;;A:A)&lt;/td&gt;&lt;td style="text-align: right;"&gt;16&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Estos resultados son sumamente extraños:&lt;br /&gt;
&lt;br /&gt;
En el caso de &lt;b style="color: red;"&gt;9&lt;/b&gt;, vemos que se encuentra en la fila 11 de nuestra tabla y, sin embargo, la fórmula nos devuelve #N/A.&lt;br /&gt;
&lt;br /&gt;
En el caso del &lt;b style="color: red;"&gt;42&lt;/b&gt;, vemos que es el primer número de la tabla y, sin embargo, nos devuelve 12.&lt;br /&gt;
&lt;br /&gt;
En el caso del &lt;b style="color: red;"&gt;16&lt;/b&gt;, que se encuentra en la fila 8 del rango de búsqueda, sí nos devuelve el valor correcto.&lt;br /&gt;
&lt;br /&gt;
¿Qué está pasando? La respuesta tiene que ver con el algoritmo usado por la fórmula, llamado búsqueda binaria y que resulta muy rápido en comparación con una búsqueda lineal (dato por dato). El problema es que la búsqueda binaria funciona en datos ordenados. Esto lo podemos leer en la misma ayuda de la función (&lt;a href="http://support.microsoft.com/kb/324986/es" target="_blank"&gt;http://support.microsoft.com/kb/324986/es&lt;/a&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b class="cntnote"&gt;Importante&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;Los valores del &lt;b class="bterm"&gt;&lt;i&gt;vector_de_comparación&lt;/i&gt;&lt;/b&gt;  se deben colocar en orden ascendente: ...,-2, -1, 0, 1, 2, ..., A-Z, FALSO,  VERDADERO; de lo contrario, &lt;b class="bterm"&gt;BUSCAR&lt;/b&gt; puede devolver un valor  incorrecto.&lt;/blockquote&gt;&lt;br /&gt;
Es necesario que los datos estén ordenados de manera ascendente porque el algoritmo de búsqueda binaria irá partiendo el rango de búsqueda por mitades (de ahí su nombre) y comparará el valor buscado con el valor de la mitad, para así ir descartando datos hasta llegar a una respuesta.&lt;br /&gt;
&lt;br /&gt;
Si&amp;nbsp; buscamos 9e+307, primero encontramos el valor de la mitad y como el valor de la mitad es menor que el valor buscado, necesariamente el valor buscado estará en la mitad superior (recuerde que la función BUSCAR está asumiendo que los datos están ordenados de manera ascendente) y por lo tanto se puede descartar el 50% de los datos inferiores, pasando a buscar en el rango de datos superiores:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;42&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;3&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;10&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;4&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;5&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;31&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;6&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;14&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;7&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;15&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;8&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;16&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;9&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;10&lt;/td&gt;&lt;td style="text-align: right;"&gt;&lt;b style="color: red;"&gt;23&lt;/b&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;11&lt;/td&gt;&lt;td style="text-align: right;"&gt;9&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;12&lt;/td&gt;&lt;td style="text-align: right;"&gt;36&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;13&lt;/td&gt;&lt;td style="text-align: right;"&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;14&lt;/td&gt;&lt;td style="text-align: right;"&gt;47&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;15&lt;/td&gt;&lt;td style="text-align: right;"&gt;21&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;16&lt;/td&gt;&lt;td style="text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;17&lt;/td&gt;&lt;td style="text-align: right;"&gt;26&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;18&lt;/td&gt;&lt;td style="text-align: right;"&gt;48&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;19&lt;/td&gt;&lt;td style="text-align: right;"&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;20&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Ahora partimos el rango de datos superiores por la mitad y encontramos que nuevamente el valor de la mitad es inferior al valor buscado, así que podemos descartar nuevamente la mitad inferior del rango:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;11&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;9&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;12&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;36&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;13&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;14&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;47&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;15&lt;/td&gt;&lt;td right;="" style="text-align: right;" text-align:=""&gt;&lt;b style="color: red;"&gt;21&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;16&lt;/td&gt;&lt;td style="text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;17&lt;/td&gt;&lt;td style="text-align: right;"&gt;26&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;18&lt;/td&gt;&lt;td style="text-align: right;"&gt;48&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;19&lt;/td&gt;&lt;td style="text-align: right;"&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;20&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Una vez más partimos el rango superior (recuerde que lo estoy llamando 'superior' porque la función BUSCAR está asumiendo que los datos están ordenados de manera ascendente, así que en esa mitad se deberían encontrar valores superiores a los de la otra mitad):&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;16&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;17&lt;/td&gt;&lt;td style="color: #999999; text-align: right;"&gt;26&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;18&lt;/td&gt;&lt;td right;="" style="text-align: right;" text-align:=""&gt;&lt;b style="color: red;"&gt;48&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;19&lt;/td&gt;&lt;td style="text-align: right;"&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;20&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
De nuevo descartamos la mitad inferior, pues el valor buscado es mayor al valor de la mitad:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col style="width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;19&lt;/td&gt;&lt;td right;="" style="text-align: right;" text-align:=""&gt;&lt;b style="color: red;"&gt;22&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 17px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;20&lt;/td&gt;&lt;td style="text-align: right;"&gt;12&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Y como se ve, el único resultado posible es el último valor, no importa cuáles sean los datos del rango en el que se busca, si el valor buscado es mayor a cualquier otro dato al interior de la tabla, siempre pasará lo mismo y arrojará como resultado el último valor.&lt;br /&gt;
&lt;br /&gt;
Intente usted seguir la secuencia para llegar a los resultados obtenidos cuando se busca &lt;b style="color: red;"&gt;9&lt;/b&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;b style="color: red;"&gt;42&lt;/b&gt;&lt;span style="color: black;"&gt; y &lt;/span&gt;&lt;b style="color: red;"&gt;6&lt;/b&gt;&lt;span style="color: red;"&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;b style="color: red;"&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Si quiere seguir una animación y observar los resultados devueltos en distintas condiciones descarque el archivo: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/B%C3%BAsquedabinaria.xls?attredirects=0&amp;d=1"&gt;Búsqueda binaria.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
En el archivo se presenta una animación que ilustra paso a paso lo que está haciendo la fórmula y cómo llega al resultado.&lt;br /&gt;
&lt;br /&gt;
Tenga en cuenta que el código que usado en el arhivo para ejemplificar la búsqueda &lt;b&gt;NO&lt;/b&gt; equivale en lo absoluto al algoritmo que se encuentra detrás de la fórmula. El código simplemente sirve para ilustrar paso a paso el proceso de búsqueda binaria pero no representa como tal el algoritmo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-8881256878853725337?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/8881256878853725337/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/encontrar-el-ultimo-valor-en-un.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8881256878853725337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8881256878853725337'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/encontrar-el-ultimo-valor-en-un.html' title='Encontrar el último valor en un conjunto de datos: búsqueda binaria'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7552915462329164891</id><published>2010-05-20T12:57:00.000-07:00</published><updated>2010-05-20T22:29:26.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Desplazarse por una hoja de Excel usando el cuadro de nombres</title><content type='html'>El cuadro de nombres, que se encuentra a la izquierda de la barra de fórmulas, es una herramienta muy útil para asignar rápidamente nombres a celdas y desplazarse a lo largo de la hoja. El siguiente vídeo explica rápidamente cómo usarla:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JMSa0n2IQJA&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JMSa0n2IQJA&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Si usted conoce algún otro truco para desplazarse rápidamente a través de la hoja o trabajar con nombres definidos, compártalo en la sección de comentarios… únase a la lucha para reducir el analfabetismo tecnológico en Excel :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7552915462329164891?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7552915462329164891/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/desplazarse-facilmente-por-una-hoja-de.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7552915462329164891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7552915462329164891'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/desplazarse-facilmente-por-una-hoja-de.html' title='Desplazarse por una hoja de Excel usando el cuadro de nombres'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-206435188535343349</id><published>2010-05-19T15:50:00.000-07:00</published><updated>2010-05-19T17:05:00.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Borrar todas las imágenes insertadas en una hoja de Excel</title><content type='html'>El siguiente vídeo explica cómo borrar rápidamente todas las imágenes insertadas en una hoja de Excel, haciendo uso de "Ir a".&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Para ello, en la hoja en la que tiene las imágenes, presione F5, seleccione "Especial" (puede presionar Alt+e) y ahora seleccione objetos (o presione "j"). Si todo ha salido bien, habrá seleccionado todas los objetos en la hoja. Ahora puede presionar Suprimir o Borrar.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/U8x2XHaqIFU&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/U8x2XHaqIFU&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
El código equivalente para llevar a cabo esta acción lo puede obtener fácilmente con la grabadora de macros y se puede resumir en una línea:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;Sheets("Hoja1").DrawingObjects.Delete&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-206435188535343349?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/206435188535343349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-todas-las-imagenes-insertadas-en.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/206435188535343349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/206435188535343349'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-todas-las-imagenes-insertadas-en.html' title='Borrar todas las imágenes insertadas en una hoja de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3475977583156240577</id><published>2010-05-19T12:41:00.001-07:00</published><updated>2010-11-25T21:17:58.871-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Funciones definidas por el usuario'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Mostrar fórmula en una celda</title><content type='html'>La siguiente función definida por el usuario permitirá mostrar la fórmula de la celda que se le indique en diferentes formatos. A continuación, una pequeña descripción de su uso:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;MostrarFormula(&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Formula&lt;/b&gt;&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Tipo&lt;/b&gt;&lt;/span&gt;[Argumento opcional],&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Celda&lt;/span&gt;&lt;/b&gt;[Argumento opcional])&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Formula&lt;/span&gt;&lt;/b&gt; es una referencia a la celda que contiene la fórmula que se desea mostrar.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Tipo&lt;/span&gt;&lt;/b&gt;[Argumento opcional]. Es el tipo de fórmula que se desea mostrar:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-indent: 4em;"&gt;&lt;b&gt;0&lt;/b&gt; para mostrar la fórmula tal cual fue ingresada en la celda (es el valor por defecto).&lt;/div&gt;&lt;div style="text-indent: 4em;"&gt;&lt;b&gt;1&lt;/b&gt; para mostrar la fórmula en inglés.&lt;/div&gt;&lt;div style="text-indent: 4em;"&gt;&lt;b&gt;2&lt;/b&gt; para mostrarla en referencia tipo R1C1.&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Celda&lt;/span&gt;&lt;/b&gt;[Argumento opcional], indica si se mostrará la dirección de la celda en la que se encuentra la fórmula que se desea mostrar. Falso (0) es el valor predeterminado, así que si se omite no mostrará la dirección de la celda. Verdadero (1) mostrará la dirección de la celda antecediendo a la fórmula.&lt;/blockquote&gt;&lt;br /&gt;
Así, si en &lt;b&gt;A11&lt;/b&gt; se tiene la fórmula &lt;b&gt;=SUMA(A1:A10)&lt;/b&gt;, MostrarFormula dará los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;MostrarFormula(Formula,[Tipo],[Celda])&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Formula&lt;/td&gt;&lt;td&gt;Resultado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=MostrarFormula(A11)&lt;/td&gt;&lt;td&gt;=SUMA(A1:A10)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=MostrarFormula(A11,,1)&lt;/td&gt;&lt;td&gt;A11: =SUMA(A1:A10)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=MostrarFormula(A11,2)&lt;/td&gt;&lt;td&gt;=SUM(R[-10]C:R[-1]C)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;=MostrarFormula(A11,1,VERDADERO)&lt;/td&gt;&lt;td&gt;A11: =SUM(A1:A10)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Si la celda ingresada en MostrarFormula contiene un fórmula matricial, el resultado arrojado se mostrará entre { } indicando que es una fórmula matricial.&lt;br /&gt;
&lt;br /&gt;
Si la celda ingresada en MostrarFormula no contiene una fórmula, la función arrojará error de #N/A.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Function MostrarFormula(ByVal Formula As Excel.Range, _
                        Optional ByVal Tipo As Byte = 0, _
                        Optional ByVal Celda As Boolean = False) As Variant
    
    Dim Ref As String
    
    If Formula.HasFormula Then
        
        If Celda = True Then Ref = Formula.Address(0, 0) &amp; ": "
        
        Select Case Tipo
            Case 0
                If Formula.HasArray Then
                    MostrarFormula = Ref &amp; "{" &amp; Formula.FormulaLocal &amp; "}"
                Else
                    MostrarFormula = Ref &amp; Formula.FormulaLocal
                End If
            Case 1
                If Formula.HasArray Then
                    MostrarFormula = Ref &amp; "{" &amp; Formula.Formula &amp; "}"
                Else
                    MostrarFormula = Ref &amp; Formula.Formula
                End If
            Case 2
                If Formula.HasArray Then
                    MostrarFormula = Ref &amp; "{" &amp; Formula.FormulaR1C1 &amp; "}"
                Else
                    MostrarFormula = Ref &amp; Formula.FormulaR1C1
                End If
        End Select
    
    Else
        
        MostrarFormula = VBA.CVErr(xlErrNA)
    
    End If
    
End Function
&lt;/pre&gt;&lt;br /&gt;
En este otro tema encontrará una macro que permite crear una matriz con la dirección, el valor y la fórmula de uno o varios rangos seleccionados: &lt;a href="http://excelpatas.blogspot.com/2010/11/mostrar-todas-las-formulas-de-uno-o.html" target="_blank"&gt;Mostrar todas las fórmulas de uno o varios rangos&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3475977583156240577?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3475977583156240577/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/mostrar-formula-en-una-celda_19.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3475977583156240577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3475977583156240577'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/mostrar-formula-en-una-celda_19.html' title='Mostrar fórmula en una celda'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2825194769498092551</id><published>2010-05-19T11:19:00.001-07:00</published><updated>2010-05-19T11:19:45.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tablas dinámicas'/><title type='text'>Filtrar por rango de fechas en una tabla dinámica</title><content type='html'>La siguiente macro de evento permitirá filtrar entre un rango de fechas en el filtro de informe de una tabla dinámica, lo que evitará tener que seleccionar de manera manual las fechas correspondientes al rango que se desea filtrar.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Para ello, haremos uso de dos celdas complementarias en las cuales indicaremos la fecha inicial y la fecha final del rango entre el cual queremos filtrar.&lt;br /&gt;
&lt;br /&gt;
En el archivo de ejemplo he usado la celda B2 para ingresar la celda inicial y la celda B3 para ingresar la fecha final que indicarán las fechas a filtrar en el filtro de informe llamado "Fecha": &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Filtrarentrefechas.xls?attredirects=0&amp;amp;d=1"&gt;Filtrar entre fechas.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        
    Dim Fecha_i As Date
    Dim Fecha_f As Date
    Dim Fecha As Date
    Dim pi As PivotItem
    
    If Not Application.Intersect(Target, Me.Range("b2:b3")) Is Nothing Then
    
        If Me.Range("b3") &amp;lt;= Me.Range("b2") Then
            
            With Application
                .EnableEvents = False
                .Undo
                .EnableEvents = True
            End With
            
            MsgBox prompt:="La fecha de inicio debe ser menor a la fecha final.", title:="Filtro fechas"
                   
        Else
            
            On Error Resume Next
            
            Fecha_i = Me.Range("b2")
            Fecha_f = Me.Range("b3")
            
            Application.ScreenUpdating = False
            
            With ActiveSheet.PivotTables(1).PivotFields("Fecha")
                .EnableMultiplePageItems = True
                Application.EnableEvents = False
                For Each pi In .PivotItems
                    pi.Visible = True
                    Fecha = VBA.Format(pi.Value, "mm-dd-yy")
                    If Fecha &amp;lt; Fecha_i Or Fecha &amp;gt; Fecha_f Then
                          pi.Visible = False
                    End If
                Next pi
                Application.EnableEvents = True
            End With
            
            Application.ScreenUpdating = True

        End If
        
    End If
    
End Sub
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2825194769498092551?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2825194769498092551/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/filtrar-por-rango-de-fechas-en-una_19.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2825194769498092551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2825194769498092551'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/filtrar-por-rango-de-fechas-en-una_19.html' title='Filtrar por rango de fechas en una tabla dinámica'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-8659241737568791100</id><published>2010-05-19T11:18:00.000-07:00</published><updated>2010-05-20T13:11:30.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formato'/><category scheme='http://www.blogger.com/atom/ns#' term='Trucos'/><title type='text'>Rellenar el espacio restante de una celda con un carácter en específico</title><content type='html'>Por medio del formato personalizado se pueden lograr algunos efectos interesantes para mostrar en una celda. El siguiente vídeo muestra cómo repetir un carácter en específo en el espacio restante de una celda, sin importar cuál sea el ancho de la columna y sin afectar el valor en la celda.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Eh72pBut75M&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Eh72pBut75M&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Para más y mejor información, consulte la ayuda de Microsoft Excel: &lt;a href="http://office.microsoft.com/es-es/excel-help/crear-o-eliminar-un-formato-de-numero-personalizado-HP001216503.aspx" target="_blank"&gt;Crear o eliminar un formato de número personalizado&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Si conoce algún truco interesante para el formato personalizado, ¡no dude en compartirlo en la sección de comentarios!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-8659241737568791100?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/8659241737568791100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/rellenar-el-espacio-restante-de-una.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8659241737568791100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8659241737568791100'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/rellenar-el-espacio-restante-de-una.html' title='Rellenar el espacio restante de una celda con un carácter en específico'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2966399291678518092</id><published>2010-05-18T07:28:00.000-07:00</published><updated>2010-05-20T13:18:44.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Borrar todos los comentarios de un libro</title><content type='html'>La siguiente función permite borrar todos los comentarios de un libro de Excel. La función devolverá Verdadero en caso de que se hayan borrado exitosamente todos los comentarios y Falso en caso de que no se haya presentado algún error:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;pre&gt;Function borrar_comentarios(ByVal wbLibro As Excel.Workbook) As Boolean

    On Error Resume Next
        wbLibro.RemoveDocumentInformation xlRDIComments
        borrar_comentarios = Not VBA.CBool(Err.Number)
    On Error GoTo 0
    
End Function&lt;/pre&gt;&lt;br /&gt;
Para usarla, simplemente invóquela pasando como argumento el libro cuyos comentarios quiere borrar:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()
 
    If borrar_comentarios(ActiveWorkbook) = True Then
        MsgBox "Se han borrado exitosamente todos los comentarios."      
    Else   
        MsgBox "No ha sido posible borrar los comentarios."    
    End If
        
End Sub&lt;/pre&gt;&lt;br /&gt;
Tenga en cuenta que el método RemoveDocumentInformation usado en la función sólo está disponible en Excel 2007, gracias al Inspector de Documentos. En versiones anteriores habría que recorrer cada hoja y luego cada comentario en la hoja y eliminarlo uno a uno, algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub borrar_comentarios()

    Dim hj As Excel.Worksheet
    Dim cmt As Excel.Comment
    
    For Each hj In ActiveWorkbook.Worksheets
        For Each cmt In hj.Comments
            cmt.Delete
        Next cmt
    Next hj
    
End Sub&lt;/pre&gt;&lt;br /&gt;
De manera curiosa, la macro borrará los comentarios sin importar que la hoja esté protegida.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2966399291678518092?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2966399291678518092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-todos-los-comentarios-de-un.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2966399291678518092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2966399291678518092'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-todos-los-comentarios-de-un.html' title='Borrar todos los comentarios de un libro'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-6970556296466357278</id><published>2010-05-14T23:20:00.000-07:00</published><updated>2010-05-14T23:20:18.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Listas dependientes sin Desref o Indirecto</title><content type='html'>Las formas conocidas y frecuentes de hacer listas dependientes involucran a las funciones DESREF o INDIRECTO, ya sea como parte de un nombre definido o como parte de una fórmula en la hoja de cálculo.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Las siguientes fórmulas son una alternativa sin usar estas funciones, buscando disminuir el tiempo de recálculo del archivo que se puede ver fuertemente afectado por el uso de funciones volátiles. Tampoco se hace uso de nombres definidos.&lt;br /&gt;
&lt;br /&gt;
He partido del archivo de ejemplo que ha subido uno de los más grande difusores de Excel en Español: Jorge L. Dunkelman. Esta entrada es una respuesta a su tema: &lt;a href="http://jldexcelsp.blogspot.com/2010/05/rangos-dinamicos-y-funciones-volatiles.html" target="_blank"&gt;Rangos dinámicos y funciones volátiles&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Estructura de los datos&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="background-color: white; font-family: Calibri,Arial; font-size: 11pt; padding-left: 2pt; padding-right: 2pt;"&gt;&lt;colgroup&gt;&lt;col style="font-weight: bold; width: 30px;"&gt;&lt;/col&gt;&lt;col style="width: 83px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;col style="width: 80px;"&gt;&lt;/col&gt;&lt;col style="width: 53px;"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 8pt; font-weight: bold; text-align: center;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 19px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;2&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;Zona&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;Agentes&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px; darkgreen font-family: Consolas; font-weight: bold;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 18px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;3&lt;/td&gt;&lt;td style="background-color: #ffffcc; border-bottom-style: solid; border-color: #000000; border-left-style: solid; border-right-style: solid; border-width: 1px;"&gt;Norte&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Juan&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Roberto&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-right-style: solid; border-width: 1px;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 18px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;4&lt;/td&gt;&lt;td style="background-color: #ffffcc; border-bottom-style: solid; border-color: #000000; border-left-style: solid; border-right-style: solid; border-width: 1px;"&gt;Sur&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Mario&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Alberto&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Marcelo&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Rubén&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-right-style: solid; border-width: 1px;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 18px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;5&lt;/td&gt;&lt;td style="background-color: #ffffcc; border-bottom-style: solid; border-color: #000000; border-left-style: solid; border-right-style: solid; border-width: 1px;"&gt;Este&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Daniel&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Ricardo&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;Ernesto&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 1px;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-right-style: solid; border-width: 1px;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 19px;"&gt;&lt;td style="background-color: #cacaca; font-size: 8pt; text-align: center;"&gt;6&lt;/td&gt;&lt;td style="background-color: #ffffcc; border-bottom-style: solid; border-bottom-width: 2px; border-color: #000000; border-left-style: solid; border-left-width: 1px; border-right-style: solid; border-right-width: 1px;"&gt;Oeste&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px;"&gt;Germán&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px;"&gt;Antonio&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px;"&gt;Manuel&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-color: #000000; border-width: 2px;"&gt;Alejando&lt;/td&gt;&lt;td style="border-bottom-style: solid; border-bottom-width: 2px; border-color: #000000; border-right-style: solid; border-right-width: 1px;"&gt;Esteban&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Las siguientes tres fórmulas se pueden introducir en una Lista de Validación de datos, que dependerá de la zona que se ingrese en la celda &lt;b&gt;B9&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Fórmulas en Lista de Validación de datos&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Validación de datos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Op1&lt;/td&gt;&lt;td&gt;=INDICE(C3:G6;COINCIDIR(B9;B3:B6;0);0)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Op2&lt;/td&gt;&lt;td&gt;=ELEGIR(COINCIDIR(B9;B3:B6;0);C3:D3;C4:F4;C5:E5;C6:G6)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Op3&lt;/td&gt;&lt;td&gt;=INDICE(C3:C6;COINCIDIR(B9;B3:B6;0)):INDICE(C3:G6;COINCIDIR(B9;B3:B6;0);CONTARA(INDICE(C3:G6;COINCIDIR(B9;B3:B6;0);0)))&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Arial, Arial; font-size: 8pt;"&gt;Tenga en cuenta el separador de argumentos de acuerdo con la configuración regional de su equipo.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
La primera opción (Op1) es ideal si todas las listas dependientes tienen la misma cantidad de datos y éstos van a permanecer constantes. Es decir, en todas las Zonas habrán siempre la misma cantidad de Agentes.&lt;br /&gt;
&lt;br /&gt;
La segunda opción (Op2) es ideal si las listas dependientes tienen distinta cantidad de datos y éstos van a permanecer constantes. Es decir, suponiendo que la Zona Norte siempre va a tener 2 Agentes, la zona Sur siempre va a tener 4 Agentes, etc.&lt;br /&gt;
&lt;br /&gt;
La tercera opción (Op3) es ideal si las listas dependientes tiene distinta cantidad de datos y éstos pueden variar con frecuencia.&lt;br /&gt;
&lt;br /&gt;
Bueno, son sólo algunas ideas pensando en evitar el uso de DESREF e INDIRECTO para la creación de listas dependientes... si tiene alguna otra idea o una alternativa a lo propuesto ¡por favor coméntela!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://sites.google.com/site/excelpatas/archivador-2/listasdependientesnovol%C3%A1tiles.xls?attredirects=0&amp;amp;d=1"&gt;Listas dependientes no volátiles.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-6970556296466357278?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/6970556296466357278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/listas-dependientes-sin-desref-o_14.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6970556296466357278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/6970556296466357278'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/listas-dependientes-sin-desref-o_14.html' title='Listas dependientes sin Desref o Indirecto'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-8765370035214266880</id><published>2010-05-14T22:56:00.000-07:00</published><updated>2010-05-17T22:25:59.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Borrar los datos al interior de una o más tablas</title><content type='html'>La siguiente macro permite borrar el contenido de las tablas que se seleccionen en el InputBox. La macro borrará todos los datos en la selección que no sean fórmulas y no estén en negrita.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Esto, porque se asume que los encabezados de la tabla se han resaltado con negrita y que al borrar los datos de la tabla se quieren conservar las fórmulas para reutilizarlas con nuevos ingresos.&lt;br /&gt;
&lt;br /&gt;
La macro también verificará si la hoja está protegida y de estarlo, se asume que las celdas que se quieren borrar son aquellas desbloqueadas, por lo que se borrará el contenido de toda celda desbloqueada de la selección, incluidas en este caso las que contengan fórmulas y exceptuando sólo las que se encuentren en negrita.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Limpiar_tablas()


    Dim dato As Excel.Range
    Dim tablas As Excel.Range
    Dim Calculo As Integer
    
    
    On Error GoTo Salir
        Set tablas = Application.InputBox(prompt:="Seleccione el rango con las tablas a limpiar.", _
                                          Title:="Limpiar tablas", _
                                          Type:=8)
    On Error GoTo 0
    
    
    With Application
        Calculo = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With
    
    
    If MsgBox(prompt:="Se van a borrar datos en el rango " &amp; _
                       tablas.Address(0, 0) &amp; vbLf &amp; vbLf &amp; _
                       "¿Desea continuar?", _
              Buttons:=vbYesNo + vbQuestion, _
              Title:="Limpiar tablas") = vbYes Then
    
        If tablas.Cells.Count &gt; 1 Then
        
            If tablas.Parent.ProtectContents Then
            
                For Each dato In tablas
                    If Not dato.Locked And Not dato.Font.Bold Then
                        dato.MergeArea.ClearContents
                    End If
                Next dato
                
            Else
            
                On Error GoTo Salir
                    Set tablas = tablas.SpecialCells(xlCellTypeConstants)
                On Error GoTo 0
                 
                For Each dato In tablas
                    If Not dato.Font.Bold Then
                        dato.MergeArea.ClearContents
                    End If
                Next dato
                
            End If
             
        End If
    
    End If
    
    
Salir:


    Set tablas = Nothing

    With Application
        .ScreenUpdating = True
        .Calculation = Calculo
    End With
    

End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-8765370035214266880?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/8765370035214266880/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-los-datos-al-interior-de-una-o.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8765370035214266880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8765370035214266880'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/borrar-los-datos-al-interior-de-una-o.html' title='Borrar los datos al interior de una o más tablas'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4268627239705327811</id><published>2010-05-14T09:39:00.003-07:00</published><updated>2010-05-14T21:48:21.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Búsqueda en una tabla de doble entrada</title><content type='html'>Un problema muy frecuente es el de realizar una búsqueda con dos criterios en una tabla de doble entrada. Por suerte, Excel ofrece muchas alternativas para llevar esto a cabo.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
En el archivo van algunas ideas para realizar dichas búsquedas con fórmulas, algunas funcionan muy bien para la gran mayoría de los casos, otras sólo en caso de que los datos al interior de la tabla sean numéricos, otras requieren de nombres definidos, etc. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Buscarcondospar%C3%A1metros.xls?attredirects=0&amp;amp;d=1"&gt;Buscar con dos parámetros.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Estructura de los datos&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;table border="0" cellspacing="0" cellpadding="0" style="font-family:Calibri,Arial; font-size:11pt; background-color:#ffffff; padding-left:2pt;  padding-right:2pt; "&gt;&lt;colgroup&gt;&lt;col style="font-weight:bold; width:30px;  " /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:83px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:81px;" /&gt;&lt;col style="width:80px;" /&gt;&lt;/colgroup&gt;
&lt;tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "&gt;&lt;td &gt;&amp;#160;&lt;/td&gt;&lt;td &gt;B&lt;/td&gt;&lt;td &gt;C&lt;/td&gt;&lt;td &gt;D&lt;/td&gt;&lt;td &gt;E&lt;/td&gt;&lt;td &gt;F&lt;/td&gt;&lt;td &gt;G&lt;/td&gt;&lt;td &gt;H&lt;/td&gt;&lt;td &gt;I&lt;/td&gt;&lt;td &gt;J&lt;/td&gt;&lt;td &gt;K&lt;/td&gt;&lt;td &gt;L&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;4&lt;/td&gt;&lt;td style=" border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;&amp;#160;&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna1&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna2&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna3&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna4&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna5&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna6&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna7&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna8&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna9&lt;/td&gt;&lt;td style="font-weight:bold;  border-top-style:solid;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;Columna10&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;5&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila1&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,58195647&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,02308622&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,96915549&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,57549749&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,07282197&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,16483116&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,300760201&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,87158941&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,17995409&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,90422252&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;6&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila2&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,80713529&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,61240727&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,42076457&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,10258494&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,14065068&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,65299679&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,436666154&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,27669217&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,74877161&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,2645273&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;7&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila3&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,07881568&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,33447968&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,11295261&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,42036129&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,3457091&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,04878022&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,686620649&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,28437788&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,95929722&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,02896422&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;8&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila4&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,95476975&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,78349243&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,11798208&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,25431993&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,92440227&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,17821755&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,181947608&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,46936239&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,98096472&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,08172721&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;9&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila5&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,33900395&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,27142453&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,23793217&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,02386209&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,3553072&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,87219599&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,883272854&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,0462209&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,55085354&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,92367039&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;10&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila6&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,21281309&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,78983852&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,73169533&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,1722176&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,41975709&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,13649921&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,285230511&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,81417633&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,69248451&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,61449292&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;11&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila7&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,30705161&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,33464043&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,922971&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,0417685&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,7144045&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,32095338&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,269071289&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,57578753&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,13861776&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,61712884&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;12&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila8&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,31766016&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,23185527&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,96287856&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,9179961&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,2045303&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,76603606&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,158445322&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,29673799&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,17838265&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,45563426&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;13&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila9&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,44986295&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,29158999&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,56821813&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,21937649&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,7241798&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,4743755&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,686755468&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,83959412&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,60432142&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,92421154&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height:18px ;" &gt;&lt;td style="font-size:8pt; background-color:#cacaca; text-align:center; " &gt;14&lt;/td&gt;&lt;td style="font-weight:bold;  border-right-style:solid;  border-bottom-style:solid;  border-left-style:solid;  border-width:1px;  border-color:#000000; "&gt;Fila10&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,94643051&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,58292759&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,82495084&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,37569035&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,38561198&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,84701864&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,822938159&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,24320802&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,74477566&lt;/td&gt;&lt;td style="text-align:right;  border-right-style:solid;  border-bottom-style:solid;  border-width:1px;  border-color:#000000; "&gt;0,29698415&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Formulas para buscar con dos criterios&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: Arial; font-size: 9pt;"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca; font-size: 10pt;"&gt;&lt;td&gt;Celda&lt;/td&gt;&lt;td&gt;Formula&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C20&lt;/td&gt;&lt;td&gt;=INDICE(C5:L14,,COINCIDIR(C19,C4:L4,0)) INDICE(C5:L14,COINCIDIR(B20,B5:B14,0),)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C22&lt;/td&gt;&lt;td&gt;=INDIRECTO(DIRECCION(COINCIDIR(B20,B$1:B14,0),COINCIDIR(C19,$A4:L4,0)))&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C24&lt;/td&gt;&lt;td&gt;=INDICE(C5:L14,COINCIDIR(B20,B5:B14,0),COINCIDIR(C19,C4:L4,0))&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C26&lt;/td&gt;&lt;td&gt;=DESREF(B4,COINCIDIR(B20,B5:B14,0),COINCIDIR(C19,C4:L4,0),1,1)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C28&lt;/td&gt;&lt;td&gt;=MAX(INDICE((B5:B14=B20)*(C4:L4=C19)*C5:L14,0,0))&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C30&lt;/td&gt;&lt;td&gt;=SUMAPRODUCTO((C4:L4=C19)*(B5:B14=B20)*C5:L14)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C32&lt;/td&gt;&lt;td&gt;=BUSCARV(B20,B5:L14,COINCIDIR(C19,B4:L4),0)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C34&lt;/td&gt;&lt;td&gt;{=MAX((B5:B14=B20)*(C4:L4=C19)*C5:L14)}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C36&lt;/td&gt;&lt;td&gt;=INDIRECTO(B20) INDIRECTO(C19)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Arial, Arial; font-size: 8pt;"&gt;Tenga en cuenta el separador de argumentos de acuerdo con la configuración regional de su equipo.&lt;/span&gt;&lt;span style="font-family: Arial, Arial; font-size: 8pt;"&gt;&lt;br /&gt;
Los &lt;/span&gt;&lt;span style="font-family: Arial, Arial; font-size: 8pt; font-weight: bold;"&gt;{ }&lt;/span&gt;&lt;span style="font-family: Arial, Arial; font-size: 8pt;"&gt; se obtienen confirmando la fórmula con Ctrl+Mayus+Intro (Ctrl+Shift+Enter).&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Seguro hay más soluciones, así que si alguien desea complementar con alguna otra idea ¡pues bienvenido!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4268627239705327811?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4268627239705327811/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/busqueda-en-una-tabla-de-doble-entrada.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4268627239705327811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4268627239705327811'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/busqueda-en-una-tabla-de-doble-entrada.html' title='Búsqueda en una tabla de doble entrada'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3453794077670698008</id><published>2010-05-14T09:39:00.001-07:00</published><updated>2010-05-19T12:44:19.365-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Valores correspondientes a ColorIndex</title><content type='html'>ColorIndex permite fácilmente aplicar un color a muchos de los objectos en Excel. Obtener la paleta de colores que ofrece colorIndex es muy fácil por medio de una macro. El siguiente código creará una hoja nueva mostrando los colores y su número índice correspondiente:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;pre&gt;Sub colores()

    Dim x As Long
    
    With Sheets.Add
    
        For x = 1 To 56
        
            Select Case x
                Case Is &lt; 15
                    .Cells(x, 1).Interior.ColorIndex = x
                    .Cells(x, 2).Value = " --&gt; " &amp; x
                Case Is &lt; 29
                    .Cells(x - 14, 3).Interior.ColorIndex = x
                    .Cells(x - 14, 4).Value = " --&gt; " &amp; x
                Case Is &lt; 43
                    .Cells(x - 28, 5).Interior.ColorIndex = x
                    .Cells(x - 28, 6).Value = " --&gt; " &amp; x
                Case Is &lt; 57
                    .Cells(x - 42, 7).Interior.ColorIndex = x
                    .Cells(x - 42, 8).Value = " --&gt; " &amp; x
            End Select
            
        Next x
        
    End With
    
End Sub
&lt;/pre&gt;El resultado tras ejecutar la macro:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;table border="0" cellspacing="0" cellpadding="0" style="BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 2pt;  PADDING-RIGHT: 2pt; FONT-FAMILY: Consolas,Arial; FONT-SIZE: 10pt"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;col style="WIDTH: 80px"&gt;&lt;/colgroup&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #000000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 1&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #c0c0c0"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 15&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #800080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 29&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #99cc00"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 43&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 2&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #808080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 16&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #800000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 30&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ffcc00"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 44&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #ff0000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 3&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #9999ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 17&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #008080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 31&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ff9900"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 45&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #00ff00"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 4&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #993366"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 18&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #0000ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 32&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ff6600"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 46&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #0000ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 5&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ffffcc"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 19&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #00ccff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 33&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #666699"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 47&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #ffff00"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 6&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ccffff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 20&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ccffff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 34&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #969696"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 48&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #ff00ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 7&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #660066"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 21&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ccffcc"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 35&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #003366"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 49&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #00ffff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 8&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ff8080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 22&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ffff99"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 36&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #339966"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 50&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #800000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 9&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #0066cc"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 23&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #99ccff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 37&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #003300"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 51&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #008000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 10&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ccccff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 24&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ff99cc"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 38&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #333300"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 52&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #000080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 11&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #000080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 25&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #cc99ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 39&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #993300"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 53&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #808000"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 12&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ff00ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 26&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ffcc99"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 40&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #993366"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 54&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #800080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 13&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #ffff00"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 27&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #3366ff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 41&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #333399"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 55&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT: 17px" &gt;&lt;td style="BACKGROUND-COLOR: #008080"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 14&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #00ffff"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 28&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #33cccc"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 42&lt;/td&gt;&lt;td style="BACKGROUND-COLOR: #333333"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt; --&amp;gt; 56&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3453794077670698008?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3453794077670698008/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/valores-correspondientes-colorindex.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3453794077670698008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3453794077670698008'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/valores-correspondientes-colorindex.html' title='Valores correspondientes a ColorIndex'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4534011155136009743</id><published>2010-05-14T09:38:00.001-07:00</published><updated>2010-06-16T21:02:24.325-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Descomprimir un archivo por medio de VBA</title><content type='html'>La siguiente función descomprimirá un archivo haciendo uso del programa de compresión de Windows:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Function Descomprimir(ByVal origen As Variant, ByVal destino As Variant) As Boolean

    
    Dim oApp As Object
  
    
    Set oApp = CreateObject("Shell.Application")
    
    Descomprimir = False
    
    
    If VBA.Right(origen, 4) = ".zip" Then
    
        If Not VBA.Right(destino, 1) = Application.PathSeparator Then
            destino = destino &amp;amp; Application.PathSeparator
        End If
  
        On Error GoTo Salir
        oApp.Namespace(destino).CopyHere oApp.Namespace(origen).items
        On Error GoTo 0
        
        Descomprimir = True
        
    End If

Salir:

    Set oApp = Nothing

End Function
&lt;/pre&gt;&lt;br /&gt;
Los argumentos origen y destino deben ser de tipo variant cuando se pasan a la función y se refieren a la ruta en la que se encuentra el archivo comprimido y la ruta de la carpeta a la que se quiere descomprimir.&lt;br /&gt;
&lt;br /&gt;
Suponiendo que el archivo que quiero descomprimir es: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;C:\Users\Mauricio\Documents\Downloads\Prueba.zip&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
y que lo quiero descomprimir a la carpeta: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;C:\Users\Mauricio\Documents\Oficina\Informe mensual\&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Entonces podría usar algo así (nótese que estoy declarando las rutas de los archivos como variant y no como string):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub ejemplo_descomprimir()


    Dim archivo_comprimido As Variant
    Dim carpeta_destino As Variant

     
    archivo_comprimido = "&lt;span style="color: red;"&gt;C:\Users\Mauricio\Documents\Downloads\Prueba.zip&lt;/span&gt;"
    carpeta_destino = "&lt;span style="color: red;"&gt;C:\Users\Mauricio\Documents\Oficina\Informe mensual\&lt;/span&gt;"

     
    If Descomprimir(archivo_comprimido, carpeta_destino) Then

        MsgBox "Se ha descomprimido exitosamente el archivo."

    Else

        MsgBox "No se ha logrado descomprimir el archivo."

    End If
     
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4534011155136009743?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4534011155136009743/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/descomprimir-un-archivo-por-medio-de_14.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4534011155136009743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4534011155136009743'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/descomprimir-un-archivo-por-medio-de_14.html' title='Descomprimir un archivo por medio de VBA'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-151190299597972120</id><published>2010-05-14T09:35:00.001-07:00</published><updated>2010-05-22T11:40:49.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Crear automáticamente copia de un libro de Excel</title><content type='html'>La siguiente función creará una copia en la misma ruta del libro que se la pase como argumento, y devolverá el nombre completo y la ruta de la copia creada:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Function crear_copia(ByVal Libro As Excel.Workbook) As String

        With Libro
            .Save
            crear_copia = .Path &amp;amp; Application.PathSeparator &amp;amp; VBA.Format(VBA.Now, "d-m-yy h-mm ") &amp;amp; .Name
            .SaveCopyAs crear_copia
        End With
        
End Function
&lt;/pre&gt;&lt;br /&gt;
Para identificar las copias que se vayan creando, se antepondrá al nombre del archivo la fecha y la hora en formato &lt;span class="Apple-style-span" style="color: #073763;"&gt;d-m-yy h-mm&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Si se quisiera crear una copia de un libro de Excel cada vez que se abra, bastará con copiar la función en un módulo y en el evento open the Thisworkbook usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Private Sub Workbook_Open()

    Dim copia As String
    
    If MsgBox("¿Desea crear una copia del archivo?", vbYesNo) = vbYes Then
        copia = crear_copia(ActiveWorkbook)
        MsgBox "Se ha creado una copia: " &amp;amp; vbLf &amp;amp; copia, vbInformation
    End If
    
End Sub
&lt;/pre&gt;&lt;br /&gt;
Acá puede descargar un archivo de prueba con la función crear_copia y la macro en el evento Open de ThisWorkbook para llamarla automáticamente una vez se habiliten las macros: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Funci%C3%B3ncrearcopia.xls?attredirects=0&amp;amp;d=1"&gt;Crear copia.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-151190299597972120?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/151190299597972120/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/crear-automaticamente-copia-de-un-libro_14.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/151190299597972120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/151190299597972120'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/crear-automaticamente-copia-de-un-libro_14.html' title='Crear automáticamente copia de un libro de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2872020930891815645</id><published>2010-05-13T21:35:00.001-07:00</published><updated>2010-05-13T23:20:40.551-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Usar una función definida por el usuario</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2sdK7jkAbbA&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2sdK7jkAbbA&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2872020930891815645?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2872020930891815645/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/usar-una-funcion-definida-por-el.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2872020930891815645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2872020930891815645'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/usar-una-funcion-definida-por-el.html' title='Usar una función definida por el usuario'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3084749813143158535</id><published>2010-05-13T21:02:00.001-07:00</published><updated>2010-05-13T23:21:10.408-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><title type='text'>Copiar un código de VBA en ThisWorkbook</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ee-tFndC1d0&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ee-tFndC1d0&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3084749813143158535?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3084749813143158535/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-thisworkbook.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3084749813143158535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3084749813143158535'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-thisworkbook.html' title='Copiar un código de VBA en ThisWorkbook'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-8650527946204690528</id><published>2010-05-13T21:01:00.001-07:00</published><updated>2010-05-13T23:19:41.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><title type='text'>Copiar un código de VBA en una hoja</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ye90vaOziiw&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ye90vaOziiw&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-8650527946204690528?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/8650527946204690528/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-una-hoja.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8650527946204690528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/8650527946204690528'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-una-hoja.html' title='Copiar un código de VBA en una hoja'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-3697821052717470166</id><published>2010-05-13T21:00:00.001-07:00</published><updated>2010-05-13T23:20:11.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><title type='text'>Copiar un código de VBA en un módulo</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LcfkRsqyDz8&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LcfkRsqyDz8&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-3697821052717470166?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/3697821052717470166/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-un-modulo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3697821052717470166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/3697821052717470166'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/copiar-un-codigo-de-vba-en-un-modulo.html' title='Copiar un código de VBA en un módulo'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-4752250617290509410</id><published>2010-05-13T09:08:00.000-07:00</published><updated>2010-05-19T12:46:01.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Funciones definidas por el usuario'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Encontrar el tipo de validación de datos que tiene una celda</title><content type='html'>La siguiente función definida por el usuario permite encontrar el tipo de validación de datos que se ha asignado a una celda. Si la celda no tiene validación de datos, la función devolverá 0:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Function Tipo_val(ByVal celda As Excel.Range) As Byte
    
    On Error Resume Next
    Tipo_val = celda.Validation.Type
    On Error GoTo 0

End Function&lt;/pre&gt;&lt;br /&gt;
Los posibles resultados devueltos por la función son los que se presentan en la siguiente tabla:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Tipo_val(Celda)&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca;"&gt;          &lt;th&gt;Validación de datos&lt;/th&gt;          &lt;th&gt;Resultado&lt;/th&gt;         &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cualquier valor&lt;/td&gt;&lt;td align=right&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Número entero&lt;/td&gt;&lt;td align=right&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Decimal&lt;/td&gt;&lt;td align=right&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Lista&lt;/td&gt;&lt;td align=right&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Fecha&lt;/td&gt;&lt;td align=right&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hora&lt;/td&gt;&lt;td align=right&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Longitud de texto&lt;/td&gt;&lt;td align=right&gt;6&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Personalizada&lt;/td&gt;&lt;td align=right&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Si se quisiera saber si una celda tiene lista de validación de datos, se podría probar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub prueba()

    If Tipo_val(Range("a1")) = 3 Then
        MsgBox "La celda tiene lista de Validación de datos."
    Else
        MsgBox "La celda no tiene lista de Validación de datos."
    End If
    
End Sub&lt;/pre&gt;&lt;br /&gt;
De igual forma, se podría usar directamente en una celda:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="font-size: 120%;"&gt;=Tipo_Val(A1)&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;
devolviendo el número correspondiente a la validación de datos que tenga la celda A1 (cero si no tiene validación).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-4752250617290509410?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/4752250617290509410/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/tiene-validacion-de-datos-que-tiene-una.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4752250617290509410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/4752250617290509410'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/tiene-validacion-de-datos-que-tiene-una.html' title='Encontrar el tipo de validación de datos que tiene una celda'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-1209494752096737022</id><published>2010-05-11T21:48:00.000-07:00</published><updated>2010-05-19T10:24:57.422-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vídeos'/><category scheme='http://www.blogger.com/atom/ns#' term='Fórmulas y funciones'/><title type='text'>Construir un rango dinámico con DESREF</title><content type='html'>En Excel se pueden construir rangos dinámicos que se expanden o contraen según la cantidad de datos indicados. Existen diversas formas para construir rangos dinámicos, en el siguiente vídeo se presenta una de las más sencillas haciendo uso de la función DESREF:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lLE9IuZQJPc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lLE9IuZQJPc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
En la fórmula inicial:&lt;br /&gt;
&lt;blockquote class="X1"&gt;SUMA(&lt;b&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;A1:A10&lt;/span&gt;&lt;/b&gt;)&lt;/blockquote&gt;se usa el rango estático:&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;A1:A10&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;que no va a cambiar a menos que lo modifiquemos manualmente.&lt;br /&gt;
&lt;br /&gt;
Para crear el rango dinámico hemos hecho uso de la función Desref, cuya sintaxis es la siguiente:&lt;br /&gt;
&lt;blockquote class="X1"&gt;DESREF(&lt;b&gt;ref&lt;/b&gt;;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;filas&lt;/span&gt;&lt;/b&gt;;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;columnas&lt;/span&gt;&lt;/b&gt;;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;alto&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: magenta;"&gt;ancho&lt;/span&gt;)&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;b&gt;Ref&lt;/b&gt;&lt;br /&gt;
es la referencia a una celda o a un conjunto de celdas a partir de la(s) cual(es) nos desplazaremos (supongo que de ahí el nombre de la función DesRef: Desplazar referencia).&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Filas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
es el número de filas que nos desplazaremos, hacia arriba o hacia abajo, a partir de la referencia original (&lt;b&gt;Ref&lt;/b&gt;).&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Columnas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
es el número de columnas que nos desplazaremos, hacia la izquierda o hacia la derecha, a partir de la referencia original.&lt;/blockquote&gt;Estos dos primeros argumentos pueden ser tanto positivos como negativos. Si nuestra celda de referencia es la C5 y nos queremos desplazar a la celda B2, entonces podríamos usar algo así:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca;"&gt;          &lt;th&gt;Fórmula&lt;/th&gt;          &lt;th&gt;Descripción&lt;/th&gt;         &lt;/tr&gt;
&lt;tr&gt;         &lt;td&gt;=DESREF(C5;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;-3&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;-1&lt;/b&gt;&lt;/span&gt;)&lt;/td&gt;         &lt;td&gt;Muestra el valor en la celda B2&lt;/td&gt;        &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Los dos últimos argumentos (&amp;nbsp;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;Alto&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium;"&gt;&amp;nbsp;y&amp;nbsp;&lt;span class="Apple-style-span" style="color: magenta;"&gt;Ancho&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium;"&gt;) son opcionales y si se omiten devolverán el alto o el ancho del rango de referencia:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;blockquote class="X1"&gt;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;Alto&lt;/span&gt;&lt;br /&gt;
es el alto, en número de filas, que se desea que tenga la referencia devuelta.&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote class="X1"&gt;&lt;span class="Apple-style-span" style="color: magenta;"&gt;Ancho&lt;/span&gt;&lt;br /&gt;
es el ancho, en número de columnas, que se desea que tenga la referencia devuelta.&lt;br /&gt;
&lt;/blockquote&gt;&lt;div style="margin: 0px;"&gt;Tanto el alto como el ancho deben ser un números positivos.&lt;/div&gt;&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca;"&gt;          &lt;th&gt;Fórmula&lt;/th&gt;          &lt;th&gt;Descripción&lt;/th&gt;         &lt;/tr&gt;
&lt;tr&gt;         &lt;td&gt;=DESREF(&lt;b&gt;A1&lt;/b&gt;;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;10&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: magenta;"&gt;1&lt;/span&gt;)&lt;/td&gt;         &lt;td&gt;Devuelve los valores en el rango A1:A10&lt;/td&gt;        &lt;/tr&gt;
&lt;tr&gt;         &lt;td&gt;=SUMA(DESREF(&lt;b&gt;A1&lt;/b&gt;;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;10&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: magenta;"&gt;1&lt;/span&gt;))&lt;/td&gt;         &lt;td&gt;Suma los valores en el rango A1:A10&lt;/td&gt;        &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Finalmente, para crear el rango dinámico, lo único que necesitamos es ingresar en el &lt;span class="Apple-style-span" style="color: darkgreen;"&gt;Alto&lt;/span&gt; la cantidad de datos que queramos tomar, esto lo hacemos por medio de la función CONTARA que nos devuelve el número de celdas no vacías en el rango especificado.&lt;br /&gt;
&lt;br /&gt;
Así, si en la columna A tenemos datos desde la celda A1 hasta la celda A10, la fórmula =CONTARA(A:A) nos devolverá 10. Si tenemos datos desde A1 hasta A17, nos arrojará como resultado 17.&lt;br /&gt;
&lt;br /&gt;
De esta forma, podemos sustituir el &lt;span class="Apple-style-span" style="color: darkgreen;"&gt;Alto&lt;/span&gt; por la función &lt;span class="Apple-style-span" style="color: darkgreen;"&gt;CONTARA(A:A)&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;table class="X1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;table border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr style="background-color: #cacaca;"&gt;          &lt;th&gt;Fórmula&lt;/th&gt;          &lt;th&gt;Descripción&lt;/th&gt;         &lt;/tr&gt;
&lt;tr&gt;         &lt;td&gt;=SUMA(DESREF(&lt;b&gt;A1&lt;/b&gt;;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: darkgreen;"&gt;CONTARA(A:A)&lt;/span&gt;;&lt;span class="Apple-style-span" style="color: magenta;"&gt;1&lt;/span&gt;))&lt;/td&gt;         &lt;td&gt;Suma los valores en el rango A1:A10&lt;/td&gt;        &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Tenga en cuenta que para todas las fórmulas descritas en este artículo he usado el punto y coma ";" como separador de argumentos. Es posible que esto cambie de acuerdo con la configuración regional de su equipo: &lt;a href="http://excelpatas.blogspot.com/p/por-que-no-me-funciona-esta-formula.html"target="_blank"&gt;¿Por qué no me funciona esta fórmula?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Para más y mejor información, consulte la &lt;a href="http://office.microsoft.com/es-es/excel/HP100624153082.aspx" target="_blank"&gt;ayuda de Microsoft Excel sobre la función Desref&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-1209494752096737022?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/1209494752096737022/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/construir-un-rango-dinamico-con-desref.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1209494752096737022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/1209494752096737022'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/construir-un-rango-dinamico-con-desref.html' title='Construir un rango dinámico con DESREF'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-2510688903603393127</id><published>2010-05-10T09:20:00.001-07:00</published><updated>2010-06-12T14:08:30.744-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Resaltar la fila de la celda seleccionada en una hoja de Excel</title><content type='html'>La siguiente macro de evento resaltará la fila en la que se encuentre de la hoja en la que se copie el código. El resaltado se hace con una autoforma, teniendo la ventaja de no modificar el formato de la celda:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Private Sub Worksheet_SelectionChange(ByVal Target As Range)


    Dim Forma As Excel.Shape
    Dim L#, T#, W#, H#


    Const Columna_inicial   As Long = 1
    Const Columnas          As Long = 6
    Const Grosor_borde      As Byte = 1
    Const Color_borde       As Byte = 5 'Use la paleta de colores de ColorIndex


    With Me.Cells(Target.Row, Columna_inicial).Resize(, Columnas)

        L = .Left
        T = .Top
        W = .Width
        H = .Height

    End With


    With Me.Shapes

        
        On Error Resume Next

            .Item("Resaltado").Delete

        On Error GoTo 0

        
        With .AddShape(1, L, T, W, H)
        
            .Name = "Resaltado"
            .Line.Weight = Grosor_borde
            
            With .DrawingObject
            
                .Interior.ColorIndex = xlNone
                .Border.ColorIndex = Color_borde
                
            End With
            
        End With

        
    End With
    

End Sub&lt;/pre&gt;&lt;a href="http://excelpatas.blogspot.com/p/que-hago-con-este-codigo.html" target="_blank"&gt;¿Qué hago con este código?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Las constantes &lt;b&gt;Columna_inicial&lt;/b&gt;, &lt;b&gt;Columnas&lt;/b&gt;, &lt;b&gt;Grosor_borde&lt;/b&gt; y &lt;b&gt;Color_borde&lt;/b&gt; indican las características que tendrá el resaltado.&lt;br /&gt;
&lt;br /&gt;
El color del borde de la autorforma se genera con ColorIndex, para ver la paleta de color de color index vea este otro tema: &lt;a href="http://excelpatas.blogspot.com/2010/05/como-obtener-los-valores.html" target="_blank"&gt;¿Cómo obtener los valores correspondientes a ColorIndex?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-2510688903603393127?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/2510688903603393127/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/resaltar-la-fila-de-la-celda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2510688903603393127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/2510688903603393127'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/resaltar-la-fila-de-la-celda.html' title='Resaltar la fila de la celda seleccionada en una hoja de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7499375771998092683</id><published>2010-05-05T21:07:00.000-07:00</published><updated>2010-05-20T21:41:57.883-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Simular barra de progreso en la barra de estado de Excel</title><content type='html'>La siguiente subrutina simulará una barra de progreso en la barra de estado de Excel haciendo uso de caracteres Unicode:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;Sub barra_de_estado(ByVal Progreso As Byte, ByVal Largo As Byte)

    If Progreso &amp;lt; Largo Then

        Application.StatusBar = VBA.ChrW(9599) &amp;amp; _
                                VBA.String(Progreso, VBA.ChrW(9607)) &amp;amp; _
                                VBA.String(Largo - Progreso, VBA.ChrW(9620)) &amp;amp; _
                                VBA.ChrW(9599) &amp;amp; "  " &amp;amp; _
                                Progreso * (100 / Largo) &amp;amp; "% completado"
    Else

        Application.StatusBar = False

    End If

End Sub
&lt;/pre&gt;&lt;br /&gt;
Los argumentos &lt;span class="Apple-style-span" style="color: red;"&gt;progreso&lt;/span&gt; y &lt;span class="Apple-style-span" style="color: red;"&gt;largo&lt;/span&gt; que se pasan a la función indican, respectivamente, el avance de la subrutina y la longitud en caracteres de la barra de progreso que se mostrará.&lt;br /&gt;
&lt;br /&gt;
Si el largo es igual a 20, como en el ejemplo que pondré a continuación, entonces la barra de progreso hará avances de 5% (20 caracteres cada uno de 5% hasta completar el 100%).&lt;br /&gt;
&lt;br /&gt;
Como se ve, la macro hace uso de los caracteres Unicode, por medio de la función ChrW, para simular la barra de progreso. Si se quieren visualizar todos los caracteres Unicode disponibles se podría usar esta macro (y de paso probar la macro que simula la barra de progreso):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Caracteres_ChrW()

    Dim Progreso As Byte
    Dim x As Long

    Const Largo As Byte = 20

    With Sheets("Hoja1")

        For x = 1 To 65535

            .Cells(x, 1) = x
            .Cells(x, 2) = VBA.ChrW(x)

            Progreso = VBA.Int(x / 65535 * Largo)

            barra_de_estado Progreso, Largo

        Next x

    End With

End Sub&lt;/pre&gt;&lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Simularbarradeprogreso.xls?attredirects=0&amp;d=1" target="_blank"&gt;Simular barra de progreso.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7499375771998092683?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7499375771998092683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/simular-barra-de-progreso-en-la-barra.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7499375771998092683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7499375771998092683'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/simular-barra-de-progreso-en-la-barra.html' title='Simular barra de progreso en la barra de estado de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-5051911744457143305</id><published>2010-05-05T15:42:00.000-07:00</published><updated>2010-05-11T01:34:39.265-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tablas dinámicas'/><title type='text'>Vincular dos o más tablas dinámicas por Filtro de Informe</title><content type='html'>Las macros que se presentan a continuación sirven para vincular por Filtro de Informe a diferentes tablas dinámicas en un mismo libro. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Si tiene varias tablas dinámicas con un filtro en una misma hoja, entonces copie este código en la hoja en la que se encuentran las tablas dinámicas (cambie "&lt;span class="Apple-style-span" style="color: red;"&gt;MES DE PRODUCCION&lt;/span&gt;"&amp;nbsp;por el nombre de su Filtro):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim TablaDinamica As Excel.PivotTable

&amp;nbsp;&amp;nbsp; &amp;nbsp;Const Filtro As String = "&lt;span class="Apple-style-span" style="color: red;"&gt;MES DE PRODUCCION&lt;/span&gt;"

&amp;nbsp;&amp;nbsp; &amp;nbsp;On Error GoTo Salir
&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = False

&amp;nbsp;&amp;nbsp; &amp;nbsp;For Each TablaDinamica In ActiveSheet.PivotTables
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TablaDinamica.PivotFields(Filtro).CurrentPage = &amp;nbsp; Target.PivotFields(Filtro).CurrentPage.Name
&amp;nbsp;&amp;nbsp; &amp;nbsp;Next TablaDinamica

Salir:

&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = True

End Sub
&lt;/pre&gt;Si la tabla tiene más de un filtro de informe, basta con modificar ligeramente la macro para incorporar tantos filtros como se quiera (he resaltado en gris las líneas que he añadido suponiendo que se ha añadido un nuevo filtro de informe llamado "&lt;span class="Apple-style-span" style="color: red;"&gt;Cliente&lt;/span&gt;"):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim TablaDinamica As Excel.PivotTable

&amp;nbsp;&amp;nbsp; &amp;nbsp;Const Filtro As String = "&lt;span class="Apple-style-span" style="color: red;"&gt;MES DE PRODUCCION&lt;/span&gt;"
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Const Filtro2 As String = "&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Cliente&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;"&lt;/span&gt;

On Error GoTo Salir
&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = False

&amp;nbsp;&amp;nbsp; &amp;nbsp;For Each TablaDinamica In ActiveSheet.PivotTables
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TablaDinamica.PivotFields(Filtro).CurrentPage = Target.PivotFields(Filtro).CurrentPage.Name
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;TablaDinamica.PivotFields(Filtro2).CurrentPage = Target.PivotFields(Filtro2).CurrentPage.Name&lt;/span&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Next TablaDinamica

Salir:

&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = True

End Sub
&lt;/pre&gt;&lt;br /&gt;
Descargue este archivo para ver estas dos macros en funcionamiento: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Vinculartablasdin%C3%A1micas1.xls?attredirects=0&amp;amp;d=1"&gt;Ejemplo 1.xls&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Si se quiere vincular tablas dinámicas que se encuentran en distintas hojas, habrá que trabajar con el evento Worksheet_PivotTableUpdate de ThisWorkbook, por lo que la siguiente macro de evento se debe copiar en ThisWorkbook y no en una hoja, y vinculará las tablas dinámicas en las hojas llamdas "&lt;span class="Apple-style-span" style="color: red;"&gt;Principal&lt;/span&gt;" y "&lt;span class="Apple-style-span" style="color: red;"&gt;TablasDinámicas&lt;/span&gt;":&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)

&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim TablaDinamica As Excel.PivotTable
&amp;nbsp;&amp;nbsp; &amp;nbsp;Const Filtro1 As String = "MES DE PRODUCCION"
&amp;nbsp;&amp;nbsp; &amp;nbsp;Const Filtro2 As String = "Cliente"

&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = False

&amp;nbsp;&amp;nbsp; &amp;nbsp;On Error Resume Next

&amp;nbsp;&amp;nbsp; &amp;nbsp;For Each Sh In Sheets(Array("&lt;span class="Apple-style-span" style="color: red;"&gt;Principal&lt;/span&gt;", "&lt;span class="Apple-style-span" style="color: red;"&gt;TablasDinámicas&lt;/span&gt;"))
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each TablaDinamica In Sh.PivotTables
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TablaDinamica.PivotFields(Filtro1).CurrentPage = Target.PivotFields(Filtro1).CurrentPage.Name
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TablaDinamica.PivotFields(Filtro2).CurrentPage = Target.PivotFields(Filtro2).CurrentPage.Name
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next TablaDinamica
&amp;nbsp;&amp;nbsp; &amp;nbsp;Next Sh

&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.EnableEvents = True

End Sub
&lt;/pre&gt;Descargue este archivo para ver esta última macro en funcionamiento: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Vinculartablasdin%C3%A1micas2.xls?attredirects=0&amp;amp;d=1"&gt;Ejemplo 2.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-5051911744457143305?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/5051911744457143305/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/vincular-dos-o-mas-tablas-dinamicas-por.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5051911744457143305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/5051911744457143305'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/vincular-dos-o-mas-tablas-dinamicas-por.html' title='Vincular dos o más tablas dinámicas por Filtro de Informe'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4832124315378145262.post-7255049617669106439</id><published>2010-05-03T19:03:00.000-07:00</published><updated>2010-07-03T11:35:25.250-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macros y VBA'/><title type='text'>Reducir el tamaño de un archivo de Excel</title><content type='html'>Hay una causa en específico que puede afectar considerablemente el tamaño de un archivo: El rango de celdas que Excel guarda como usado en cada hoja.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Se puede encontrar fácilmente la última celda del rango usado presionando Ctrl+Fin en cualquier hoja. El problema es que en muchos casos la 'última celda' está mucho más allá del rango 'real' de celdas usadas. Esto por lo general se debe a aplicar formatos a celdas que luego no se van a usar, lo que hace que luego Excel guarde esas celdas como parte del rango usado y así crece 'misteriosamente' el tamaño del archivo.&lt;br /&gt;
&lt;br /&gt;
Una forma de solucionar el problema consiste en eliminar las celdas que están más allá del rango 'real' usado: &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;identificar si el rango usado que está guardando Excel sobrepasa el rango realmente usado de la hoja, presionando Ctrl+Fin;&lt;/li&gt;
&lt;li&gt;ir a la última fila con datos y eliminar las filas de ahí hacia abajo y luego ir a la última columna con datos y eliminar todas las columnas de ahí en adelante;&lt;/li&gt;
&lt;li&gt;finalmente, guardar el archivo así excel guarda un nuevo rango usado en el que están sólo las celdas con datos.&lt;/li&gt;
&lt;/ol&gt;La macro que sigue llevará a cabo dicho proceso:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Sub Limpiar_rangos()
    
    
    Dim hj As Excel.Worksheet
    Dim copia$, ffin&amp;amp;, cfin&amp;amp;, TI&amp;amp;, TF&amp;amp;
    
    
    copia = crear_copia(ActiveWorkbook)
    MsgBox "Se ha creado una copia: " &amp;amp; vbLf &amp;amp; copia, vbInformation
        
        
    With ActiveWorkbook
    
        TI = VBA.FileLen(.FullName)
    
        For Each hj In .Worksheets
        
            ffin = 1
            cfin = 1
        
            With hj
            
                On Error Resume Next
                ffin = .UsedRange.Find(what:="*", _
                                       LookIn:=xlFormulas, _
                                       SearchOrder:=xlByRows, _
                                       SearchDirection:=xlPrevious).Row
                cfin = .UsedRange.Find(what:="*", _
                                       LookIn:=xlFormulas, _
                                       SearchOrder:=xlByColumns, _
                                       SearchDirection:=xlPrevious).Column
                On Error GoTo 0
                
                If .ProtectContents Then
                    If MsgBox("La hoja " &amp;amp; .Name &amp;amp; " se encuentra protegida." &amp;amp; vbLf &amp;amp; vbLf &amp;amp; _
                              "No se podrán limpiar los rangos de esta hoja a menos que se desproteja." _
                              &amp;amp; vbLf &amp;amp; vbLf &amp;amp; "¿Desea desprotegerla antes de continuar?", vbYesNo, _
                              "¡Hoja protegida!") = vbYes Then
                        If Desproteger(hj) Then
                            Limpiar hj, ffin, cfin
                        Else
                            MsgBox "No se ha desprotegido la hoja.", vbCritical, "¡Clave incorrecta!"
                        End If
                    End If
                Else
                    Limpiar hj, ffin, cfin
                End If

            End With
            
        Next hj
        
        .Save
        
        TF = VBA.FileLen(.FullName)
        
    End With
    
        
    MsgBox "Tamaño original: " &amp;amp; VBA.Format(TI, "#,##0") &amp;amp; " bytes." &amp;amp; vbLf &amp;amp; vbLf &amp;amp; _
           "Tamaño final: " &amp;amp; VBA.Format(TF, "#,##0") &amp;amp; " bytes." &amp;amp; vbLf &amp;amp; vbLf &amp;amp; _
           "El archivo se redujo en: " &amp;amp; VBA.Format(TI - TF, "#,##0") &amp;amp; " bytes" &amp;amp; _
           " (" &amp;amp; VBA.FormatPercent(Abs(TI / TF - 1), 2) &amp;amp; ")."
           
    
End Sub
Private Function Desproteger(ByVal hj As Excel.Worksheet) As Boolean
    
    On Error Resume Next
    hj.Unprotect
    Desproteger = Not VBA.CBool(Err.Number)
    On Error GoTo 0
    
End Function
Private Sub Limpiar(ByVal hj As Excel.Worksheet, ByVal ffin As Long, ByVal cfin As Long)

    With hj
            
        With .Range(.Cells(ffin + 1, 1), .Cells(.Rows.Count, 1)).EntireRow
            If .MergeCells = False Then .Clear
        End With
        
        With .Range(.Cells(1, cfin + 1), .Cells(1, .Columns.Count)).EntireColumn
            If .MergeCells = False Then .Clear
        End With
        
    End With
    
End Sub
&lt;/pre&gt;Al inicio, la macro hace uso de la función &lt;a href="http://excelpatas.blogspot.com/2010/05/crear-automaticamente-copia-de-un-libro_14.html" target="_blank"&gt;crear_copia&lt;/a&gt;, que expuse en un tema anterior. Esto porque la macro limpiará rangos de las hojas, existiendo riesgo de pérdida de información valiosa... así, es mejor crear una copia antes de ejecutar la macro. Para poder usar esta macro y la función &lt;a href="http://excelpatas.blogspot.com/2010/05/crear-automaticamente-copia-de-un-libro.html" target="_blank"&gt;crear_copia&lt;/a&gt;, basta con copiarlas en un módulo y ejecutarlas.&lt;br /&gt;
&lt;br /&gt;
EDITADO (gracias César por tu sugerencia, acá subo el archivo):&lt;br /&gt;
&lt;br /&gt;
Acá puede descargar un archivo en el que he reproducido el problem mencionado. Para reproducirlo, he creado 5 hojas y he aplicado formatos al rango A1:Z10000 de las 5 hojas. Sin embargo, el archivo sólo tiene datos en A1:D10. El tamaño del archivo es descomunal para los pocos datos que se encuentran allí. Puede usted mismo contrastar el rango con datos versus el rango que Excel guarda como usado presionando Ctrl + Fin. Luego de ejecutar la macro verifique nuevamente el rango que ha guardado Excel como usado: &lt;a href="http://sites.google.com/site/excelpatas/archivador-2/Reducirtama%C3%B1oarchivo.xls?attredirects=0&amp;amp;d=1"&gt;Reducir tamaño archivo.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4832124315378145262-7255049617669106439?l=excelpatas.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelpatas.blogspot.com/feeds/7255049617669106439/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://excelpatas.blogspot.com/2010/05/reducir-el-tamano-de-un-archivo-de.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7255049617669106439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4832124315378145262/posts/default/7255049617669106439'/><link rel='alternate' type='text/html' href='http://excelpatas.blogspot.com/2010/05/reducir-el-tamano-de-un-archivo-de.html' title='Reducir el tamaño de un archivo de Excel'/><author><name>Mauricio Robayo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
