<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>(code segment) &#187; excel</title>
	<atom:link href="http://oldblog.ideseg.com/category/office/excel/feed" rel="self" type="application/rss+xml" />
	<link>http://oldblog.ideseg.com</link>
	<description>se acabarón las espinacas</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:27:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Excel &#8211; CS-Solver de VBA a VSTO</title>
		<link>http://oldblog.ideseg.com/2006/excel-cs-solver-de-vba-a-vsto</link>
		<comments>http://oldblog.ideseg.com/2006/excel-cs-solver-de-vba-a-vsto#comments</comments>
		<pubDate>Sat, 01 Jul 2006 17:29:27 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[excel]]></category>
		<category><![CDATA[office]]></category>

		<guid isPermaLink="false">/post/Excel-CS-Solver-de-VBA-a-VSTO.aspx</guid>
		<description><![CDATA[Hace ya algún tiempo que escribí CS-Solver, estos días me he propuesto convertirlo de VBA a VSTO. CS-Solver es un add-in para Excel que escribí hace algún tiempo, ya que la calculadora que usaba tenía un sistema de resolver ecuaciones muy parecido (PowerOne finance) y sin embargo resolver ecuaciones con Excel era bastante más complicado. [...]]]></description>
			<content:encoded><![CDATA[<p><P>Hace ya algún tiempo que escribí <STRONG>CS-Solver</STRONG>, estos días me he propuesto convertirlo de VBA a VSTO. </P><br />
<P><STRONG>CS-Solver</STRONG> es un add-in para Excel que escribí hace algún tiempo, ya que la calculadora que usaba tenía un sistema de resolver ecuaciones muy parecido (<A href="http://www.infinitysw.com/products/poweronefinance.html"><STRONG>PowerOne finance</STRONG></A>) y sin embargo resolver ecuaciones con Excel era bastante más complicado.</P><br />
<P><STRONG>CS-Solver</STRONG> utiliza el método secante para encontrar las raíces de <STRONG>f(x)=0</STRONG> en un intervalo, este no es tan rápido como el de Newton, pero si más rápido que la bisección ya que acota el intervalo y usa la aproximación más reciente. </P><br />
<P>A diferencia del método de Newton, no necesitamos calcular la derivada de la función en cada iteración, y que es un proceso más tedioso y requiere cálculo adicional.</P><br />
<P>Veamos ahora como funciona <STRONG>CS-Solver</STRONG> con un pequeño ejemplo, resolviendo la siguiente ecuación <BR><STRONG>2^x + 5x = 2</STRONG></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css002.jpg" border=0></P><br />
<P>Primero crearemos una celda <STRONG>C2 </STRONG>a la que daremos un nombre en este caso <STRONG>X</STRONG>, esta es la incógnita, en otra celda teclearemos la función, igualando el resultado a <STRONG>0</STRONG>, quedando la ecuación <STRONG>2^x+5x-2=0</STRONG>, esta celda la introduciremos como texto.</P><br />
<P>Ahora desde el menú de <STRONG>CSSolver</STRONG>, seleccionamos resolver ecuación </P><br />
<P>En donde se nos pide que introduzcamos la celda que contiene la ecuación a resolver, una vez seleccionada la celda que contiene la ecuación C4 pulsamos sobre Aceptar </P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css004.jpg" border=0></P><br />
<P>El resultado aparece en la celda de nombre <STRONG>X </STRONG>que es la incógnita a resolver.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css006.jpg" border=0></P><br />
<P>Veamos ahora otras cosas que se puede hacer con <STRONG>CS-Solver</STRONG>. Para ello usaremos la formula del Interés compuesto y calcularemos el Valor Futuro de un Capital invertido al 5% de interés anual durante <STRONG>3 </STRONG>meses.<BR><STRONG></STRONG></P><br />
<P align=center><STRONG>Valor Final = Valor Actual * ( 1 + (Interés/12))^Meses</STRONG></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css008.jpg" border=0></P><br />
<P>Teclearemos la formula igualada a 0, <STRONG>0=(vactual*(1+interes))^meses)-vfinal</STRONG> para ello, nombraremos la celda <STRONG>C2</STRONG> como <STRONG>vfinal</STRONG>, <STRONG>C3</STRONG> como <STRONG>vactual</STRONG>, <STRONG>C4 </STRONG>como <STRONG>interes</STRONG> y <STRONG>C5</STRONG> como <STRONG>meses</STRONG></P><br />
<P>Si ejecutamos <STRONG>CS-Solver</STRONG> y seleccionamos <STRONG>B7</STRONG> como la formula a resolver obtendremos el <STRONG>Valor Actual</STRONG>, solucionando la ecuación.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css010.jpg" border=0></P><br />
<P>Bien, una vez obtenido el resultado deseamos vemos que <STRONG>1012,55</STRONG> no es lo esperado que necesitamos obtener al final de nuestra inversión un total de <STRONG>1125</STRONG>, así que queremos ver cuanto necesitamos ingresar ahora para poder retirar dentro de 3 meses <STRONG>1125</STRONG></P><br />
<P>Para ello, nos basta con eliminar el contenido de la celda <STRONG>C3</STRONG>, (<STRONG>vactual</STRONG>) e indicar en la celda <STRONG>C2 </STRONG>el importe que deseamos obtener. Nuestra hoja de excel quedaría así.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css012.jpg" border=0></P><br />
<P><BR>Bien, no tenemos que tocar nada más tan solo seleccionar <STRONG>CS-So</STRONG>lver e indicar la formula que ya habíamos escrito, <STRONG>B7</STRONG> </P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//css014.jpg" border=0></P><br />
<P><STRONG>CS-Solver</STRONG> comprueba cual es la incógnita de la ecuación, vactual en este caso y comprueba que no tiene valor, así que su objetivo es resolver dicha incógnita.</P><br />
<P><STRONG>CS-Solver</STRONG> incorpora también una nueva formula llamada <STRONG>CSSolver</STRONG> con la cual podemos tener en una celda el valor de la incógnita de la ecuación, de este modo se puede tener en una celda <STRONG>=CSSolver(“2*x*sin(x)-5”)</STRONG> para la ecuación <STRONG>2*x*sin(x)=5</STRONG> e incluso podemos vincular la formula con una celda <STRONG>=CSSolver(A5)</STRONG></P><br />
<P>Estoy pasando el código de VBA a VSTO así que en unos días espero tenerlo terminado. (<A href="http://www.ideseg.com/CategoryView,category,Excel.aspx"><STRONG>Excel</STRONG></A>)</P></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2006/excel-cs-solver-de-vba-a-vsto/feed</wfw:commentRss>
		<slash:comments>396</slash:comments>
		</item>
		<item>
		<title>Excel &#8211; Distribuciones, planificaciones, formulas matriciales</title>
		<link>http://oldblog.ideseg.com/2006/excel-distribuciones-planificaciones-formulas-matriciales</link>
		<comments>http://oldblog.ideseg.com/2006/excel-distribuciones-planificaciones-formulas-matriciales#comments</comments>
		<pubDate>Mon, 27 Mar 2006 22:21:15 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[excel]]></category>

		<guid isPermaLink="false">/post/Excel-Distribuciones-planificaciones-formulas-matriciales-.aspx</guid>
		<description><![CDATA[No se si lo he comentado alguna vez, pero en el trabajo suelo usar mucho Excel para hacer una gran variedad de cosas, en general mucho de lo que tiene que ver con el área económico financiera (lo terminamos haciendo en Excel). Muchas de nuestras hojas de cálculo, son planes financieros, estudios de viabilidad, análisis [...]]]></description>
			<content:encoded><![CDATA[<p><P>No se si lo he comentado alguna vez, pero en el trabajo suelo usar mucho Excel para hacer una gran variedad de cosas, en general mucho de lo que tiene que ver con el área económico financiera (lo terminamos haciendo en Excel). <BR><BR>Muchas de nuestras hojas de cálculo, son planes financieros, estudios de viabilidad, análisis etc. Básicamente estas hojas planifican cobros y pagos ó gastos e ingresos, la cuestión es la planificación, en Excel podemos planificar todo aquello que queramos, es sencillo podemos establecer una fila para cada previsión a realizar y en cada columna podemos poner un periodo (ene, feb, mar…), por último en cada celda (previsión / periodo) el importe de dicha previsión.<BR></P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//emat1.gif" border=0></P><br />
<P><BR></P><br />
<P>El problema se complica un poco cuando el importe de cada previsión no tiene un periodo fijo, sino que este debe establecerse en función de otra variable. Supongamos que tenemos que realizar una previsión entre dos periodos dados (Inicio y Final) y el importe debe ser proporcional al número de periodos.</P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//emat2.gif" border=0></P><br />
<P><BR><BR>Como es lógico las formulas se nos van complicando, más y más en función de las condiciones que necesitamos. Con lo que terminamos creando nuestras funciones en VBA para simplificar el proceso. </P><br />
<P><br />
<DIV class=csharpcode><PRE class=alt><SPAN class=kwrd>Function</SPAN> csPDistB(importe <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>, periodo <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>, inicio <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>, fin <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>)</PRE><PRE>&nbsp;</PRE><PRE class=alt>    <SPAN class=kwrd>If</SPAN> (periodo &gt;= inicio) <SPAN class=kwrd>And</SPAN> (periodo &lt;= fin) <SPAN class=kwrd>Then</SPAN></PRE><PRE>        csPDistB = importe / ((fin &#8211; inicio) + 1)</PRE><PRE class=alt>    <SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>If</SPAN></PRE><PRE>    </PRE><PRE class=alt><SPAN class=kwrd>End</SPAN> Function</PRE></DIV><br />
<P></p>
<p>Realizaría el mismo trabajo que las formulas vistas. Dándole una vuelta más podemos crear una función matricial para hacer la misma tarea y que automáticamente tome el periodo actual en función del rango en donde se encuentre.</p>
<p><DIV class=csharpcode><PRE class=alt><SPAN class=kwrd>Public</SPAN> <SPAN class=kwrd>Function</SPAN> csPDistB(importe <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN>, primero <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>, ultimo <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN>) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE>    <SPAN class=kwrd>Dim</SPAN> i <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>Dim</SPAN> nPeriodos <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE>    <SPAN class=kwrd>Dim</SPAN> valor <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Double</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>ReDim</SPAN> a(0 <SPAN class=kwrd>To</SPAN> Application.Caller.Rows.Count, 0 <SPAN class=kwrd>To</SPAN> Application.Caller.Columns.Count) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE>            </PRE><PRE class=alt>    <SPAN class=kwrd>On</SPAN> <SPAN class=kwrd>Error</SPAN> <SPAN class=kwrd>GoTo</SPAN> Handler</PRE><PRE>    </PRE><PRE class=alt>    nPeriodos = ultimo &#8211; primero</PRE><PRE>    valor = <SPAN class=kwrd>CDbl</SPAN>(importe / (nPeriodos + 1))</PRE><PRE class=alt>            </PRE><PRE>    <SPAN class=kwrd>For</SPAN> i = 0 <SPAN class=kwrd>To</SPAN> Application.Caller.Columns.Count</PRE><PRE class=alt>        <SPAN class=kwrd>If</SPAN> i + 1 &gt;= primero <SPAN class=kwrd>And</SPAN> i + 1 &lt;= ultimo <SPAN class=kwrd>Then</SPAN></PRE><PRE>           a(0, i) = valor</PRE><PRE class=alt>        <SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>If</SPAN></PRE><PRE>    <SPAN class=kwrd>Next</SPAN></PRE><PRE class=alt>        </PRE><PRE>    csPDistB = a</PRE><PRE class=alt>    <SPAN class=kwrd>Exit</SPAN> <SPAN class=kwrd>Function</SPAN></PRE><PRE>Handler:</PRE><PRE class=alt>    csPDistB = CVErr(2015)  <SPAN class=rem>&#8216;xlErrNum = 2036</SPAN></PRE><PRE><SPAN class=kwrd>End</SPAN> Function</PRE></DIV><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//emat3.gif" border=0></P><br />
<P>Por último con una pequeñas modificaciones sobre este código podemos crear funciones más complejas para nuestras planificaciones, por ejemplo distribuciones en función de una curva de porcentajes, 25%, 50% y 25% sería el 25% en el primer tercio, el 50% en el segundo tercio y el 25% en el tercer tercio del tiempo. </P><br />
<P><br />
<DIV class=csharpcode><PRE class=alt><SPAN class=kwrd>Public</SPAN> <SPAN class=kwrd>Function</SPAN> csPDistCP(importe <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN>, <SPAN class=kwrd>ParamArray</SPAN> porcentajes()) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE>    <SPAN class=kwrd>Dim</SPAN> i <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>Dim</SPAN> nParte <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE>    <SPAN class=kwrd>Dim</SPAN> p <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>ReDim</SPAN> a(Application.Caller.Columns.Count) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE>            </PRE><PRE class=alt>    <SPAN class=kwrd>On</SPAN> <SPAN class=kwrd>Error</SPAN> <SPAN class=kwrd>GoTo</SPAN> Handler</PRE><PRE>    </PRE><PRE class=alt>    nParte = (UBound(a) + 1) / (UBound(porcentajes) + 1)</PRE><PRE>    p = -1</PRE><PRE class=alt>    <SPAN class=kwrd>For</SPAN> i = 0 <SPAN class=kwrd>To</SPAN> UBound(a)</PRE><PRE>      <SPAN class=kwrd>If</SPAN> i <SPAN class=kwrd>Mod</SPAN> Int(nParte) = 0 <SPAN class=kwrd>Then</SPAN></PRE><PRE class=alt>         <SPAN class=kwrd>If</SPAN> p &lt; UBound(porcentajes) <SPAN class=kwrd>Then</SPAN></PRE><PRE>            p = p + 1</PRE><PRE class=alt>         <SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>If</SPAN></PRE><PRE>      <SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>If</SPAN></PRE><PRE class=alt>&nbsp;</PRE><PRE>      a(i) = <SPAN class=kwrd>CDbl</SPAN>((importe / nParte) * porcentajes(p))</PRE><PRE class=alt>    <SPAN class=kwrd>Next</SPAN></PRE><PRE>        </PRE><PRE class=alt>    csPDistCP = a</PRE><PRE>    <SPAN class=kwrd>Exit</SPAN> <SPAN class=kwrd>Function</SPAN></PRE><PRE class=alt>Handler:</PRE><PRE>    csPDistCP = CVErr(2015)  <SPAN class=rem>&#8216;xlErrNum = 2036</SPAN></PRE><PRE class=alt><SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>Function</SPAN></PRE></DIV><br />
<P>Un último ejemplo en donde realizamos previsiones los periodos indicados, el importe proporcional al número de periodos.</P><br />
<P><br />
<DIV class=csharpcode><PRE class=alt>&nbsp;</PRE><PRE><SPAN class=kwrd>Public</SPAN> <SPAN class=kwrd>Function</SPAN> csPDistP(importe <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN>, <SPAN class=kwrd>ParamArray</SPAN> periodos()) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>Dim</SPAN> i <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE>    <SPAN class=kwrd>Dim</SPAN> nPeriodos <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Integer</SPAN></PRE><PRE class=alt>    <SPAN class=kwrd>Dim</SPAN> valor <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Double</SPAN></PRE><PRE>    <SPAN class=kwrd>ReDim</SPAN> a(Application.Caller.Columns.Count) <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>Variant</SPAN></PRE><PRE class=alt>            </PRE><PRE>    <SPAN class=kwrd>On</SPAN> <SPAN class=kwrd>Error</SPAN> <SPAN class=kwrd>GoTo</SPAN> Handler</PRE><PRE class=alt>    </PRE><PRE>    nPeriodos = UBound(periodos)</PRE><PRE class=alt>    valor = <SPAN class=kwrd>CDbl</SPAN>(importe / (nPeriodos + 1))</PRE><PRE>            </PRE><PRE class=alt>    <SPAN class=kwrd>For</SPAN> i = 0 <SPAN class=kwrd>To</SPAN> nPeriodos</PRE><PRE>        a(periodos(i)) = valor</PRE><PRE class=alt>    <SPAN class=kwrd>Next</SPAN></PRE><PRE>        </PRE><PRE class=alt>    csPDistP = a</PRE><PRE>    <SPAN class=kwrd>Exit</SPAN> <SPAN class=kwrd>Function</SPAN></PRE><PRE class=alt>Handler:</PRE><PRE>    csPDistP = CVErr(2015)  <SPAN class=rem>&#8216;xlErrNum = 2036</SPAN></PRE><PRE class=alt><SPAN class=kwrd>End</SPAN> Function</PRE></DIV><BR>&nbsp;<br />
<P></P></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2006/excel-distribuciones-planificaciones-formulas-matriciales/feed</wfw:commentRss>
		<slash:comments>2170</slash:comments>
		</item>
		<item>
		<title>Excel &#8211; Generando MDX</title>
		<link>http://oldblog.ideseg.com/2006/excel-generando-mdx</link>
		<comments>http://oldblog.ideseg.com/2006/excel-generando-mdx#comments</comments>
		<pubDate>Mon, 20 Feb 2006 19:05:55 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[excel]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Excel-Generando-MDX.aspx</guid>
		<description><![CDATA[Continuando con el trabajo que estaba realizando para mostrar información del Analisys Services en SharePoint, he realizado un pequeño programa en Excel para exportar las sentencias MDX (Nota: todavía no he visto el editor del SQL2005 y puede que este sea una maravilla, el del SQL2000 sin comentarios), con lo cual puedo usar Excel con [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el trabajo <A href="http://www.ideseg.com/SharePointUsandoXMLAMiBIWebPart.aspx">que estaba realizando</A> para mostrar información del Analisys Services en SharePoint, he realizado un pequeño programa en Excel para exportar las sentencias MDX (Nota: todavía no he visto el editor del SQL2005 y puede que este sea una maravilla, el del SQL2000 sin comentarios), con lo cual puedo usar Excel con una tabla dinámica para diseñar el informe y exportar este para usarlo con el webpart de OLAP que estaba realizando. Usando el contenido del un .dwp podríamos generar un webpart completo para importar en SharePoint.<br />
<P>Este ejemplo generará un archivo XML con la definición del informe con esta sintaxis.</P><br />
<P><PRE class=csharpcode><SPAN class=kwrd>&lt;?</SPAN><SPAN class=html>xml</SPAN> <SPAN class=attr>version</SPAN><SPAN class=kwrd>=&#8221;1.0&#8243;</SPAN> <SPAN class=attr>encoding</SPAN><SPAN class=kwrd>=&#8221;utf-8&#8243;</SPAN>?<SPAN class=kwrd>&gt;</SPAN><br />
<SPAN class=kwrd>&lt;</SPAN><SPAN class=html>informe</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
  <SPAN class=kwrd>&lt;</SPAN><SPAN class=html>nombre</SPAN><SPAN class=kwrd>&gt;</SPAN>Informe de Prueba<SPAN class=kwrd>&lt;/</SPAN><SPAN class=html>nombre</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
  <SPAN class=kwrd>&lt;</SPAN><SPAN class=html>descripcion</SPAN><SPAN class=kwrd>&gt;</SPAN>Informe de ventas de la base de datos FoodMart 2000<SPAN class=kwrd>&lt;/</SPAN><SPAN class=html>descripcion</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
  <SPAN class=kwrd>&lt;</SPAN><SPAN class=html>conexion</SPAN><SPAN class=kwrd>&gt;<br />
   </SPAN>OLEDB;Provider=MSOLAP.2;Persist Security Info=True;Data Source=srvdatos;Initial Catalog=FoodMart 2000;<br />
   Client Cache Size=25;Auto Synch Period=10000<SPAN class=kwrd><br />
  &lt;/</SPAN><SPAN class=html>conexion</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
  <SPAN class=kwrd>&lt;</SPAN><SPAN class=html>mdx</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
    <SPAN class=kwrd>&lt;!</SPAN>[CDATA[<br />
    SELECT NON EMPTY HIERARCHIZE({DrillDownLevel({[Product].[All Products]})})<br />
    DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON COLUMNS ,<br />
              NON EMPTY HIERARCHIZE({DrillDownMember(<br />
              {{DrillDownMember({DrillDownLevel({[Customers].[All Customers]})},<br />
              {[Customers].[All Customers].[USA]})}}, {[Customers].[All Customers].[USA].[CA]})})<br />
              DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON ROWS<br />
              FROM [Warehouse and Sales] WHERE ([Measures].[Sales Count])<br />
   ]]<SPAN class=kwrd>&gt;</SPAN><br />
   <SPAN class=kwrd>&lt;/</SPAN><SPAN class=html>mdx</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
<SPAN class=kwrd>&lt;/</SPAN><SPAN class=html>informe</SPAN><SPAN class=kwrd>&gt;</SPAN><br />
</PRE><br />
<P></P><br />
<P>Pasos para hacer nuestro diseñador de informes. </P><br />
<P align=center><IMG src="http://oldblog.ideseg.com/content//excel_tabla_dinamica.gif" border=0></P><br />
<P>1.- Abrir excel <BR>2.- Crear un informe de tabla dinámica usando el asistente de excel <BR>3.- Configurar el informe a nuestro gusto<BR>3.- Llamar a la macro de exportar informe (yo le he hecho un bonito formulario &#8230;) </P><br />
<P><PRE class=csharpcode><SPAN class=kwrd>Sub</SPAN> ExportaXML(sNombre <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>String</SPAN>, sDesc <SPAN class=kwrd>As</SPAN> <SPAN class=kwrd>String</SPAN>)<br />
    <SPAN class=kwrd>Dim</SPAN> xmlDoc <SPAN class=kwrd>As</SPAN> DOMDocument<br />
    <SPAN class=kwrd>Dim</SPAN> xmlNode <SPAN class=kwrd>As</SPAN> IXMLDOMNode<br />
    <SPAN class=kwrd>Dim</SPAN> xmlAttribute <SPAN class=kwrd>As</SPAN> IXMLDOMAttribute<br />
    <SPAN class=kwrd>Dim</SPAN> xmlInforme <SPAN class=kwrd>As</SPAN> IXMLDOMNode<br />
    <SPAN class=kwrd>Dim</SPAN> xmlPi <SPAN class=kwrd>As</SPAN> IXMLDOMProcessingInstruction<br />
    <SPAN class=kwrd>Set</SPAN> xmlDoc = <SPAN class=kwrd>New</SPAN> DOMDocument<br />
    <SPAN class=kwrd>Dim</SPAN> xmlText <SPAN class=kwrd>As</SPAN> IXMLDOMText<br />
    <SPAN class=kwrd>Dim</SPAN> sArchivo</p>
<p>    sArchivo = Application.GetSaveAsFilename(<SPAN class=str>&#8220;&#8221;</SPAN>, <SPAN class=str>&#8220;Archivo MDX,(*.xml)&#8221;</SPAN>, , <SPAN class=str>&#8220;Archivo MDX en XML&#8221;</SPAN>)<br />
    <SPAN class=kwrd>If</SPAN> sArchivo &lt;&gt; <SPAN class=kwrd>False</SPAN> <SPAN class=kwrd>Then</SPAN></p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlPi = xmlDoc.createProcessingInstruction(<SPAN class=str>&#8220;xml&#8221;</SPAN>, <SPAN class=str>&#8220;version=&#8221;</SPAN><SPAN class=str>&#8220;1.0&#8243;</SPAN><SPAN class=str>&#8220;&#8221;</SPAN>)<br />
        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.appendChild(xmlPi)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlInforme = xmlDoc.createElement(<SPAN class=str>&#8220;informe&#8221;</SPAN>)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.appendChild(xmlInforme)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.createElement(<SPAN class=str>&#8220;nombre&#8221;</SPAN>)<br />
        <SPAN class=kwrd>Set</SPAN> xmlText = xmlNode.appendChild(xmlDoc.createTextNode(sNombre))<br />
        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlInforme.appendChild(xmlNode)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.createElement(<SPAN class=str>&#8220;descripcion&#8221;</SPAN>)<br />
        <SPAN class=kwrd>Set</SPAN> xmlText = xmlNode.appendChild(xmlDoc.createTextNode(sDesc))<br />
        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlInforme.appendChild(xmlNode)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.createElement(<SPAN class=str>&#8220;conexion&#8221;</SPAN>)<br />
        <SPAN class=kwrd>Set</SPAN> xmlText = xmlNode.appendChild(xmlDoc.createTextNode(ActiveSheet.PivotTables(1).PivotCache.Connection))<br />
        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlInforme.appendChild(xmlNode)</p>
<p>        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlDoc.createElement(<SPAN class=str>&#8220;mdx&#8221;</SPAN>)<br />
        <SPAN class=kwrd>Set</SPAN> xmlText = xmlNode.appendChild(xmlDoc.createTextNode(ActiveSheet.PivotTables(1).MDX))<br />
        <SPAN class=kwrd>Set</SPAN> xmlNode = xmlInforme.appendChild(xmlNode)</p>
<p>        xmlDoc.Save (sArchivo)<br />
    <SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>If</SPAN></p>
<p><SPAN class=kwrd>End</SPAN> <SPAN class=kwrd>Sub</SPAN><br />
</PRE><br />
<CENTER><IMG src="http://oldblog.ideseg.com/content//excel_csegOLAP.gif" border=0></CENTER></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2006/excel-generando-mdx/feed</wfw:commentRss>
		<slash:comments>3253</slash:comments>
		</item>
	</channel>
</rss>

