29
MANUAL BÁSICO DE VISUAL BASIC 1 INTRODUCCION (a propósito de Visual Basic) Visual Basic para aplicaciones es una combinación de un entorno de programación integrado denominado Editor de Visual Basic y del lenguaje de programación Visual Basic, permitiendo diseñar y desarrollar con facilidad programas en Visual Basic. El término “para aplicaciones” hace referencia al hecho de que el lenguaje de programación y las herramientas de desarrollo están integrados con las aplicaciones del Microsoft Office (en este caso, el Microsoft Excel), de forma que se puedan desarrollar nuevas funcionalidades y soluciones a medida, con el uso de estas aplicaciones. El Editor de Visual Basic contiene todas las herramientas de programación necesarias para escribir código en Visual Basic y crear soluciones personalizadas. Este Editor, es una ventana independiente de Microsoft Excel, pero tiene el mismo aspecto que cualquier otra ventana de una aplicación Microsoft Office, y funciona igual para todas estas aplicaciones. Cuando se cierre la aplicación, consecuentemente también se cerrará la ventana del Editor de Visual Basic asociada. 5 2 OBJETIVOS Lo que se pretende con este manual es presentar de una manera práctica, diferentes utilidades, funciones, sentencias…, en el Editor de Visual Basic, y que con posterioridad serán útiles para el desarrollo del ejercicio concreto de que consta la práctica. Así, tomando ejemplos sencillos, se irán mostrando sucesivamente las diferentes utilidades a realizar o utilizar. Como, cómo definir un botón de ejecución de programa, cómo dar valores a celdas de la página de Microsoft Excel (mediante un programa definido en el Editor de Visual Basic), cómo definir e introducir bucles y condiciones,… 3 DESARROLLO DE LOS EJEMPLOS 3.1 Creación de un “botón” que al apretarlo escriba HOLA. Vamos a crear un botón, que al hacer clic sobre él, muestre en la celda A1 la expresión “HOLA”. Para ello, en primer lugar, se instalará en el documento de Microsoft Excel, el Cuadro de

Manual Básico Vb

Embed Size (px)

DESCRIPTION

tutorial

Citation preview

MANUAL BSICO DE VISUAL BASIC 1 INTRODUCCION (a propsito de Visual Basi!Visual Basic para aplicaciones es una combinacin de un entorno de programacin integradodenominado Editor de Visual Basic y del lenguaje de programacin Visual Basic, permitiendodisear y desarrollar con facilidad programas en Visual Basic. El trmino para aplicaciones hacereferencia al hecho de que el lenguaje de programacin y las herramientas de desarrollo estnintegrados con las aplicaciones del Microsoft Office (en este caso, el Microsoft Excel), de formaque se puedan desarrollar nuevas funcionalidades y soluciones a medida, con el uso de estasaplicaciones.El Editor de Visual Basic contiene todas las herramientas de programacin necesarias paraescribir cdigo en Visual Basic y crear soluciones personalizadas.Este Editor, es una ventana independiente de Microsoft Excel, pero tiene el mismo aspecto quecualquier otra ventana de una aplicacin Microsoft Office, y funciona igual para todas estasaplicaciones. Cuando se cierre la aplicacin, consecuentemente tambin se cerrar la ventana delEditor de Visual Basic asociada.5" OB#ETIVOSLo que se pretende con este manual es presentar de una manera prctica, diferentes utilidades,funciones, sentencias., en el Editor de Visual Basic, y que con posterioridad sern tiles para eldesarrollo del ejercicio concreto de que consta la prctica.As, tomando ejemplos sencillos, se irn mostrando sucesivamente las diferentes utilidades arealizar o utilizar. Como, cmo definir un botn de ejecucin de programa, cmo dar valores aceldas de la pgina de Microsoft Excel (mediante un programa definido en el Editor de VisualBasic), cmo definir e introducir bucles y condiciones,.$ DESARROLLO DE LOS E#EM%LOS$&1 Creai' de u' ()ot'* +ue al apretarlo esri)a ,OLA&Vamos a crear un botn, que al hacer clic sobre l, muestre en la celda A1 la expresin HOLA.Para ello, en primer lugar, se instalar en el documento de Microsoft Excel, el Cuadro deControles (Men Ver -> Barra de Herramientas -> Cuadro de Controles). En l se tomar elicono representando un botn, desplegndose en la Hoja1, por ejemplo, del documento Excel.6Una vez hecho esto, se pulsar dos veces sobre dicho botn para accede as al Editor de VisualBasic, con el que se realizar el pequeo programa requerido, tal y como sigue:$&" Au-ulai' de (,OLA*.s e' la -is-a elda&Ahora vamos a cambiar el programa anterior, cambiando una de las lneas de programa, parahacer que cada vez que se hiciera un clic en el botn, se acumulara un nuevo HOLA (igual quepodra ser cualquier otro valor numrico o cadena de caracteres) al anterior. De esta forma, seidentificar el contenido de la primera celda como un contador, acumulndose, en cada clic sobreel botn, una nueva cadena de texto en dicha celda contador.7$&$ Au-ulai' de te/to e' 0arias dia1o'ales suesi0as&Ahora, continuando el ejemplo anterior, vamos a definir una lista en varias diagonales, en las quese mostrar el texto previamente definido (BENVNGUT). En la nueva versin del programaanterior, se podr observar cmo utilizar la funcin condicin (representada por la funcin if) yelbucle (mediante la aplicacin de la funcin for, entre otras opciones).As, para hacer que la palabra BENVNGUT aparezca colocada siguiendo varias diagonales unnmero determinado de veces. Se definen, inicialmente, dos variables contador como enteros(funcin Dim As Integer), y que representan adems los ndices de las celdas de la Hoja deClculo (filas y columnas). Se define el texto en la primera celda. Seguidamente, se define lacondicin de que la suma de los ndices de celda (variables contadores) sean nmeros pares, conla utilizacin de la funcin mod (funcin resto, dividiendo el nmero requerido por dos, si el resto es0, el nmero es par), as se tendran definidas las diferentes diagonales. Esta condicin estaracolocada dentro de un doble bucle for (bucle anidado), en el que el valor de cada nueva celda dela diagonal, tendr el mismo valor que la anterior.8$&2 %ro1ra-ai' de series de 3i)o'ai&Programacin de una serie numrica (en este caso la de Fibonacci), con el diagrama de barrascorrespondiente. En este caso, vamos a desarrollar un programa que cumplir las siguientescaractersticas:Utilizacin de una serie de Fibonacci de nmeros aleatorios.Se tomarn exclusivamente la cifra de unidades de los nmeros de la serie anterior.Se ordenarn estos valores del mayor al menor (para poder trabajar con ellos)Se mostrar cmo realizar el diagrama de barras correspondiente a la serie anterior (cada barracon el tamao y el color correspondiente al nmero de la serie)Y en l, se utilizarn adems las funciones y opciones del Editor de Visual Basic / MicrosoftOffice siguientes:Cambio de nombre de un botnUtilizacin y grabacin de macrosUtilizacin de la funcin Call para llamar a una funcin definida en otro lugar.Cambio de colorLa serie de Fibonacci cumple que cada elemento de la serie es el resultado de la suma de los dosprecedentes, es decir: an+2 = an+1 + anAs, se introducir la frmula anterior mediante la utilizacin de un bucle Do WhileLoo (una delas opciones posibles), previa definicin de los dos valores iniciales. De esta forma, se van a definirestos valores iniciales como aleatorios; para ello, se va a utilizar la funcin de generacin de9nmeros aleatorios rnd (tal y como se ve en el programa) para evitar nmeros excesivamentegrandes o en coma flotante, tomando la variable como int, para evitar la aparicin de decimales.Adems, se ve como se utiliza la funcin With, para definir la seleccin de color. Este cdigo sehatomado del de la macro grabada a partir del cambio de color de una celda cualquiera (mediantelautilizacin de la opcin del men Cam!io de color)Pero, qu es una macro?, y, cmo se graba una macro?En primer lugar, se debera considerar que una macro es un pequeo programa ejecutable desdela Hoja de Clculo, y que realiza funciones repetitivas o comunes en la normal ejecucin de laactividad con la herramienta de clculo. As, y en el caso particular de grabar una macro parapoder cambiar de color una serie de celdas de la Hoja de Clculo, se procede de la siguienteforma. En el men, se toma la opcin Herramientas, y en sta, "ra!ar macro. Acto seguido, serealiza la accin a grabar en la macro, en este caso, cambiar de color el color de una columna de10la hoja de clculo.En el paso anterior se vea, en el cdigo definido por la macro, la opcin #ange; en sta se defineel rango de aplicabilidad de la accin seleccionada, en este caso el cambio de color.As, y una vez se tiene este cdigo ya definido, se puede trabajar sobre l para conseguir que cadacelda de dicha columna tenga un color diferente al de los dems, pero elegido de forma aleatoria.De esta forma se hara:Se cambian los valores de color obtenidos de la macro, por valores aleatorios, mediante la funcinrandom $rnd%. Este cdigo podra copiarse en el cdigo de programa de un botn, para ver comose cambiara el color aleatoriamente, cada vez que se hiciera clic sobre el segundo botn.11Siguiendo el paso anterior, se ve claramente el efecto del cambio aleatorio de color al hacer clicsobre el botn. Pero, cmo le hemos cambiado el nombre al botn?Para ello, se selecciona el modo dise&o del cuadro de controles, una vez as, se hara un cliccon el botn derecho del ratn, sobre el botn al que se le quiere cambiar el nombre. Acto seguido,se selecciona la opcin roiedades.12Una vez mostradas las acciones anteriores, se va a pasar a definir el ejemplo concreto. As, ycomo ya habamos dicho, vamos a definir el cdigo de programa necesario para por un ladogenerar la serie de Fibonacci de trminos aleatorios, y por el otro, tomar de los valores de la serieanterior exclusivamente las cifras correspondientes a las unidades.Aqu pueden observarse dos bloques diferenciados de programa, cada uno para un botn diferente(que se pueden ver en la transparencia siguiente). En el primero se crea una serie de Fibonacci, taly como ya se ha explicado, y acto seguido, se reduce cada uno de los nmeros de dicha serie a sucifra de unidades. Esta sera el resto obtenido de dividir dicho nmero de la serie original, por 10.13Esto se consigue con la utilizacin de la funcin mod. Todo ello dentro de su correspondientebucle para ir tomando todos los valores de la serie.Se ve el resultado obtenido. Primero, haciendo clic en el primer botn, se obtendra la serie, yseguidamente, haciendo clic sobre el segundo botn, se obtiene la cifra correspondiente a la cifrade unidades de la serie de Fibonacci anterior.Ahora, se deber definir una funcin que tome una serie de nmeros y los ordene de mayor amenor. Esto se hara mediante la grabacin de una macro llamada ordenar, en la que se graba laaccin de ordenar (funcin perteneciente al men datos de la barra de men) de mayor a menorlos valores de la primera columna, se obtiene el cdigo de programa necesario para implementarun tercer botn, por ejemplo (cdigo que se ve abajo)14Serie numrica resultante de ordenar la serie de cifras unidad de la serie de Fibonacci (en latransparencia anterior), y obtenida al hacer el clic sobre el tercer botn.Este seria el ltimo del conjunto de programas individuales (definidos mediante botones), con elseconseguira el objetivo buscado.En la pgina siguiente se muestra el cdigo correspondiente al diagrama de barrascorrespondiente a los valores de la serie anterior.Este cdigo muestra, despus de un corto programa para borrar el diagrama que pueda existir conanterioridad (obtenido a partir del cdigo de la macro grabada durante el borrado de un diagramacon las dimensiones requeridas, dndole al color el valor sin relleno), como hacer el diagramadebarras.Primeramente, se define que el nmero de celdas a colorear (barras del diagrama), sea igual alnmero de la serie en cada fila. Despus, se define una condicin para evitar colorear una celda dela primera columna, cuando se tuviera un cero. Adems, se define que el color corresponda alnmero presente en cada celda, pero evitando el negro (correspondiente al 0), y el blanco(correspondiente al 1)15Tras lo definido anteriormente, y haciendo clic sobre el cuarto botn, se obtendra el diagrama deGantt correspondiente a la serie previamente calculada, cambiando cada vez que se ejecutara todoel proceso completo. Botn 1 -> Botn 2 -> Botn 3 -> Botn 416Una vez realizado lo anterior, vamos a mostrar como emplear la funcin de Visual Basic, Call. Conesta funcin lo que pretendemos, es poder hacer llamadas desde dentro de un programa a otroque puede ser utilizado varias veces, y de esta forma, evitaramos tener que definir el programacorrespondiente cada vez.En este caso, vemos como una vez definida la serie de Fibonacci (de la misma forma que ya sehavisto previamente en varias ocasiones, siguiendo el mismo ejemplo), se introducen tres llamadas aotras tantas funciones independientes previamente definidas (como se ha visto en lastransparencias precedentes), mediante la funcin call.17As, una vez calculada mediante el bucle Do While la serie de Fibonacci, se llamara inicialmente ala funcin #educci'. Esta, como ya se ha visto, tomara el resultado anterior, reducindolo a lacifra de unidades correspondiente a cada uno de los elementos de la serie anterior.Se vera, de la misma forma que se vea en un punto anterior, como con la utilizacin de la funcinresto mod, entre 10, conseguimos tomar o reducir la cifra correspondiente a las unidades de loselementos de la serie de Fibonacci previamente calculada.A continuacin, se llama a la funcin Ordrenar, que realizar la ordenacin de los elementos de laserie numrica previamente calculada, de mayor a menor (siendo este cdigo obtenido, como yase haba explicado, a partir de la grabacin de una macro utilizando la funcin ordenar del men).Tomando como rango de elementos a ordenar, la primera columna (A), desde la celda 1 a la 15,eneste caso.18La ltima llamada realizada desde la funcin principal, sera la realizada a la funcin encargadadedefinir el diagrama de barras, en tamao y en color, adems de definir otra subfuncin que seencargara de borrar el diagrama anterior, cada vez que se hiciera clic en el botn para obteneruna nueva serie y un nuevo diagrama de barras.Como ya se ha explicado antes, se definira una funcin encargada de tomar el valor de cada unode los elementos de la serie en la columna A, luego, y mientras sta fuera diferente de 0, seentrara en el bucle, en el se definira el tamao y el color de la barra en funcin del nmero de laserie en cada posicin.192 NUEVOS E#EM%LOS4 OBTENCI5N DE N6MEROS %RIMOSUna vez visto todo lo realizado previamente, se va a pasar a describir estos nuevos ejemplos. Enellos, vamos a mostrar cmo hacer dos programas, el primero para saber si un nmero es primo, yel segundo, para obtener listas de nmeros primos.Para esto, en el primer programa, mostraremos que funciones se deben utilizar para declararmens de trabajo, y cmo trabajar con ellas, adems de cmo llamar a otras funciones sin utilizarla funcin que se haba visto previamente para este propsito (funcin call). En el segundoprograma, veremos de que forma se podrn declarar listas de nmeros primos, en un nmeroindicado previamente por nosotros mismos.Vamos a ver ahora que es lo que deberemos hacer para poder declarar y utilizar mens de trabajo,aplicndolo de manera prctica para poder declarar si un nmero dado al programa es primo o no.Como se puede ver en la pantalla anterior del Editor de Visual Basic, el programa previamentedescrito se ha dividido en dos partes. En la parte que vemos aqu (declarada a partir del botn)mediante la funcin InutBox, se declarar un men que se ver en la pgina de la Hoja deClculo del Microsoft Excel, presentando el texto DME UN NUMERO, identificado con lavariable numero definida como string. Esta cadena (que recibe el nmero que se introduciradesde teclado) mediante la funcin Val, registrar el valor numrico deseado que se pasara a laotra funcin (la que calculara si dicho nmero es primo o no).Una vez hecho esto, dentro de una condicin if, y utilizando la funcin MsgBox (esta funcin, aligual que la previamente definida InutBox, tiene como misin el mostrar en pantalla un mensajeen forma de men de Windows, pero ahora presentando un resultado determinado y definidodesde programa) se mostrara un mensaje sobre la Hoja de Clculo, diciendo si el nmeropreviamente introducido es primo o no.20Tal como se ha visto previamente, tomando el valor de la variable (alor se llama a la funcinesrimo $x%, donde la variable x equivale al valor enviado (alor. As, definiendo esta funcin comoBoolean, la cual dara como resultado una respuesta verdadera o falsa (true o false), se entraraen un bucle Do While (que utiliza como condiciones que el nmero introducido es inicialmenteprimo, para entrar en el bucle, y que el ltimo nmero por el que se dividir el introducido, paracomprobar si es primo o no, deber ser menor o igual a la raz cuadrada del introducido). En estebucle, dentro se pondra una condicin if, en la que indica que para que un nmero no sea primo,el resto de dividirlo por otro menor que l debe ser cero.Como se puede comprobar, al trabajar con variables Booleanas, se devuelve o recibe un )rue o un*alse, que en funcin de la definicin de la condicin if del siguiente programa (el definido por elbotn), se dar como resultado lo correspondiente al si (if) o al sino (else).Ahora se ve como quedara en la pantalla de la hoja de Excel lo expuesto previamente. Se ve, enla pgina siguiente, como al hacer clic sobre el botn, aparecera el men pidiendo un nmero, yacto seguido se dira si ste es primo o no.21Ahora se van a definir los dos programas necesarios para obtener un nmero determinado denmeros primos, siguiendo el mismo esquema previamente definido. Primero se ve como se definecon la funcin InutBox, un nuevo men en el que se pide el nmero de nmeros primos deseado.Adems, se incluye una lnea de cdigo para poder borrar cada vez que se haga clic sobre el botn(para que salga un nuevo men) el listado previo de nmeros primos.22Esta llamada mediante la funcin Call, se hace a una macro grabada mientras se seleccionabatoda la columna A y se borraba su contenido, como se puede ver.Aqu se puede observar el segundo programa, llamado por el anterior, y pasndole el nmero denmeros primos a generar (tamao de la lista) empezando por el 2.Aqu se ve como una vez se recibe la informacin de la otra funcin, se definen dos contadorespara controlar los dos bucles. El primero controlara la acumulacin de nmeros primos hasta lacantidad indicada (x), y a continuacin, al igual que antes, definiendo la variable rimo comobooleana, se entra al segundo bucle (encargado del clculo de los primos) suponiendo que laprimera entrada es un nmero primo (2 es primo) y que adems el nmero por el que se dividacada nmero para comprobar que sea primo, deber ser inferior a la raz cuadrada de dichonmero.Finalmente, con una condicin, se iran acumulando en la columna los diferentes nmeros primosencontrados hasta llegar a la cantidad deseada.23Aqu se ver ahora el resultado deseado.247 CONCLUSIONESUna vez presentados y explicados los ejemplos anteriores, esperamos que sirvan de ayuda realala realizacin de los problemas concretos de los que consta esta prctica. Tambin, y porque no,esperamos que este pequeo manual pueda llegar a servir como herramienta de inicio de otrosposibles futuros trabajos encaminados en esta materia.Esperamos, de la misma forma, que la exposicin haya sido suficientemente sencilla y clarificadorade lo que inicialmente se pretenda y se presentaba como objetivos.258 ANE9O (Se'te'ias : ;u'io'es 0 And c > 0 ThenHoja1.Cells(i, 8) = aElsef b > 0 And c < 0 ThenHoja1.Cells(i, 8) = a + 360ElseHoja1.Cells(i, 8) = a + 180End fEnd f8&$ Bules4 3or&&& To &&& Ne/t D Do E 0 And c > 0 ThenHoja1.Cells(i, 8) = aElsef b > 0 And c < 0 ThenHoja1.Cells(i, 8) = a + 360ElseHoja1.Cells(i, 8) = a + 180End fEnd fi = i + 1LoopHay que darse cuenta, que se utiliza la condicin anidada f ... Then ... Else ... End f, porqueExcel, da valores de ngulo en el plano de las X positivas (1 y 4 cuadrantes), por lo que parapoder tener una visin clara de la posicin de cada punto en funcin de su ngulo (tenerlo marcadode 0 a 360), se debera sumar 180 a los valores de ngulo obtenidos de los puntos situados en el2 y 3 cuadrantes, y 360 a aquellos situados en el 4 cuadrante.8&7 Ca-)iar riterios de orde'ai'4Aqu se puede ver cmo se podran definir criterios de ordenacin (ascendente o descendente),enfuncin de la necesidad del programador, y respecto a una columna o rango predefinida.Application.AddCustomList ListArray:=Range("J2:J21")numlista = Application.CustomListCountSelection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _OrderCustom:=numlista + 1, MatchCase:=False, Orientation:=xlTopToBottom, _DataOption1:=xlSortNormalApplication.DeleteCustomList ListNum:=numlista308&8 Me'IsASe definen mens especficos tomndolos como variables definidas como barras de comandos decontrol, o de otros tipos, y dndoles a su vez los nombres correspondientes a estos mens detrabajo.Dim MenuAyuda As CommandBarControlDim MenuNuevo As CommandBarPopupDim Plan As CommandBarControlCall BorrarMenuSet MenuAyuda = CommandBars(1).FindControl(D:=30010)f MenuAyuda s Nothing ThenSet MenuNuevo = CommandBars(1).Controls.Add(Type:=msoControlPopup,Temporary:=True)ElseSet MenuNuevo = CommandBars(1).Controls.Add(Type:=msoControlPopup,Before:=MenuAyuda.ndex, Temporary:=True)End fMenuNuevo.Caption = "Plan de Recuento"Set Plan = MenuNuevo.Controls.Add(Type:=msoControlButton)Plan.Caption = "Plan de Recuento"Plan.OnAction = "CalculaPlan"8&J %ara Orde'arBsicamente, se busca lo mismo que cuando se hablaba del cambio de criterios de ordenacin.Range ("D18:F23").SelectSelection.Sort Key1:=Range("D19"), Order1:=xlAscending, Header:=xlYes, _OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _DataOption1:=xlSortNormal8&K Luitar el si1'o de los 'I-eros o'0ertidos e' stri'14Estas lneas de cdigo sirven para poder tomar nmeros positivos siempre, aunque se introdujerannegativos (por error o clculo), a travs de un men, clculo,. El resultado sera semejante a lautilizacin de la funcin del Editor de Visual Basic, A!s $numero% (que devuelve el valor absolutode todo nmero introducido entre parntesis.nombre = Str(i)nombre = Right(nombre, Len(nombre) - 1)8&M Cua'do +uere-os po'er re;ere'ias relati0as a 0aria)les e' la ;r-ula4Referencias que corresponderan con los valores de la celda correspondiente de la Hoja de Clculocon la que se est trabajando.DESREF (C11; 0; S (C6>$C$3;-$C$3;-C6); 1; 1)318&1N Te-poriCador4Funcin encargada de dar un intervalo de tiempo, previamente a la obtencin de un resultado, opor otra razn necesitada por el programador.Dim ppio As Singleppio = TimerDo While ppio + 10 > TimerLoop8&11 3u'io'es4Definicin de funciones (con la forma que se requiera, sea Integer para entero, o de cualquier otrotipo), dentro del programa, en el Editor de Visual Basic, con la intencin de tenerlas definidas aparte de la programacin del botn en la Hoja de Clculo, o para una rellamada a posteriori, porejemplo con la funcin Call.function fact(x) as integerend function8&1" Ooo- de la 0e'ta'a43oom, agrandar o empequeecer la presentacin del formulario preseleccionado, en la ventanaactiva de trabajo.ActiveWindow.Zoom = 258&1$ %ara a'elar el )ot'4Bastara con introducir la orden siguiente:End8&12 %roedi-ie'to +ue e-pieCa o' u' ;or-ulario4Sub Prevision_Userform()CommandButton1.Caption = "Previsin"End Sub8&17 Otro -odo de a-)iar el olor4Esta es una de las opciones vlidas para el cambio de color, en una celda, o en cualquier otroobjeto seleccionado. Hay que considerar, que en este caso se realizara mediante una graduacinde los tres colores bsicos disponibles (rojo, verde y azul), aunque tambin podra hacersemediante valores numricos globales, representando las mezclas correspondientes de estoscolores bsicos.Label10.BackColor = RGB (242, 148, 150)8&18 %ara a)rir u' ;or-ulario4Lnea de cdigo que mostrara / abrira un formulario, que en este caso ha sido llamado Prevision.frmPrevision.show328&1J %ara oultar u' ;or-ulario4frmPrevision.HideAmbas sentencias (la 7.16 y la 7.17), sencillas como se puede comprobar, se refieren a la aperturade formularios referentes a objetos de terminados. Tambin estaran aqu relacionados los4ser*orm.8&1K %roedi-ie'to +ue e-pieCa auto-Ptia-e'te4Este procedimiento, abrira.Sub auto_open ()8&1M Borrar Me'u4En este caso se borrara un men previamente creado (ver el punto previo 7.6, por ejemplo), eneste caso, el men Nuevo Anlisis.On Error Resume NextCommandBars (1).Controls ("Nuevo Anlisis").Delete8&"N Crear Ra'1o4Aqu se creara un rango, sin tener que seleccionarlo previamente en la pgina de trabajo de laHoja de Clculo, desde la celda B5.rango = Str (nuevoprod - 1)rango = "B5:D" + Right(rango, Len(rango) - 1)8&"1 Co-parar ;e LgMax Theni = i + LgMaxElse: i = FinLigne + LgMaxEnd fDo While Mid(TxCorte, i, 1) " "i = i - 1f i = 0 Thenf FinLigne = 0 Then i = p + LgMax: Exit Doi = FinLigne + LgMax: Exit DoEnd fLoopMid(TxCorte, i, 1) = vbCri = i + LgMaxp = i + 1LoopCorte = TxCorteEnd Function8&$J Co-odi'es de )Is+ueda4$xisten comodines en $xcel para reempla(ar los caracteres en una !squeda%El operador * puede reemplazar un grupo de caracteres, y el comodn ? uno solo.==> La utilizacin en la funcin bsqueda de * y de ? puede causar desrdenes importantes en losficheros. As, si se busca por ejemplo la palabra "completndola" y se quieren recuperar todas lasposibilidades de escritura con los acentos o no, se utilizaran los comodines * y ? de la siguienteforma "complet?ndola" o "complet*a"El mtodo siguiente reemplaza el contenido de todas las celdas seleccionadas por la palabra dereemplazamiento:- seleccionar una columna de textos- reemplazar todas las palabras "ejemplo" por "*" ===> OK- despus, reemplazar todos los "*" por la palabra "ejemplo" ===> borrando todas las celdasconteniendo el * y reemplazndolo por la palabra "ejemplo" solo == > DESASTRESe debe sealar que la forma ms rpida para vaciar una hoja es reemplazar * par "" (se puedeprobar aunque sin grabarlo)388&$K E/traer el di1o postal de u'a direi'4)ongamos por e*emplo que se dispone de las siguientes direcciones postales francesaspresentadas de la forma siguiente+SA ,-,- ./&0' 1A 2$334$,-)567 890'' A6:$3S,e qu# forma se podran extraer los ")%Mediante un pequeo clculo matricial. Atencin, las frmulas se deben presentar sin retorno a lalnea...{=1*STXT(A1;EQUV(0;(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1);0);NBCAR(A1)-SUMA((ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1)))}Y esta es la explicacin:Prembulo: Esta frmula es una frmula genrica para extraer un, y slo un, valor numricocontenido en una cadena de caracteres y no es especfica a la extraccin de un cdigo postal.Objetivo del juego: con la funcin STXT, extraer de una cadena a partir de una posicin P, unnmero N de caracteres : =STXT(A1;P;N)La funcin STXT reenviando texto, en = 1*STXT(A1;P;N) el 1*. sirve simplemente para transformarel resultado en numrico y podra ser remplazado (ms largo) por =CNUM(STXT(A1;P;N)Con respecto a la cuestin sobre el Cdigo Postal, la frmula podra resumirse en:= 1*STXT(A1;P;5)=1*STXT(A1;EQUV(0;(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1);0);5)Para terminar (?) con el CP se podra, para extraerlo de una cadena como la siguiente:12,Av zaza 75000 PARS ou 125 ter..etc.Hacer llevar la extraccin sobre una parte (derecha) de la cadena y no sobre la cadena enteraremplazando, en la frmula, A1 (cadena completa) por =DERECHA (A1; NBCAR (A1)-5)El -5 ha sido fijado arbitrariamente: se puede suponer, sin grandes riesgos, que todo aquelloconcerniente al nmero de la calle, est delante del 5 carcter. Lo que podra dar:=1*STXT(DERECHA(A1;NBCAR(A1)-5); EQUV(0;(ESERROR(STXT(DERECHA(A1;NBCAR(A1)-5); LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1);0);5)Volviendo a la frmula genrica tomando como ejemplo en A1:DUPONT Marcel 75000 PARS[A] ** Obtencin de P en la frmula =1*STXT(A1;P;N)P ha sido obtenido mediante:=EQUV (0;(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1);0)que reenva 15 (posicin de la 1 cifra (el 7))[A-1] ** zzz del EQUV :=EQUV (valor buscado ; matriz de bsqueda ; tipo de bsqueda. La matriz de bsqueda (2argumento) es obtenido par:(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1)que reenva una matriz de constantes :{1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;1;1;1;1;1;1}=EQUV(0;{1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;1;1;1;1;1;1};0)reenva entonces 15 ya que el 1 cero(valor buscado) en la matriz de constantes es en 15 posicin(bsqueda exacta por el 3 argumento = 0)[A-1-1] ** zzz del (ESERROR(STXT(...[A-1-1-1] ** zzz del LNEA(NDRECT("1:"&NBCAR(A1)))39Esto permite, en internet, de proporcionar una tabla de constantes representando los nmeros de 1a NBCAR(A1)Resultado :{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25}[A-1-1-2] ** zzz del STXT(A1;LNEA(NDRECT(.STXT(A1;{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25};1)El STXT reenva (en forma matricial) 1 carcter (3 argumento = 1) partiendo sucesivamente delaposicin 1, a la 2,. hasta la 25 de la cadena A1Resultado :{"D";"U";"P";"O";"N";"T";" ";"M";"a";"r";"c";"e";"l";" ";"7";"5";"0";"0";"0";" ";"P";"A";"R";"";"S"}Estamos as en:(ESERROR({"D";"U";"P";"O";"N";"T";" ";"M";"a";"r";"c";"e";"l";" ";"7";"5";"0";"0";"0";"";"P";"A";"R";"";"S"}*1)*1) [A-1-1-3] ** zzz de este resultado {"D";"U";"P";"O";"N";"T"; "";"M";"a";"r";"c";"e";"l";" ";"7";"5";"0";"0";"0";" ";"P";"A";"R";"";"S"}*1Multiplicando cada elemento de la matriz por 1, los caracteres no numricos va a reenviar un valorde error (#VALOR!) y se obtendra la matriz:{#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;7;5;0;0;0;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!}Si se comprueba cada elemento de la matriz con ESERROR:ESERROR({#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;7;5;0;0;0;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!;#VALOR!})se obtiene:{VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;FALSO;FALSO;FALSO;FALSO;FALSO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO;VERDADERO}Y si se multiplica por 1 este resultado, la matriz se transformar en matriz de 1 y 0 (recuerdaVERDADERO = 1 y FALSO = 0)As el resultado utilizado como 2 argumento del EQUV:{1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;1;1;1;1;1;1}[B] ** Obtencin de N en la frmula =1*STXT(A1;P;N)NBCAR(A1)+1-SUMA( (ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1))); 1)*1)*1))Ver el captulo precedente para la parte(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1)Se tiene entonces:N = NBCAR(A1)-SOMME({1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;1;1;1;1;1;1})Resultado: =25-20La suma equivale al nmero de caracteres no numricos y as, la diferencia entre el n total decaracteres de la cadena (NBCAR(A1)) y la suma, dado el n de caracteres a extraer (3 argumentode la funcin STXT)En el paso se comprende porque la frmula no es vlida si, en la cadena, hay varios "sectores"numricos !Bonus:Mientras que el valor numrico incluido en la cadena, pueda ser un valor decimalEj.: Zaza ha comido 24,56 croquetasSi hay coherencia entre el separador decimal del sistema y el presente en la cadena, es suficientecon aadir +1 al NBCAR presente en el 3 argumento de STXT:{=1*(STXT(A1;EQUV(0;(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1);0);NBCAR(A1)+1-SUMA((ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR(A1)));1)*1)*1))))}40Si el separador decimal del sistema es del presente en la cadena, utilizar SUBSTTUE y aadirtambin +1 al NBCAR presente en el 3 argumento de STXT:Para un separador decimal del sistema = el punto y coma en la cadena:{=1*(STXT(SUBSTTUE(A1;",";".");EQUV(0;(ESERROR(STXT(A1;LNEA(NDRECT("1:"&NBCAR (A1)));1)*1)*1);0); NBCAR (A1)+1-SUMA ((ESERROR (STXT (A1; LNEA (NDRECT("1:"&NBCAR(A1)));1)*1)*1))))}8&$M Ree-plaCar u' arPter e' u'a 0aria)le4"mo reempla(ar en una ;aria!le un punto < coma por una coma%)or e*emplo, si en A& ha&?>@?>0=< en el cdigo, Ai2aria!leBrangeC=A&=D.;alue, cmo reempla(arla en Ai2aria!le sin tocar la celdaA&%Se tiene que pasar por una macro:Sub reemplazo()Dim MiVariable As StringMiVariable = "fdfdfd;fdf;df"MiVariable = Replace(ZoneCach, ";", ",")MsgBox MiVariableEnd SubAtencin esto no funciona con Excel 97. En ese caso se debe utilizarMiVariable=Application.Substitute(MiVariable, ";", ",")8&2N Ree-plaCo o-ple?o o'ser0a'do los N4$n una columna en formato texto cuando se aplica la funcin reempla(ar el ;alor siguiente EE./por nada so!re un nmero del tipo EE./'''/@/F0@/ los ' desaparecen C /@/F0@/ D. "moe;itarlo%Por defecto... y cuando la bsqueda de "reemplazar del Excel sea demasiado inteligente ...Sub remplt()txtSup = nputBox("Que cadena de caracteres" _ & "deseas suprimir?")txtRemp = nputBox("Por cual desea reemplazarla?")Application.ScreenUpdating = FalseFor Each c n Selectionc.Value = Replace(c.Value, txtSup, txtRemp)Next cEnd SubLa funcin Replace no est disponible para la versin Excel 97. Hay que reemplazarla por lafuncin SubstituteSub remplt()txtSup = Application.nputBox("Que cadena de caracteres"_& "deseas suprimir?")txtRemp = Application.nputBox("Por cual desea reemplazarla?")Application.ScreenUpdating = FalseFor Each c n Selectionc.value=Application.Substitute(c.Value, txtSup, txtRemp)'c.Value = Replace(c.Value, txtSup, txtRemp) 'No disponible Excel 97Next c%nd Sub418&21 Espaios +ue 'o lo so'4Aparecen espacios extraos en ciertas celdas < se querra suprimirlas.Un espacio de este tipo en una celda por una barra espaciadora, da un chr(32). Puede venirprovocado al importar datos, que este espacio sea un chr (160).Se puede probar lo siguiente:dim MonRange as rangedim Mot as stringMot=chr(160)set MonRange=Range("A1:A50")MonRange.Replace What:=mot, Replacement:="", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=False8&2" Lista de las letras del al;a)eto4"mo conseguir una lista de letras del alfa!eto que se incremente automGticamente%Aadir esta lista como macro:Sub AnadirListaPers()Application.AddCustomList ListArray:=Array("A", "B", "C", "D", "E", "F", "G", "H", _"", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")MsgBox "La nueva lista es la nmero : " & Application.CustomListCountEnd SubAs se podr incrementar una serie manualmente en Excel, adems de lo demandado.Para poner al da la lista circulante:Private Sub UserForm_nitialize()Dim NuListe As ByteNuListe = 5For n = 1 To UBound(Application.GetCustomListContents(NuListe))ComboBox1.Addtem Application.GetCustomListContents(NuListe)(n)Next nEnd Sub8&2$ Supri-ir espaios4Aacro para suprimir los espacios que se encuentran delante de las cifras cortadas-pegadas a partirde una He!Sub menage()For Each cellule n ActiveSheet.UsedRangecellule.Value = LTrim(cellule.Value)NextEnd Sub428&22 Luitar la pri-era pala)ra de u'e ;rase4"mo suprimir la primera pala!ra de una frase% Cseparada del resto por un espacioDSupongamos que A1 contiene "Bon dia companys", entonces utilizaramos la frmula siguiente:=STXT(A1;BUSQUEDA(" ";A1;1)+1;NBCAR(A1))devolvera "companys".8&27 Co'0ersi' de 'I-eros e' letras4"mo con;ertir nmeros en letras% @&. en doscientos die( < ocho...Direcciones para tele cargar los macros:Versin auto extrable (lanza el fichero de ayuda al final de la extraccin):http://perso.wanadoo.fr/frederic.sigonneau/office/Nb2Words.exeVersin zipp:http://perso.wanadoo.fr/frederic.sigonneau/office/Nb2Words.zipCdigo fuente:http://perso.wanadoo.fr/frederic.sigonneau/office/SrcWrdXl.zip8&28 E/traer u'a ade'a de te/to e' -edio de otra4Ante textos del tipo+ !la!la!la > texto a extraer cualquiera I&@0Sa!iendo que los nicos puntos de referencia son los I < > Cnicos en el textoD < el nmero fi*o decaracteres despu#s del I.=STXT(A1;BUSCA(">";A1)+1;NBCAR(A1)-BUSCA(">";A1)-4)o sino, tambin podra funcionar:=SUSTTUYE(STXT(A1;ENCUENTRA(">";A1)+1;999);"