Excel VBA y macros: Una herramienta muy til para trabajar hojas de clculo (2) 23 de Septiembre de 2010 Comentarios
Esta es la segunda parte de los posts para ensear a usar macros de Excel. Si te perdiste la primera parte, aqu la puedes encontrar. En esta segunda leccin nos amiliari!aremos con el editor de cdigo " aprenderemos a traba#ar con $ariables " algunas estructuras de datos. %rata de ir despacio, un poco cada da, comprendiendo bien " luego prosiguiendo. &o $a"as con prisa porque $o" a presentar bastante in ormacin, " lo m's importante es que te amiliarices poco a poco. El editor de c!di"o de VBA El 'rea de traba#o del editor se di$ide en ( !onas) 1. *dulos 2. +ropiedades 3. Cdigo o orm (. +antalla de mensa#es de depuracin
#!dulos ,os mdulos son como una especie de pergamino largo donde escribes cdigo. Cada uno de los -pergaminos- de las .o#as de c'lculo abiertas se muestran en esta !ona. ,os mdulos pueden tener asociada una inter ace gr' ica /una $entana de 0indo1s2 asociada, o pueden no tenerla " e#ecutar instrucciones sin desplegar nada. 3a" 3 tipos de mdulos)
Forms) Cdigo que tiene una $entana de 0indo1s asociada. Modules) Cdigo sin inter ace gr' ica. Class modules) Cdigo que se usa para crear ob#etos. Es para programadores m's a$an!ados, no $amos a cubrir esta parte aqu.
$ropiedades Si seleccionas un mdulo o un elemento de la inter ace gr' ica de tu programa, $er's que se tiene asociada una lista de $alores asociados a caractersticas, llamadas propiedades, para cada uno. %!di"o o &orm El cdigo est' compuesto por instrucciones que tu le das a la m'quina. Esas instrucciones se e#ecutan, pero no necesariamente resultan $isibles al usuario durante la e#ecucin. En pocas palabras aqu es donde escribir's el cdigo. Slo aseg4rate de que est's ubicado en el mdulo apropiado. ,os orms /o ormularios2 son lo que tu llamaras una -$entana- que en realidad es una super icie que contiene controles, como por e#emplo un botn o una !ona para escribir texto, " que se muestra $isible en alg4n momento de la e#ecucin. $antalla de mensajes de depuraci!n Cuando est's .aciendo tu programa, puedes desplegar lo que quieras en esta regin, usando el comando 5E678.+9:&% seguido por lo que deseas que se despliegue. Es en realidad un 'rea para el programador, porque el usuario de la macro no $er' este texto a menos que entre al editor de macros durante una sesin. &ormalmente un programador la usa para desplegar " $eri icar los datos o resultados que produce un programa en alg4n momento de la e#ecucin. Editando &orms Cuando editas orms, $as a tener dos !onas de inter;s) 1. +aleta de controles 2. <orm
En la paleta de controles escoges un control al [Link] " $as al orm a colocar el control. ,os controles se colocan al dibu#ar un rect'ngulo encima del orm, como cuando dibu#as un rect'ngulo en *S+aint. Si .aces doble clic sobre un control que colocaste sobre el orm, pasar's a editar el cdigo para dic.o control. Estructura del c!di"o dentro de los m!dulos Cuando escribas cdigo dentro del mdulo incluir's procedimientos o subrutinas /Sub2 " unciones /<unction2. ,as subrutinas " unciones son ragmentos de cdigo que tienen un propsito espec ico " que se acti$an en determinadas circunstancias, de inidas por el que crea la macro. Cada subrutina o uncin tendr' un inicio " un inal claramente de inidos.
=ntes de las subrutinas " unciones se e ect4a la declaracin de $ariables " estructuras de datos que $as a usar " que ser'n utili!adas por $arias subrutinas " unciones del mdulo.
Entendiendo las 'ariables como medio para almacenar datos +uedes imaginar las $ariables como celdas de datos que existen en memoria pero que no puedes $er, " al igual que en matem'tica, a [Link] celdas se les asigna un nombre de una $ariable. +or e#emplo, en lugar de decir que la celda =2 contiene un n4mero 3, podramos decir que la $ariable > contiene un n4mero 3. ,a $ariable > es como una celda oculta que no $es " que contiene el n4mero. Esas $ariables necesitan ser creadas en la memoria, algo a lo que se le llama -dimensionar- o -declarar- una $ariable.
+ara declarar o crear una $ariable > debemos indicar el tipo de $ariable que queremos, dependiendo del tipo de dato que almacenaremos. En este caso crearemos una $ariable > del tipo Long /slo admite n4meros enteros2. El tipo indica el tipo de datos que $a almacenado en la $ariable.
Dim X As Long
=unque existen [Link] tipos de datos, slo $o" a enumerar los tipos de datos m's comunes que deberas usar)
String) 9epresenta $ariables que contienen texto /en realidad contienen un grupo de caracteres al anum;ricos " simblicos2. Long) =dminten $alores enteros solamente Double) =dmiten $alores con punto decimal, "a sea $alores mu" grandes o $alores con [Link] ci ras decimales. Date) <[Link]. Este tipo de dato lo anali!aremos m's adelante. Variant) Este no es un tipo de datos que $a"as a usar. Si se te ol$ida declarar una $ariable, no te dar' un error, sino que ?6 lo asignar' al tipo ?ariant " puede aceptar $alores de cualquier tipo, pero a un costo. +rocesar $ariables de tipo ?ariant .ace mu" lento lo que .agas. E$ita la presencia de $ariables ?ariant o $ariables no declaradas.
En las subrutina o precedimiento [Link] podemos usar esta $ariable > como la usaramos en matem'ticas. Cabe sealar que siempre es buena pr'ctica iniciali!ar la $ariable, darle un $alor inicial. :maginemos el siguiente cdigo dentro de un mdulo. Este cdigo desplegar' los $alores de las $ariables en la pantalla de depuracin, porque usa el comando [Link]. En este e#emplo > tendr' un $alor de 3 " la $ariable @ usar' el $alor de > al que le sumar' 2. Se parece muc.o a la manera de .acer rmulas en secundaria. = la i!quierda tienes la
$ariable que almacenar' el resultado " a la derec.a una expresin de la cual resultar' un $alor que se almacena en la $ariable.
Dim X As Long Dim Y As Long Sub Main() X = 3 Y = X + 2 [Link] "El En! Sub
alor !e X es "" X " " # el
alor !e Y es ""Y
Cabe indicar que si declaras las $ariables al inicio, antes de la primera subrutina o uncin, los $alores ser'n $isibles por todas las subrutinas " unciones del mdulo. Si colocas la declaracin dentro de la subrutina, slo ser' $isible dentro de la subrutina. Sub Main()
Dim X As Long Dim Y As Long X = 3 Y = X + 2 [Link] "El En! Sub
alor !e X es "" X " " # el
alor !e Y es ""Y
,os $ectores son como una coleccin de celdas que se llaman con un nombre de una $ariable, pero al contener $arios $alores deben ser direccionados por un subndice.
3e aqu un e#emplo que crea el $ector " lo llena con $alores, usando rmulas. El asterisco /A2 se usa para multiplicacin " el slas. /B2 se usa para di$isin.
Sub Main() Dim A($) As Long A(%) = &%% A(&) = A(%) ' 2 A(2) = A(%) + A(&) ' 2 A(3) = 3() A($) = *+% , 2 [Link] "El alor !e A(%) es "" A(%)
[Link] [Link] [Link] [Link] En! Sub
"El "El "El "El
alor alor alor alor
!e !e !e !e
A(&) A(2) A(3) A($)
es es es es
"" "" "" ""
A(&) A(2) A(3) A($)
Cabe notar que en el cdigo anterior el tamao del $ector es i#o. %u puedes crear $ectores de tamao $ariable. En el siguiente e#emplo se crea el $ector =, luego se le cambia el tamao para que albergue el elemento cero, " luego se le cambia el tamao para que albergue .asta el elemento (. Este proceso de crear $ectores sin un tamao, " luego cambiarles el tamao se conoce como -d"namic memor" allocation- /asignacin din'mica de memoria2. ,a palabra Preserve indica que no debe borrar los $alores "a existentes en el $ector. Si no le pones esa palabra, cambiar' el tamao " $aciar' el $ector.
Sub Main() Dim A() As Long $e!im A(%) A(%) = &%% $e!im Preser e A(') A(&) = A(%) ( 2 A(2) = A(%) + A(&) ( 2 A(3) = 3)* A(') = +,% - 2 [Link] "El alor !e [Link] "El alor !e [Link] "El alor !e [Link] "El alor !e [Link] "El alor !e En! Sub
A(%) A(&) A(2) A(3) A(')
es es es es es
"" "" "" "" ""
A(%) A(&) A(2) A(3) A(')
,as matrices de dos dimensiones son como tablas. En este caso tenemos una matri! en dos dimensiones, pero podramos tener una matri! de 3 dimensiones.
=si podemos crear una matri! de la siguiente orma)
Dim A(3.3) As Long
= una matri! tambi;n le podemos aplicar el d"namic memor" allocation, pero slo para la 4ltima dimensin. Si declaraste una matri! de 3 x C /3 ilas " 2 columnas2 slo podr's agregar columnas.
= la .ora de usar los $alores de la matri!, primero $a el $alor de la ila " luego el $alor de la columna. En este e#emplo la ila 2 " columna 1 tendr' un $alor de D.
/(2.&) = * /(3.&) = /(2.&) + 2
En los casos anteriores tenemos una $ariable que representa un grupo de datos llamado Array /=rreglo2. En los casos que $imos el tipo de dato que se usa es siempre el mismo para todos los elementos del arreglo. Sin embargo a $eces podramos tener estructuras de datos que no siempre contienen datos del mismo tipo. :magina que tenemos una tabla que contiene los siguientes datos de bolsa.
<ec.a " .ora +recio de apertura +recio de cierre +recio m'ximo +recio mnimo
En lugar de crear C $ectores, o crear 1 $ector tipo 5ate para la ec.a " una matri! de tipo 5ouble para los precios, podemos crear una estructura que combina ambos.
Escribimos el siguiente cdigo para declarar una estructura llamada %ipo9egistro que es en realidad un tipo personali!ado que combina $arios tipos. ,a estructura estar' &uera de las subrutinas " unciones, en la seccin de declaracin del mdulo respecti$o.
Pri ate 0#1e 0i1o$egistro 2e34a As Date A1ertura As Double 5ierre As Double Ma6imo As Double Minimo As Double En! 0#1e
@ luego creamos una $ariable que contendr' esa estructura. ,a $ariable puede estar dentro o uera de una subrutina o uncin.
Dim D(') As 0i1o$egistro
Cuando queramos usar un $alor de esa estructura, lo .aremos de la siguiente manera. En este e#emplo Stop es otra $ariable que debera ser declarada en alg4n lado para que no sea de tipo ?ariant. ,as $ariables no slo pueden estar compuestas por una sola letra, sino que puedes darle un nombre a la $ariable /sin usar espacios2 que signi ique algo.
D(%).A1ertura = &%% Sto1 = D(%).A1ertura
Como notar's, 5 es un $ector que en lugar de contener una ila de datos, contiene en realidad una ila de datos de un registro burs'til. 3asta [Link] .emos aprendido a na$egar en el editor, " .emos comprendido cmo crear espacios en memoria para extraer o almacenar datos, usando rmulas. Sin embargo las celdas de Excel tambi;n pueden usarse para almacenar $alores o para extraer $alores. En este e#emplo tomamos el $alor de la celda E3 / ila 3, columna C2 " sumamos 1 " almacenamos el resultado en >. =simismo la celda 61 / ila 1 " columna 22 almacenar' el resultado de multiplicar @ por C.
X = 5ells(3.)) + & 5ells(&.2) = Y ( )
Cabe aadir que aunque te pare!ca tentador usar celdas en lugar de $ariables, extraer o almacenar $alores en celdas es un proceso mu" lento, " por eso es me#or usar $ariables " minimi!ar el uso de celdas en rmulas dentro de tu cdigo. ,o me#or si $as a usar $alores de celdas es pasar el $alor de la celda a una $ariable " .acer operaciones con esa $ariable. (epitiendo instrucciones usando )*( + ,E-. E+odremos reali!ar c'lculos m's comple#os que in$olucren procesos que se repiten [Link] $ecesF Si. Seguramente recuerdas que en el cdigo anterior tenamos este cdigo)
[Link] [Link] [Link] [Link] [Link] "El "El "El "El "El alor alor alor alor alor !e !e !e !e !e A(%) A(&) A(2) A(3) A(') es es es es es "" "" "" "" "" A(%) A(&) A(2) A(3) A(')
EGu; pasara si el $ector que usamos tu$iese 10 mil elementos en lugar de C elementos /desde 0 .asta (2F E$identemente deberas declarar el arreglo para que tenga 10 mil elementos.
Dim A(&%%%%) As Long
Sera terriblemente cansado reali!ar el proceso de escribir 10 mil $eces lo mismo. ,o me#or sera reempla!arlo por cdigo que use <or B &ext)
2or i = % to &%%%% [Link] "El alor !e A("" i " ") es "" A(i) 7e6t i
En este caso la $ariable i /que deberas .aber declarado tambi;n2 sir$e de contador, " su $alor $ariar' desde 0 .asta 10000. El cdigo que se encuentra entre la lnea donde st' el comando <H9 " la lnea donde est' el &E>%, se repetir' " en cada iteracin la $ariable i se incrementar' de 1 en 1. Cabe notar que si el <H9 usa la $ariable -i-, tambi;n el &E>% debe re erirse a -i-. =dem's, si .aces el ciclo <H9 &E>% desde 0 .asta 10 mil " el $ector = tiene menos de 10 mil elementos, en alg4n momento lan!ar' un a$iso de error, porque la $ariable -i- apunta a un $alor del $ector que no existe. +rueba [Link] este cdigo en una macro .ec.a por t)
Sub Main() Dim 8ila as Long Dim 3olumna as Long 2or 3olumna = & to ' 2or 8ila = & to &% 5ells(8ila.3olumna) = 3olumna ( &% + 8ila 7e6t 8ila 7e6t 3olumna En! Sub
El resultado te parecer' mu" interesante. Como obser$as aqu tenemos dod ciclos <H9, uno dentro del otro, que es lo que se llama tener -ciclos anidados-. Cabe notar que el 4ltimo <H9 es el de la ila, " por ende el primer &E>% deber' ser para la ila. .omando decisiones con /) .0E, E12E ?amos a llenar las primeras 10 ilas de la primera columna en la .o#a de Excel con $alores num;ricos. Si el $alor de la primera columna es ma"or que C, entonces despliegue -S:- o de lo contrario despliegue -&H-.
Sub Main() Dim i As Long $an!omi9e 0imer :A3ti ar genera!or !e n;meros aleatorios 2or i = & to &% 5ells(i.&) = <nt($n! ( &%) :Agregar un alor aleatorio entero !e % a &% en las 3el!as !e la 1rimera 3olumna <8 5ells(i.&)=) 04en :<ni3ia toma !e !e3isi>n. Si se 3um1le la 3on!i3i>n !e ?ue el alor !e la 3el!a en la 1rimera 3olumna es ma#or ?ue ) enton3es... 5ells(i.2) = "S<" :...1oner S< en la 3olumna 2. Else :De otro mo!o. si no se 3um1le la 3on!i3i>n... 5ells(i.2) = "7@" :...1oner 7@ en la 3olumna 2. En! <8 :A?uA termina la !e3isi>n.
7e6t i En! Sub
Como puedes obser$ar, lo que .i!o el programa ue tomar una decisin. Rnd es un n4mero aleatorio /en ingl;s se dice -random-2 cu"o $alor oscila entre 0 " 1 pero nunca llega a ser 1. ,a uncin Int( ! lo que .ace es tomar el $alor x, para recortarle los decimales " obtener un n4mero entero. =l multiplicar un n4mero aleatorio entre 0 " 1 por 10, se obtiene un n4mero aleatorio entre 0 " 10. +rueba e#ecutar este cdigo $arias $eces. Ep3lo"o 3asta [Link] no .emos $isto un e#emplo completo, sino que .emos experimentado un poco con cdigo. =prender a programar al inicio resulta un poco di icil porque uno requiere aprender [Link] reglas, as que tmate tu tiempo para comprender cada e#emplo, lo que .ace el cdigo. @ si tienes preguntas las puedes postear aqu. Creo que "a estamos listos para un e#emplo un poco m's real para el siguiente post. *ientras llega, trata de amiliari!arte " experimentar. =qu se trata de .acer cosas a $er qu; pasa, amiliari!arse con una ambiente extrao. %oda$a no $amos en serio. Esto" consciente de que .e ido un poco r'pido " no .e cubierto todo lo que tiene que $er con <H9B&E>% o :<B%3E&BE,SE pero es que no .e querido saturar de in ormacin.
%omparte este art3culo
9ecomendado)
8uardar Etiquetas) excel I macroeconomia I ?6=
13 Comentarios Eplanas 23 de Septiembre de 2010 /10)((2 4 3ola Comstar, gracias " animo de nue$o con esta etiqueta. Espero poder aprender ?6= " macros, adem's de poder compartir estrategias " lle$arlas al campo de la programacin para reali!ar las pruebas .istoricas que se merecen. Entiendo que comprendiste el diseo de la estrategia que puse en el anterior
post. 8racias. 7n saludo, Enrique
J Contestar <einmann 23 de Septiembre de 2010 /13)1(2
9ecomendado)
%e recomiendo que estructures el cdigo. Empie!a por indentar los bloques.
J Contestar ?er mensa#e de Eplanas Comstar en respuesta a Eplanas 23 de Septiembre de 2010 /13)1D2
9ecomendado)
Creo .aber comprendido la idea, pero a4n me .ace alta con irmar si as ue. +rimero necesitaba escribir esto antes de escribir tu cdigo. Si tengo preguntas lo sabr's por esta $a.
9ecomendado)
Contestar ?er mensa#e de <einmann Comstar en respuesta a <einmann 23 de Septiembre de 2010 /13)1K2 6 %rat; de .acerlo, pero 3%*, me anula los espacios de indentacin. E=lguien sabe cmo .acer esto con tags de 3%*,F @o se de ?6, no tanto de 3%*,.
J Contestar >($13r 23 de Septiembre de 2010 /13)212
9ecomendado)
*u" buena idea la de este post, son unas .erramientas mu" potentes tanto para gestin de in ormacin, simulaciones, etc. slo aadir para los lectores
interesados en este tema que se miren la red de programadores de microso t, donde podr'n encontrar dudas sobre SG, ser$er " ?6, la 1eb) .ttp)[Link] [Link] [Link] +or cierto, aadir unos cuantos tipos m's de $ariable que me parecen mu" 4tiles) :nteger 6oolean S2
J Contestar ?er mensa#e de Comstar >($13r en respuesta a Comstar 23 de Septiembre de 2010 /13)232
9ecomendado)
+uedes concretar un poco m'sF porque si intentas cargar datos desde una 1eb, se puede .acer a tra$;s de macros, es que no se de donde $iene lo de el 3%*, >5, grax
J Contestar ?er mensa#e de >($13r Comstar en respuesta a >($13r 23 de Septiembre de 2010 /13)2L2
9ecomendado)
El problema de los boolean es que llegan .asta un $alor m'ximo de la mitad de DCC3C " cuando se tienen pro"ectos largos resulta terriblemente incmodo depurar cdigo con este tipo de $ariables, porque es mu" 'cil llegar a exceder ese $alor en la ma"ora de los casos. +or eso en lugar de -:nteger- "o pre iero -,ong-.
9ecomendado)
Contestar ?er mensa#e de Comstar >($13r en respuesta a Comstar 23 de Septiembre de 2010 /13)322 ,a $enta#a es que un :nteger ocupar' menos memoria, eso depende del tipo de
$ariable se debe usar en cada caso, lo primero es disear lo que deseas .acer " como .acerlo, por e#emplo si deseas .acer un bucle, la $ariable que usamos para determinar la iteracin en que nos encontramos en la ma"ora de los casos es m's que su iciente declararla como :nteger, sobre todo si /.ablando de macros2 deseas recorrer ilas o celdas para ir le"endoBescribiendo in ormacin. En general para aquellos usuarios que se meten en este mundillo, "o siempre recomiendo lo mismo, el primer paso para disear un buen programa es saber qu; es lo que quieres que .aga " luego saber como quieres que lo .aga, el resto es ponerse a -escribir- " si "a lle$as muc.o programas con ctrlMcJctrlM$ te acaba $aliendo #e#e#e
J Contestar ?er mensa#e de >($13r Comstar en respuesta a >($13r 23 de Septiembre de 2010 /1()C(2
9ecomendado)
Entiendo tu punto. Sin embargo mi experiencia me .a lle$ado a comprender que las $ariables :nteger son la excepcin " no la regla. ,as $ariables ,ong presentan la $enta#a de la escalabilidad. &o .a" como tener pro"ectos grandes slo para empe!ar a recibir que#as de $arios usuarios porque ocurren errores debido a que declaraste una $ariable como :nteger " no como ,ong " en el programa, debido a ra!ones de uso termina .abiendo m's elementos de los que pensaste que iban a usar, o $alores que no pensaste que uesen a surgir en el camino. 7na cosa es lo que tu crees que pasar', " otra es la realidad de las cosas. ; Ensear el uso de :nteger est' bien para pro"ectos de #uguete, pero esto" seguro de que los ranNianos en alg4n momento tendr'n que lle$ar a cabo pro"ectos de programacin de $erdad, " "o pre ieron que no se encuentren con esa molestia. =ctualmente sueles tener 1 86 de 9=* como mnimo m's la memoria $irtual de un s1ap ile. ,as $ariables :nteger ocupan 2 b"tes " un ,ong usa ( b"tes. %endras que tener $arios millones de datos para que represente un problema. Si tienes tantos datos lo me#or es no usar Excel, sino comprarse ?isual 6asic D Enterprise Edition que es el que unciona igual a Excel ?6= pero con las me#ores capacidades de bases de datos " otros. En cambio, el tiempo de depurar errores por declarar $ariables como :nteger, " cambiar todas las re erencias de con$ersin a entero /cambiar unciones c:nt/x2 por c,ng/x2 que con$ierten x al tipo ,ong2 en pro"ectos grandes es realmente engorroso. @a me .a ocurrido, " "a .e encontrado otros
programadores a los que les .a pasado lo mismo. =unque Excel ?6= no use demasiados datos, un programa realmente podra $ol$erse grande, como "a me .a ocurrido antes, al punto que .e tenido que recurrir al uso de ob#etos. =unque parece un poco ine iciente, en realidad se trata de un asunto de [Link] de tiempo de depuracin. Si .a" algo que .ace $er mal a un programador es un mensa#e de error. @ perseguir ese error en un pro"ecto grande " e$aluar todas las implicaciones " las inter aces entre ob#etos " llamados de unciones, puede resultar en un $erdadero dolor de cabe!a.
J Contestar ?er mensa#e de Comstar >($13r en respuesta a Comstar 23 de Septiembre de 2010 /1D)(32
9ecomendado)
+ues como .ablamos de experiencia te dir; que en la ma las $ariables :nteger tienen cierto sentido para determinados que no parecen tan descabellados, cmo te pona de e#emplo los contadores, tambi;n un e#emplo de esto son las $ariable que utili!amos para codi icar determinadas cualidades de nuestros programas, que a lo me#or con C o D $alores nos $ale para codi icar esto, "o pro"ectos de #uguete creo que no .ago, menos cuando cmo de esos -pro"ectos- de #uguete. Como bien dices si un pro"ecto es grande lo me#or es recurrir a ?6, si un pro"ecto grande lo quieres meter en excel pues ser' ine ica!, por pro"ecto grande entiendo uno que requiera m4ltiples conexiones a 56S bien con conexiones tipo =5H u otro tipo de conexiones, con $arias inter aces de usuario, ormularios, mdulos, de inicin de libreras, etc, por otra parte para un ranNiano que quiera .acer esto en su casa el ?6 D enterprise Edition no tiene sentido, cuando se puede ba#ar el ?6 Express 2010 de registro gratuito con unas pocas limitaciones que en la pr'ctica en un entorno dom;stico apenas se aprecian. Si lo que esperas es que un ranNiano cree todo un so t1are con $arios ormularios, mdulos " gestione conexiones a 56s, creo que tendr' los su icientes conocimientos como para prescindir del excel en este aspecto " por otro lado dudo que todo esto lo $a"a a usar slo para .acer una pequea simulacin de una estrategia o $olcado de datos de orma sencilla que parece ser que es lo que la ma"ora desea al acudir a estas .erramientas que estamos tratando aqui.
4 <
+or otro lado dir; que entiendo los usos del ,ong " no digo que sea pre erible este tipo de $ariables a los :nteger, simplemente digo que cada una tiene su uncin, [Link], que sean la excepcin las :nteger tampoco, " por otro lado si lo que deseas es codi icar grandes n4meros sin problemas de precisin puedes recurrir a los 5ouble, no $o" a .ablar "a de la gestin de memoria que eso dara para otro tanto, pero e ecti$amente .o" da problemas de memoria "a apenas encuentras, lo que no quiere decir que por ello se deba abusar de la capacidad de computacin, "o pre iero que un programa uncione con los mnimos recursos prescindibles, " por experiencia te digo tambi;n que la le" de +areto se cumple tambi;n en programacin /20O del tiempo diseando, K0O del tiempo depurando2, claro que un buen diseo del so t1are disminu"e el tiempo global dedicado al pro"ecto, tambi;n .a" que asumir que el proceso de depuracin es m's largo " engorroso que la propia programacin. lo me#or es construir los programas como os lego, por pie!as >5, esa creo "o que es la aut;ntica cla$e para [Link] tiempo de depuracin, cuanto me#or disees tu clases " ob#etos /casos de +HH2 o m's pequeas " b'sicas sean tus unciones /caso +E2 me#or resultar' el programa " menos errores se cometer'n /ob$iamente siempre .ar'n alta clase, rutinas, mdulos, unciones... que implementen las m's pequeas2 pero como te digo creo que esto se sale un poco del tema EnoF que son las macros de excel, aunque estara mu" bien tratar un poco la programacin incluido CP " en general ?isual Studio /<P, ?6, etc2, "a que cada $e! m's el so t1are inanciero que cono!co " mane#o tiende a construirse con estos lengua#es, incluido aplicaciones de so t1are libre +5) cada uno tiene su orma de programar, eso es indiscutible, slo pretenda completar un poquito la in ormacin dada, puesto que .ablabas de de inicin de $ariables " slo .e aportado los que a mi #uicio son dos tipos b'sicos de $ariable, con ello no pretenda o ender a nadie, " si as .a sido me disculpo. +5) por cierto el tema de los bits " cu'nta in ormacin se puede codi icar con un tipo u otro se puede $er aqui) :nteger) .ttp)[Link] [Link]"B0DbNbK12/?[Link] ,ong) .ttp)[Link] [Link]"B"CQCsc1C/?[Link] seg4n leo aqui en sistema de 32 bits el :nteger es m's e iciente, pero como digo cada programador es un mundo... s2
J Contestar ?er mensa#e de >($13r Comstar en respuesta a >($13r 23 de Septiembre de 2010 /1L)232
9ecomendado)
Creo que me .e expresado mal. =l .ablar de programas de #uguete me re iero a pro"ectos pequeos, donde la memoria no es un problema tampoco. &o quise decir que tu .icieras programas pequeos. Es entendible que tu busques la e iciencia, " eso es mu" loable. Es especialmente 4til en programas mu" pesados que consumen [Link] recursos de la m'quina. Sin embargo s queda el riesgo de tener problemas de depuracin al traba#ar $ariables :nteger. Si se tratara de [Link] recursos en contadores, se puede usar $ariables tipo 6"te. Sin embargo a $eces creo que irse al mnimo puede generar problemas uturos de escalabilidad, principalmente al usar $ariables que sir$en como punteros en ?6. El programador conoce los requerimientos actuales, pero no necesariamente los requerimientos uturos. 9ecordemos que por [Link] memoria en punteros es que HutlooN tiene un .orrible bug que .ace que los arc.i$os HS% tengan problemas despu;s de exceder cierto tamao " que exigen reparacin del arc.i$o de correos. +rincipalmente en punteros es donde pre iero ser un poco ine iciente para e$itar problemas similares. Cada uno tiene su propia manera de matar pulgas. ,a ma es una, la tu"a es otra, " me alegro de que sur#a el debate, porque as el lector podr' decidir por una opcin u otra.
4 4
9ecomendado)
Contestar ?er mensa#e de Comstar >($13r en respuesta a Comstar 23 de Septiembre de 2010 /1K)122 mmm, interesante el tema que comentas de traba#ar con punteros, corrgeme si me equi$oco pero para que el usuario que nos lea nos pueda entender /" as me aclaro "o de paso >52 cuando .aces 5im >/2 =s 5ouble por e#emplo > es el puntero pero a priori no conoces la cantidad de memoria que $as a utili!ar para codi icar un dato en >, es cierto que a $eces el programador no lo conoce pero "o siempre pre iero al menos establecer una cota, en la ma"ora /"o personalmente a4n no .e encontrado ning4n caso en que nos sea posible2 creo que puede .acerse, en ese caso tal como lo entiendo puedes recurrir a dos opciones, una asignar un tipo de dato lo su icientemente grande
4 2
para poder codi icar tus $alores o dos intentar moduli!ar el cdigo para que traba#e con datos m's pequeos, se me ocurre el caso de de inir un puntero que luego $as a tener que estructurar como un arra", en ese caso puedes a priori desconocer los elementos que ormar'n el arra", pero puede que sea con$eniente acotar las dimensiones del mismo " traba#ar de orma recursi$a con esa $ariable, en mi caso que me dedico a programar estrategias de an'lisis t;cnico para determinar el tactical allocation de una cartera /entre otras cosas >52 se me ocurre pensar en la codi icacin de una barra o con#unto de barras relati$as al precio de un sub"acente, creo que .ablando de an'lisis t;cnico es qui!'s en la e$aluacin del sub"acente donde se plantean el ma"or n4mero de problemas de memoria, pero puedes acotar las dimensiones de la $ariable con la que $as a traba#ar /se el nR de barras con el que quiero traba#ar, el nR de datos por barra, " el nR de b"tes por dato que $o" a necesitar para codi icarlo, por tanto cono!co la mnima precisin por exceso con el que puedo codi icarlo2. creo que as puedes me#orar la escalabilidad de un programa /se tratara un poco de tender a lo que pretende la programacin orientada a ob#etos HH+2, el problema es que esto no siempre sea posible claro #e#e, es mu" interesante este tema, "o personalmente /por costumbres mas2 no me gusta asignar m's espacio del estrictamente necesario a una $ariable, Etu qu; [Link] encontrado problemas a la .ora de acotar la memoria necesaria para codi icar una $ariableF me interesa si puedes dar alg4n e#emplo concreto porque as "o tambi;n me#oro mi orma de programar bas'ndome en la experiencia de otros programadores /" que me perdonen los economistas del oro por lle$ar estos oros a mi terreno #e#e2. 8racias S2 +5) l;ase arregloBmatri!B$ector en lugar de arra" >5 +52) por cierto esto del 3%*, que comentabas, Equ; esF
9ecomendado)
Contestar ?er mensa#e de >($13r Comstar en respuesta a >($13r 23 de Septiembre de 2010 /1Q)2(2 4 5 +uede decirse que cuando se escribe 5im >/2 se crea el puntero a la posicin inicial del arra", toda$a no tiene una dimensin espec ica. =l darle 9edim >/n2 lo que se .ace es asignar una cantidad de n elementos al arra". Sin embargo en ?6 no existe el concepto de puntero, slo el de $ariable. Si quieres usar punteros, usas $ariables donde almacenas el $alor para usar como subndice, pero no .aces re erencias a direcciones de memoria como en
CMM. Esto tiene $enta#as al simpli icar las cosas para no$atos, pero resulta algo impr'ctico cuando quieres simplemente almacenar in ormacin con punteros. Si est's acostumbrado a traba#ar con punteros encontrar's ?6 un poco rgido " qui!' .asta ine iciente, " el mane#o de ob#etos mu" burocr'tico. +ero para no$atos en programacin es m's que su iciente por su sencille!. +ara e ectos de aquellos que no conocen nada de CMM " nada de ?6, lo me#or es decir que 5im >/2 crea el arra" sin un tamao de inido, de#'ndolo listo para darle un tamao, " 9edim >/n2 le da un tamao n, con n elementos que est'n listos para usarse. En ?6 puedes .acer recursi$idad siempre " cuando no llenes el stacN. @o en lo personal pre iero no .acerlo. *[Link] consideran que ?6 no es un lengua#e mu" pro esional, sino uno para principiantes, pero "o no lo creo as. ?6 trae algunas caractersticas que son mu" ine icientes " lentas, pero si uno logra esqui$arlas puede .acer cdigo que unciona a una $elocidad decente. =lgunos e#emplos son las $ariables ?ariant, el usar re erencias a $alores de celdas " controles en lugar de meter los $alores en $ariables, usar el =+: de 0indo1s para saltarse algunas ine iciencias, uso del =+: de 5irect> en lugar de .erramientas nati$as de dibu#o, etc. ?6 es muc.o m's sencillo que CMM, pero tambi;n muc.o m's limitado. ?6 es como un coc.e autom'tico, mientras que CMM es como un coc.e con palanca de [Link] " pedal de embrague. Cada uno tiene sus $enta#as " des$enta#as.
9ecomendado)
Contestar
Sub Con irmar/2 5im 9esp =s 6"te 9esp T *sg6ox/-5eseas continuar con la e#ecin de la macroF-, U $bGuestion M $b@es&o, -E>CE,e:&<H-2 : 9esp T $b@es %.en *sg6ox -Se eligi continuar...-, $bExclamation, -E>CE,e:&<HV=qu se e#ecutara el cdigo Else
*sg6ox -Se eligi cancelar...-, $bCritical, -E>CE,e:&<HEnd : End Sub [Link]