Programación con Visual Basic para Aplicaciones en Excel    •    Introducción    •    Artículos    •    Macros    •    Fun...
sabes estas nos devuelven valores, esto no lo pierdas de vista.       Escribiendo mi primer función en Excel    •   ¿Como ...
una macro,función, o lo que sea, me copie solo las celdas que contengan texto del rango de        celdas A1:A20 y me coloq...
10. Detenemos la grabaciónSi seguimos estos pasos al pie de la letra, la macro grabada tiene que quedar así...Sub Macro1()...
Ejecuta cada una de estas macros y nota las diferencias, dale variantes, por ejemplo, agrega mas datos pordebajo de la cel...
•      Copiamos el contenido del portapapeles en la hoja activa    •      ActiveSheet.Paste    •   End Sub    •   Siguient...
ActiveCell.FormulaR1C1 = "Hola"   Range("A2").SelectEnd Suben algunas de mis páginas, en algunas otras páginas o en algún ...
•   Vuelve a ejecutar la macro, de las dos formas que hemos visto y felizmente, nos muestra nuestro    mensaje.•   Conclus...
•    MsgBox "Esta macro es PUBLICA y esta en un otro Módulo"•   End Sub•   Ahora, trata de llamar a la macro Pruebas1 que ...
•   Concluyendo: las macros pueden ser Publicas (Public) o Privadas (Private), es igual poner el Public o    no, pero no e...
o   Como bien sabes, el Asistente te presenta una ventanita con el nombre de la función y un    cuadro de texto solicitánd...
o   Ahora, cambiaremos la palabra Public de nuestra función por la palabra Private, o bien,    puedes copiar la función y ...
o   Efectivamente, la función no aparece, de hecho, la categoría que usamos Definidas por el                usuario, ya no...
•   Entra al EditorVBA•   Inserta un nuevo módulo y asegúrate que este en vacío, si tiene las palabras que estamos estudia...
ahora quise mostrarte el sentido de la palabra correctamente, y seguimos... Ahora, vuelve a nuestra    primer macro y agre...
•   Entonces, una variable es un lugar de almacenamiento con nombre, por ahora, es suficiente que    recuerdes esto, es mu...
espacio?, la respuesta es, depende, nueva pregunta ¿de que depende?, nueva respuesta, del tipo de        variable, (expres...
Para proteger un archivo ("completo") contra apertura y/o escritura, usa el comando Archivo | Guardar como... |Herramienta...
Nota:   Las contraseñas en Excel (y textos en VBA) son "sensibles" a la capitalización (mayúsculas ó        minúsculas). N...
Para quitar password en protecciones a archivos ....Esta protección "ya empieza" a ser difícil de brincar. Se requiere "ap...
En cualquiera de estos casos, las macros NO se ejecutan o "se omiten" las de apertura. Otra "forma" quepodría emplearse es...
Case 1: Fecha_x = DateValue("25/5/02") Case 2: Fecha_x = DateValue("02/5/25")End SelectIf Now <= Fecha_x ThenPRIMER PUNTO:...
Necesariamente es igual al procedimiento de re-llamada, con excepción de que  "la siguiente vez" que el método debiera eje...
ThisWorkbook.Save "Cancelamos el permiso" que da la variable PermisoParaGrabar = False Fin del procedimiento.End SubUna ma...
PROTECCIONES "ADICIONALES" PARA "CELDAS ESPECIALES".Si ya has usado Herramientas | Proteger | Proteger hoja... y/o Protege...
para "copiar", "cortar" y "pegar" quedan "inhabilitados" puesto que se especifica un argumento "vacío" para "la macro". Ap...
Por si existiera algún error  On Error Resume Next  "Inicializa" la variable del bucle  Siguiente = 0  Para "afectar" sólo...
CASO "PRÁCTICO" DE LA COMBINACIÓN DE ALGUNOS TRUCOSEl archivo "descargable" (al final de este artículo) contiene algunos e...
2. Contraseñas (Recuerda lo de mayúsculas, minúsculas, acentos y/o signos)      A. Para el libro y la hoja "Protegida", la...
3. Como protección adicional, todos los códigos son Privados (no se pueden ver en la "lista de macros"          menú Herra...
•    •    Coche = InputBox("¿Cuál es tu nombre?")    •    Sol = InputBox("¿Cuantos años tienes?")    •    •    MsgBox "Hol...
5. Hacer_Reporte        6. HacerReporte    Comúnmente, y lo veraz en estas páginas, uso la opción 5 o 6 pues me parecen ma...
o        ο   Da un clic en el botón Detener grabación , este botón (que aparece en la imagen de arriba) se            encu...
abierto. Este cuadro de dialogo tiene más opciones que el anterior, así que las que no se vean aquí, tedejo de "tareita" i...
Las ventanitas que están a la derecha de la imagen, tal vez las tengas a la izquierda en tu ventana,pero no importa, estas...
ο       .Strikethrough = False   ο       .Superscript = False   ο       .Subscript = False   ο       .OutlineFont = False ...
.Name = "Arial"   .Size = 20   .Strikethrough = False   .Superscript = False   .Subscript = False   .OutlineFont = False  ...
Sigue haciendo lo mismo la macro?, si?, pues entonces vamos bien, con esto te darás cuenta que, lamayoría de las veces, la...
Observa como Excel esta en primer plano y el Editor en segundo plano, si estas en la misma sesión de        trabajo, donde...
o   El cursor de escritura debe de quedar dentro de la ventana de código, observa que estoy usando el    mismo archivo que...
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Programación con visual basic para aplicaciones en excel programación  pura_con_excel
Upcoming SlideShare
Loading in …5
×

Programación con visual basic para aplicaciones en excel programación pura_con_excel

58,972 views

Published on

8 Comments
15 Likes
Statistics
Notes
No Downloads
Views
Total views
58,972
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
1,664
Comments
8
Likes
15
Embeds 0
No embeds

No notes for slide

Programación con visual basic para aplicaciones en excel programación pura_con_excel

  1. 1. Programación con Visual Basic para Aplicaciones en Excel • Introducción • Artículos • Macros • Funciones • Proyectos paso a paso • Complementos (Add-ins) • Otros Lenguajes • VinculosIntroducciónProgramar sobre cualquier lenguaje es fascinante, en la mayoría de ellos, el limite esta más de parte delprogramador que del lenguaje, no tengo elementos para decir cual es mejor o peor, creo que cada uno tienediferentes propósitos y que el bueno o malo, es el programador. Aprendí a programar de forma empírica, estotiene sus pros y sus contras, como desventaja esta que te tardas un poco más de tiempo en aprender y comoventaja esta que te vuelves un muy buen investigador, estas, solo por nombrar algunas, se que tal vez tengamuchas deficiencias y muchos otros "vicios" de los cuales, tal vez, ni cuenta me de, pero confío en que algúnbuen samaritano que tenga más experiencia que yo en la programación, me los hará notar, por lo pronto, esmi deseo que este camino que para mi ha sido de más de cinco años, sea mas corto y más leve para ti, estaes la razón principal de estas páginas. Como notaras la sección que esta más completa es la de Excel, fue delos primeros programas que use y en que empecé con el VBA y aun me sigue sorprendiendo y cada vez queescribo unas líneas de código, me surgen nuevas interrogantes, pero eso me gusta y te sugiero que no tedesanime si este es tu caso, veras que poco a poco se va aclarando el camino.Si bien en un principio no era mi intención hacer un manual, sino tan solo una guía, la verdad es que se haimpuesto mi espíritu pedagógico, pues te cuento que una de mis actividades favoritas es dar clases, así quelo que empezó como unos apuntes se esta convirtiendo en este pequeño manual, así que aprovecha,estudia, lee, investiga, lee, practica y lee, lee mucho...Artículos Preguntale a la Grabadora de macros Publica o Privada, ¿cual usar? • Option Explicit, Dim, ¿que es eso? • ¿Cómo puedo proteger un trabajo intelectual desarrollado en Excel? COLABORACION de Héctor Miguel Orozco Díaz, GRACIAS... • Variables y objetos, ¿como nombrarlos?Macros Grabando mi primer macro en Excel • Escribiendo mi primer macro en Excel • Escribiendo mi primer macro en Excel II • Escribiendo mi primer macro en Excel IIIFuncionesLas funciones personalizadas de Excel, trabajan igual que las incorporadas, con la diferencia de que estaslas creamos nosotros y nos sirven para obtener valores que no nos devuelven las incorporadas o para unir enuna sola, el resultado de varias funciones, su uso y manipulación es muy semejante a las macros, pero como
  2. 2. sabes estas nos devuelven valores, esto no lo pierdas de vista. Escribiendo mi primer función en Excel • ¿Como dejar disponibles mis funciones? • Función Numeros a LetrasProyectos Paso a PasoEsta sección esta pensada para que, aunque no tengas gran experiencia en la programación, seas capas deseguir una secuencia de pasos para lograr un propósito, un proyecto completo de alguna tarea, puedesproponer el desarrollo de algún proyecto, y si es de interés para varios, tal vez se pueda desarrollar entretodos. • Proyecto de Facturación (en preparación)Complementos (Add-ins)En esta sección explicaremos que son, cual es su propósito y como se usan, así como la forma de"instalarlos" dentro de Excel, también agregaremos complementos probados y terminados para su libre uso yestudio del código. ¿Que son? • Exportador de macrosOtros LenguajesControlar Excel desde otros lenguajes, es sumamente fácil, ademas de que pones a disposición de tuprograma, todas las herramientas de este, basicamente hay dos formas de hacerlo, trataremos de ver ambas,aunque más adelante solo me concentrare en una de ellas, también, para esta sección, estoy suponiendoque ya tienes bases de programación...Preguntale a la Grabadora de MacrosRara vez, la grabadora de macros, nos deja una macro tal como la queremos, en la mayoría de los casos, hayque editarla, agregándole o quitándole líneas, complementándola, mejorándola. En mi experiencia, lagrabadora de macros funciona muy bien como profesora, es decir, nos enseña el "como" de casi todo el trabajosobre Excel y "casi" nunca se equivoca. Concretamente lo que te quiero decir, es que cuando no sepas comohacer X tarea, graba una macro, ve el código, checa la ayuda acerca de las líneas que haya agregado y verascomo se aprende bastante, también esto sirve para que cuando realices una consulta, aquí o en cualquier otrolugar, ya tengas una idea, con código, de lo quieres, veamos estos dos casos con un ejemplo:En la página de Todo Expertos, un usuario me hizo la siguiente pregunta, que pongo solo con animo ilustrativo,no se nos vaya a ofender: Esta duda me trae de cabeza...... (26/3/2002 18:44:0) Hola Valedor, es la primera vez que pregunto, supongo que será facil pero a mi me resulta muy complicado, la pregunta en resumen es la siguiente: ¿como puedo hacer para que con
  3. 3. una macro,función, o lo que sea, me copie solo las celdas que contengan texto del rango de celdas A1:A20 y me coloque el resultado en el rango C1:C20 ordenados una debajo de la otra, es decir que no copie las celdas vacías, teniendo en cuenta que el rango de la columna A son celdas vinculadas desde otras hojas y solo se rellenan si hay algún dato que consignar, si me puedes ayudar para realizar esa macro con te lo agradecería muchísimo y me solventarías un gran problema.... Grabar macro... (27/3/2002 11:35:0) Lo primero que tienes que probar es a grabar una macro, yo lo hice y me dio esto Sub Macro2() Range("A1:A20").Select Selection.SpecialCells(xlCellTypeFormulas, 2).Select Selection.Copy Range("C1").Select ActiveSheet.Paste End Sub que hace lo que quieres...Primero, este amigo, no sabe la diferencia entre una Macro, una Función o lo que sea, que son tres cosasdiferentes, pero tu ya los sabes ¿verdad?... Segundo, si el hubiese grabado la macro, tal vez no le hubiesedado el mismo código que a mi, pero tendría "algo", que ya es ganancia, si antes de preguntar grabas tumacro, yo pensaré que tienes interés en aprender y me dará más gusto ayudarte, pero que pasos hubiésemosseguido para grabar esta macro, veamos algunas opciones, supongamos el escenario que nos propone elamigo, una serie de valores en las celdas A1:A20, pero que son formulas, las cuales pueden ser texto o algomás que no especifica, de estos datos, hay que seleccionar los que son texto y copiarlos a la celda C1,eliminando los espacios vacios, para este ejemplo, use los siguientes datos:Observa la barra de formulas, ve como los datos estan vinculados a otra hoja, observa también, que tenemostextos y números, ahora, grabaremos nuestra macro con estos pasos : 1. Activamos la grabadora de macros 2. Seleccionamos los datos de nuestro interés, en este caso de la celda A1:A12 3. Presionamos la tecla F5 4. Presionamos el botón de comando Especial... 5. Seleccionamos Celdas con formulas y solo dejamos activada la opción Texto. 6. Presionamos el botón de comando Aceptar 7. Copia estos datos, por el método que quieras, tienes como cuatro o más opciones 8. Selecciona la celda C1 9. Pega los datos
  4. 4. 10. Detenemos la grabaciónSi seguimos estos pasos al pie de la letra, la macro grabada tiene que quedar así...Sub Macro1() Range("A1:A12").Select Selection.SpecialCells(xlCellTypeFormulas, 2).Select Selection.Copy Range("C1").Select ActiveSheet.PasteEnd SubSi ejecutas esta macro en la hoja donde están las formulas, en nuestro ejemplo dentro de la Hoja1 tendrás quever algo como la siguiente imagen:No te preocupes tanto si tienes algo diferente, seguro algo hiciste de otra manera, en este tema, esto no es lorelevante, lo importante, es ver y notar como la grabadora de macros, nos ayuda mucho...Ahora, vamos a darle una pequeña variante para que observes las diferencias, estos son los pasos: 1. Activamos la grabadora de macros 2. Seleccionamos la celda A1 3. Presionamos la tecla F5 4. Presionamos el botón de comando Especial... 5. Seleccionamos Region actual 6. Presionamos el botón de comando Aceptar 7. Presionamos la tecla F5 8. Presionamos el botón de comando Especial... 9. Seleccionamos Celdas con formulas y solo dejamos activada la opción Texto. 10. Presionamos el botón de comando Aceptar 11. Copia estos datos, por el método que quieras, tienes como cuatro o más opciones 12. Selecciona la celda C1 13. Pega los datos 14. Detenemos la grabaciónPara estos pasos, la grabadora nos crea el siguiente código:Sub Macro2() Range("A1").Select Selection.CurrentRegion.Select Selection.SpecialCells(xlCellTypeFormulas, 2).Select Selection.Copy Range("C1").Select ActiveSheet.PasteEnd Sub
  5. 5. Ejecuta cada una de estas macros y nota las diferencias, dale variantes, por ejemplo, agrega mas datos pordebajo de la celda A20 y vuelve a probar cada una de las dos macros, agrega valores diferentes que no seantexto o números, agrega constantes, o sea, valores que NO provengan de formulas, pruébalas en otras hojas olibros. Cierto, esta macro no se adapta a todos los casos, de hecho, hace un trabajo muy especifico, pero notasque ahora sabemos como seleccionar la región actual Selection.CurrentRegion.Select o también aprendimoscomo seleccionar las celdas con formulas que contengan solo textoSelection.SpecialCells(xlCellTypeFormulas, 2).Select ¿que más aprendiste con esta pequeñisima macro?.Por ultimo haremos algo que se hace con la "mayoría" de las macros, editarla, si, editarla, es decir, agregarlelíneas que no haya agregado la macro, eliminando las que no nos sirven o mejorando lo que sea posible ymira que casi siempre es posible.Como primer paso, entra al Editor VBA y copia la macro que se llama (si no le pusiste otro nombre) Macro2, ycámbiale el nombre a Macro3, recuerda que NO puedes tener dos macros con el mismo nombre dentro delmismo módulo, esta macro tres será la que modificaremos y tal vez te sorprenda lo que se puede hacer,sigamos... • Como primer paso comentare la macro para que sepas que hace cada línea... • Sub Macro3() • Se selecciona la celda A1 • Range("A1").Select • A partir de la seleccion actual, se selecciona la REGION ACTUAL • Selection.CurrentRegion.Select • Seleccionamos las celdas con formulas que sean texto • Selection.SpecialCells(xlCellTypeFormulas, 2).Select • Copiamos la seleccion • Selection.Copy • Se selecciona la celda C1 • Range("C1").Select • Copiamos el contenido del portapapeles en la hoja activa • ActiveSheet.Paste • End Sub • El siguiente paso será unificar las dos primeras líneas, es decir desde la celda A1 seleccionaremos la región actual, para que se vea así... • Sub Macro3() • Se selecciona la celda A1 y su REGION ACTUAL • Range("A1").CurrentRegion.Select • Seleccionamos las celdas con formulas que sean texto • Selection.SpecialCells(xlCellTypeFormulas, 2).Select • Copiamos la seleccion • Selection.Copy • Se selecciona la celda C1 • Range("C1").Select • Copiamos el contenido del portapapeles en la hoja activa • ActiveSheet.Paste • End Sub • Ejecuta la macro con cada modificación que le hagamos, para que compruebes que sigue realizando las mismas acciones y finalizamos con el mismo resultado. Siguiente paso; unificamos la línea de selección de la celda A1 y la región actual, con la línea de selección de formulas que contengan texto... • Sub Macro3() • Se selecciona la celda A1 y su REGION ACTUAL y las • las celdas con formulas que sean texto • Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Select • Copiamos la seleccion • Selection.Copy • Se selecciona la celda C1 • Range("C1").Select
  6. 6. • Copiamos el contenido del portapapeles en la hoja activa • ActiveSheet.Paste • End Sub • Siguiente paso; unificaremos la línea de selección y la línea del método Copy... • Sub Macro3() • Se selecciona la celda A1 y su REGION ACTUAL y las • las celdas con formulas que sean texto y copiamos • Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Copy • Se selecciona la celda C1 • Range("C1").Select • Copiamos el contenido del portapapeles en la hoja activa • ActiveSheet.Paste • End Sub • Siguiente paso; le agregamos el argumento "opcional" al método Copy, donde se le indica el destino donde queremos dejar lo que estamos copiando, tiene que ser un argumento tipo Range, o sea un rango, para nuestro ejemplo, será la celda C1 • Sub Macro3() • Se selecciona la celda A1 y su REGION ACTUAL y las • las celdas con formulas que sean texto y copiamos • le agregamos el argumento "opcional" al metodo Copy • el DESTINO donde queremos copiar, un Rango • Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Copy Range("C1") • End Sub • ¿Cómo vez?, ¿has ejecutado la macro?, ¿observas como con UNA sola línea podemos hacer lo que se hacia con SEIS?, interesante ¿no crees?, no siempre es así, pero "casi" siempre, la grabadora de macros, graba líneas de más, que es muy bueno depurar, pues nos da mucha practica y código más limpio y ordenado...Para terminar, te comento que todavía, hago uso de esta técnica, si no se o no recuerdo como se hacedeterminada tarea, simplemente grabo una macro y listo, me muestra como es y en poco tiempo tesorprenderás como cada vez menos, tienes que consultar la ayuda, saludos...Creiste que esta vez no habia tareita, pues te fallo, prueba a grabar una macro con alguna acción que teinterese como se hace con código y nos cuentas a todos en la lista de correo, si vemos alguna interesante lapodemos publicar aquí...Descargar el archivo grabando_macros.zip que contiene el archivo Preguntale a la grabadora de macros.xlscon todo el código mostrado en este artículo.Publica o Privada, ¿cual usar?Para este tema, doy por sentado que algunas vez has grabado, al menos, una macro, que has leido al menosla Introdución que hay en esta página...Cuando grabamos una macro, la grabadora nos crea un código como este:Sub Macro1() Macro1 Macro Macro grabada el 03-04-2002 por Tecnico1
  7. 7. ActiveCell.FormulaR1C1 = "Hola" Range("A2").SelectEnd Suben algunas de mis páginas, en algunas otras páginas o en algún otro lado, habrás visto que algunas macrostienen una palabra más, detrás del Sub, como se que eres curioso, presionaste F1 y en la ayuda leíste cuales ypara que sirven estas palabras: Public y Private, así que supongo que lo dicho aquí ya lo sabes, pero sigueleyendo, tal vez encuentres algo nuevo o tal vez me notes algo que me falto y que por supuesto harás el favorde decirme, ¿verdad?, gracias. Bien, entonces la macro anterior también puede estar escrita así...Public Sub Macro1() ActiveCell.FormulaR1C1 = "Hola" Range("A2").SelectEnd Subo también asíPrivate Sub Macro1() ActiveCell.FormulaR1C1 = "Hola" Range("A2").SelectEnd Subpero, ¿cuál es la diferencia?, de eso se trata este pequeño articulo...Veamos que dice la ayuda acerca de estas palabrasPublic Opcional. Indica que el procedimiento Sub es accesible para todos los demás procedimientos de todos los módulos.Private Opcional. Indica que el procedimiento Sub es accesible sólo para otros procedimientos del módulo en el que se declara.A ver si entendimos, probemos con unos ejemplos, realiza los siguiente pasos: • Entra a Excel • Entra al EditorVBA (Alt+F11) • Menú Insertar | Modulo • En la ventana de código escribe lo siguiente • Sub Pruebas1() • MsgBox "Esta macro es PUBLICA" • End Sub • A lo que acabamos de hacer se le llama, declarar un procedimiento. • Ejecútala desde el EditorVBA presionando F5 (recuerda que el cursor debe estar dentro de la macro) y nos mostrara este bonito mensaje. • Ahora quiero que la vuelvas a ejecutar, pero desde Excel, regresa a Excel, ve al menú Herramientas | Macro | Macros... o si lo prefieres Alt+F8, selecciona la macro Pruebas1 y presiona el botón Ejecutar para confirmar que, de nuevo, se ejecuta correctamente. • Ahora, agrégale la primer palabrita que estamos estudiando, para que se vea así. • Public Sub Pruebas1() • MsgBox "Esta macro es PUBLICA" • End Sub
  8. 8. • Vuelve a ejecutar la macro, de las dos formas que hemos visto y felizmente, nos muestra nuestro mensaje.• Conclusión: las macros o procedimientos son Publicas por omisión y como dice la ayuda que es opcional, entonces es lo mismo poner o no poner la palabra Public antes de la instrucción Sub.• Muy bien, muy bien, veo que eres buen estudiante, ahora creamos una segunda macro que se llame Pruebas2 (te quemaste el coco para pensar este nombre Mauricio), por que recuerda que no puedes tener dos procedimientos que se llamen igual, prueba a ponerle el mismo nombre y veraz que el EditorVBA te dirá algo medio feo. Ahora, le ponemos nuestra segunda palabrita.• Private Sub Pruebas2()• MsgBox "Esta macro es PRIVADA"• End Sub• Ejecútala desde el EditorVBA, verás que nos sigue mostrando el mensaje, claro, ahora nos dice que es PRIVADA (ni tanto ¿verdad?, la seguimos viendo), pero la siguiente prueba será ejecutarla desde Excel (Alt+F8).• ¿Qué paso?, ¿mande...?!, que!!, que no se ve!!, ¿¡cómo que no se ve!?, pero si estamos declarandolo como debe ser, aaahhh ya recuerdo, le agregamos una palabrita mágica, ¿verdad?, Private, si, esta palabrita es muy útil, en este caso, la macro ya no aparece listada en el cuadro de lista, del cuadro de dialogo Macros, como lo acabamos de demostrar, pero entonces, ¿no se puede ejecutar desde aquí, tiene que ser desde el EditorVBA?, para probarlo entra de nuevo al cuadro de dialogo macros y por ahora solo veras la macro anterior Pruebas1, ahí, donde dice Nombre de la macro, escribe Pruebas2 y observa que pasa...• Interesante ¿no?, la macro de todos modos la podemos ejecutar con solo saber su nombre y estarás de acuerdo que si no queremos que las ejecuten no les diremos como se llaman, sssssshhhh...• Te puede suceder que, por error de dedo, hayas escrito mal el nombre de la macro, ¿qué pasa?, ¿qué es lo que hace Excel?, te dejo de tareita que me cuentes que pasa en estos casos.• ¿Y eso es todo?..., no, ¿cómo crees?, sigamos haciendo pruebas, como sabes, y si no sabias, ahora vas a saber, puedes ejecutar una macro desde otra macro, a esto lo nombramos llamar a la macro y para comprobarlo, modifica nuestra primer macro para que se vea así.• Public Sub Pruebas1()• MsgBox "Esta macro es PUBLICA"• Pruebas2• End Sub• Por supuesto ejecútala y observa, interesante, muy interesante... ¿verdad que si?... A la vista de este efecto, ¿que deduces?, ¿para que te imaginas que pueda servir el llamar a una macro desde otra?, ¿que utilidad tiene el que unas se vean y otras no?...• Antes de responder, algunas, por que otras de estas preguntas tu las tienes que responder, hagamos otras pruebitas. Insertemos otro modulo en nuestro archivo, menú Insertar | Módulo, nuestro Explorador de proyectos se tiene que ver así.• En este módulo crearemos una tercer macro Publica, en este momento ya tienes lo elementos para hacer tu propio ejemplo, pero por supuesto puedes seguir con los que propongo...• Public Sub PruebasA()
  9. 9. • MsgBox "Esta macro es PUBLICA y esta en un otro Módulo"• End Sub• Ahora, trata de llamar a la macro Pruebas1 que se encuentra en el primer módulo, la macro se tiene que ser así...• Public Sub PruebasA()• MsgBox "Esta macro es PUBLICA y esta en un otro Módulo"• Pruebas1• End Sub• La macro se ejecuta, o se debería ejecutar sin problemas, si no es así, revisa alguno de los pasos que hemos seguido, ahora, trata de llamar a la segunda macro del primer módulo, es decir, trata de llamar a la macro que declaramos Privada en el primer módulo y que nombramos Pruebas2.• Public Sub PruebasA()• MsgBox "Esta macro es PUBLICA y esta en un otro Módulo"• Pruebas2• End Sub• ¿Qué sucedió?, ¿se ejecuta?, creo que no, pero el EditorVBA nos muestra un mensaje de error, más específicamente el siguiente error.• Después de presionar el botón Aceptar, el Editor nos regresa a la ventana de código, selecciona la palabra donde esta el error y nos muestra una línea de un color amarillo bastante distinguible.• Muy bien pensado, la razón de que no podamos llamar a una macro de otro módulo, es por que esta macro la declaramos Privada (Private), entonces si es cierto lo que dice la ayuda, -indica que el procedimiento Sub es accesible sólo para otros procedimientos del módulo en el que se declara-, ¿verdad?, de ahí la importancia de leer la ayuda "siempre". Antes de que detengas la ejecución de la macro, observa la barra de titulo, por ahí tiene una palabrita que dice [interrupción], ya la viste, bueno, por ahora solo lo menciono, pero más adelante se verá un poco más a detalle, cuando ejecutamos código, este se puede detener, tanto por errores de sintaxis (como en este caso) o cuando nosotros queramos, esto es algo muy útil cuando depuramos nuestras macros, así que lo veremos en otro articulo. Ahora si, puede detener la ejecución de la macro, de hecho, no tenemos otra alternativa, esto lo haces con el icono Restablecer de la barra de herramientas, que es como el botón Detener de la mayoria de los reproductores de musica, o bien, ve al menú Ejecutar | Restablecer y listo, la macro se detendra al momento.
  10. 10. • Concluyendo: las macros pueden ser Publicas (Public) o Privadas (Private), es igual poner el Public o no, pero no es lo mismo si ponemos o no el Private, la recomendación es, declara explícitamente si tu macro es Publica o Privada.• Para terminar te comento que lo visto aquí, acerca de las macros Publicas y Privadas es aplicable, también, para las funciones, es decir, también tenemos funciones Publicas y funciones Privadas, pero parte de la tareita de esta sección es esa. o Crea una segunda macro Privada en el segundo Módulo y realiza todas las pruebas que hemos hecho con las demás, incluyendo, el tratar de ejecutarlas desde la ventana de Excel o Crea todas las macros y has todas las pruebas que consideres suficientes para que no queden dudas de este tema, incluso agrega un tercer o cuarto módulo para esto. o Crea varias sencillas funciones, tanto Publicas como Privadas y quiero que me digas, donde se ven y donde no, te dare una pista, usa el Asistente para funciones para observarlo. Para crear las funciones, si no lo has hecho, lee el tema Escribiendo mi primer función en Excel y después haces estas pruebas. o Una líneas más arriba, nos hicimos la siguiente cuestión: ¿para que te imaginas que pueda servir el llamar a una macro desde otra?, la respuesta a esta pregunta es importantisima, tiene mucho que ver con lo que pensaba el señor Descartes, ¿ya lo recuerdas?...• Como complemento a este artículo, veremos que diferencia hay entre una función Publica y una función Privada La siguiente función personalizada nos devuelve un texto con información del tipo de contenido de la celda pasada como argumento y nos dice si la celda esta VACIA, si es un NUMERO, si es una FECHA o si contiene TEXTO... Option Explicit Public Function TipoValor(Celda As Range) As String If Celda.Value = "" Then TipoValor = "VACIA" ElseIf IsNumeric(Celda.Value) Then TipoValor = "ES NUMERO" ElseIf IsDate(Celda.Value) Then TipoValor = "ES FECHA" Else TipoValor = "ES TEXTO" End If End Function Para usar esta función, regresa a la ventana de Excel, en este caso, usaremos el Asistente para funciones, que seguro ya dominas, entonces, los pasos serian... o Escribe en la celda A1 un valor cualquiera o Posiciona el cursor en la celda B1 o Inicia el Asistente para funciones o En el Cuadro de lista Categoría de la función, busca la ultima opción que dirá, Definidas por el usuario o En el Cuadro de lista Nombre de la función, tendrás que ver nuestra función TipoValor, por supuesto si tienes más funciones que hayas creado aquí las veras o Seleccionamos esta función y presionamos el Botón de comando Aceptar
  11. 11. o Como bien sabes, el Asistente te presenta una ventanita con el nombre de la función y un cuadro de texto solicitándote el argumento Celda necesario para que la función trabaje (bueno, realmente no es un cuadro de texto, sino un control muy especial y muy útil que aprenderemos a usar más adelante)o Puedes usar el botón Contraer o escribir directamente la referencia a la celda A1, tras lo cual presionaras el botón Botón de comando Aceptar y el Asistente introducirá por nosotros, el signo igual, la función y el argumento que le establecimoso Al terminar, mi celda B1 se tendrá que ver como en la siguiente imagen y verificaremos que la función haga el trabajo para la cual la programamos, ¿así es?...
  12. 12. o Ahora, cambiaremos la palabra Public de nuestra función por la palabra Private, o bien, puedes copiar la función y hacer una segunda, por supuesto, con otro nombre, yo usare el primer método...o Option Explicitoo Private Function TipoValor(Celda As Range) As Stringoo If Celda.Value = "" Theno TipoValor = "VACIA"o ElseIf IsNumeric(Celda.Value) Theno TipoValor = "ES NUMERO"o ElseIf IsDate(Celda.Value) Theno TipoValor = "ES FECHA"o Elseo TipoValor = "ES TEXTO"o End Ifoo End Functionoo Regresa a la ventana de Excel y copia la formula existente en la celda B1 a la celda B2, ¿qué pasa?..., así es, la función sigue trabajando, entonces!..., ¿cuál es la diferencia?, para notarlo, trata de agregar un valor cualquiera en la celda A3, posicionate en la celda B3 y trata de usar el Asistente para funciones como en nuestro primer ejemplo y observa...
  13. 13. o Efectivamente, la función no aparece, de hecho, la categoría que usamos Definidas por el usuario, ya no aparece (claro, siempre y cuando no tengas otra función declarada), pero trata de escribir la función directamente en la celda, ¿funciona?, si, si funciona, es algo similar a lo que pasa en las macros, que, como leiste más arriba, cuando la pasas a Privada, ya no se lista en el cuadro de dialogo, pero aun la puedes ejecutar si sabes su nombre, del mismo modo, si sabes el nombre de alguna función personalizada, la puedes llamar o hacer uso de ella, siempre y cuando te sepas su nombre y los argumentos que necesita, tan solo, con escribirla directamente en la celda. o Como con las macros, nos preguntamos, ¿para que servirá tener funciones Publicas y funciones Privadas?..., observa la función Números a letras para que te des una idea, aunque de nuevo, el señor Descartes nos puede ayudar... • Ahora si, Fin...Descargar el código de este artículo.Option Explicit, Dim, ¿que es eso?Para este tema, doy por sentado que algunas vez has grabado, al menos, una macro, que has leido al menosla Introdución que hay en esta página...En la mayoría de código que veas en estas páginas, y en muchas otras macros que has visto, habrás notadoque al inicio de estas, casi siempre hay una pequeña línea de dos simples palabras, Option Explicit, lasseleccionaste, presionaste F1 y leíste esto:Se usa en el nivel de módulo para forzar declaraciones explícitas de todas las variables en dichomódulo.Esta comprendido?, si?, bueno, Fin del articulo...Pero que antipático te estas poniendo Mauricio, anda, explícalo mejor...-De acuerdo, de acuerdo, trataré...-Primero los ejemplos y después las explicaciones • Entra Excel
  14. 14. • Entra al EditorVBA• Inserta un nuevo módulo y asegúrate que este en vacío, si tiene las palabras que estamos estudiando, bórralas.• Teclea o copia la siguiente macro y pruebala• Public Sub Sumas()•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Suma = Numero1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• Que bien, funciona verdad, ahora, vamos a suponer que tecleamos mal un nombre, por ejemplo, en vez de teclear Numero1, tecleamos Numer1, para que nuestra macro quede así, por esta vez, pondré en negritas los nombres que hay que probar...• Public Sub Sumas()•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Suma = Numer1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• Pruébala, ¿funciona?, si, si funciona, solo que NO da el resultado correcto, en este caso, siempre nos mostrara el valor del segundo número que le hayamos proporcionado, ¿por qué?, sigamos con las pruebas, ahora supondremos que los números están bien y que la que tecleamos mal es la palabra Suma, la cual la tecleamos así; Sum• Public Sub Sumas()•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Sum = Numero1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• Que bien!, también funciona, solo que tampoco nos da el resultado correcto, esta vez es peor, pues siempre nos muestra cero, ¿verdad?, bueno, la causa es más que obvia, los nombres no los hemos escrito correctamente y por correctamente me refiero a como escribimos esas mismas palabras en las líneas anteriores o posteriores, pues aquí no vale la ortografía, para muestra una macro...• Public Sub Gardim()•• arvol1 = Val(InputBox("Dame un número"))• lovo2 = Val(InputBox("Dame otro número"))•• frrutas = arvol1 + lovo2•• MsgBox "La suma es: " & Format(frrutas)•• End Sub• Observa como alucine con los nombres de estas palabras, a parte de que están mal escritas, no tienen nada que ver con el propósito de nuestra macro, ya volveremos sobre este asunto más adelante, por
  15. 15. ahora quise mostrarte el sentido de la palabra correctamente, y seguimos... Ahora, vuelve a nuestra primer macro y agrega, en la parte superior, las palabras mágicas Option Explicit y trata de ejecutarla.• Option Explicit•• Public Sub Sumas()•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Suma = Numero1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• ¿Que paso?, ¿no te dejo?, ¿porque?, ¿que te aparece?... efectivamente, nos muestra un bonito mensaje, que dice..• Y no solo eso, también nos colorea de amarillo la macro donde esta el error y nos selecciona la palabra que esta mal, mejor dicho, la variable, déjame repetirlo, la variable que NO hemos declarado.• Ahora tenemos una nueva palabra, variable ya sabes que tienes que hacer, presionar F1, buscar esta palabra para encontrar... Variable Un lugar de almacenamiento con nombre que puede contener cierto tipo de datos. Cada variable tiene un nombre único que la identifica. Nombres de variable deben comenzar con un carácter alfabético, deben ser únicos dentro del mismo ámbito, no deben contener más de 255 caracteres y no pueden contener un punto Si leíste la ayuda, notaras que no esta todo lo que dice ahí, pues estoy haciendo un poco de trampita como diría un amigo, la trampita es que no transcribí todo, si no solo lo que a mi juicio, es relevante para este tema, así que vamos por partes...
  16. 16. • Entonces, una variable es un lugar de almacenamiento con nombre, por ahora, es suficiente que recuerdes esto, es muy importante, y... ¿dónde esta es lugar de almacenamiento?, señoras y señores, les presento a la señora RAM, bueno, no hace falta, todos la conocemos y la usamos, siempre que prendemos nuestra maquina, ¿verdad?, si, esa cosa llamada memoria RAM que por cierto ha subido mucho de precio, pero en fin, ahí, en al memoria RAM es el lugar de almacenamiento de nuestras variables, pero tenemos que comunicarle al VBA que nos aparte un pedacito de memoria y que además le de un nombre para que sepamos donde esta, a la acción de reservar memoria para nuestras variables, se le denomina Declaración de variables o Dimencionar variables, para ello, usamos otra nueva palabrita mágica, la instrucción Dim, modifica la macro para que se vea así...• Option Explicit•• Public Sub Sumas()• Dim Numero1•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Suma = Numero1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• Ejecutala y..., tampoco nos deja, y ahora ¿que paso?, se detuvo de nuevo, pero ahora en otra variable, pero nos muestra el mismo error, ¿no es así?, bueno, pues ni modo, vamos a declarar nuestras restantes variables..• Option Explicit•• Public Sub Sumas()• Dim Numero1• Dim Numero2• Dim Suma•• Numero1 = Val(InputBox("Dame un número"))• Numero2 = Val(InputBox("Dame otro número"))•• Suma = Numero1 + Numero2•• MsgBox "La suma es: " & Format(Suma)•• End Sub• ¿Y esta vez?, claro, ahora si funciona de nuevo, pero... ¿qué ventaja percibes al declarar las variables?, ¿no es teclear más solamente?, en este ejemplo manejamos tres variables y seria algo difícil el escribir mal alguna, pero cuando empiezas a manejar, diez, veinte, cincuenta variables y no se diga cuando empieza a combinar más de una macro, funciones y otras cositas que ya veremos, notaras todas las ventajas de Declarar explícitamente las variables pues el uso de Option Explicit nos evita que usemos variables que antes, no las hayamos declarado.• Si lees la ayuda acerca de la instrucción Dim, leerás que no solo es esta, sino que tiene muchas otras variantes, tantas que nos saldríamos del tema central de este articulo, pero te recomiendo que lo leas, analices y ponga en practica, lo que si veremos es algo de suma importancia, transcribo... Dim Declara variables y les asigna espacio de almacenamiento De esta definición, ya debes de tener comprendida la primer parte Declara variables, la segunda no es tan complicada asigna espacio de almacenamiento. Quedamos que nuestras variables quedan en la memoria RAM, como sabes esta memoria es limitada y conforme se usa, hay la posibilidad de que se acabe, lo cual es muy malo, así como dice la física, que materia es todo lo que ocupa un lugar en el espacio, aquí, diremos que toda variable ocupa un espacio en la memoria, la pregunta es ¿cuánto
  17. 17. espacio?, la respuesta es, depende, nueva pregunta ¿de que depende?, nueva respuesta, del tipo de variable, (expresión de asombro), ¿pero que hay varios tipos de variables?, respuesta si, ¿cómo cuales?, aquí van algunos: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant, cada uno de estos tipos, ocupa un lugar, tiene un tamaño y puede contener una cierta cantidad de información, ¿cuál es la mínima unidad de almacenamiento?, así es, 1(un) byte, entonces, las variables, dependiendo su tipo, usan desde un byte y ¿hasta?, esa es tu tarea... • Te estarás preguntando, ¿pero como le decimos que tipo de variable quiero usar?, y la respuesta es muy sencilla, solo usamos otra palabrita mágica, As, seguida del tipo de variable que queramos declarar, para muestra, declararemos correctamente nuestras variables... • Option Explicit • • Public Sub Sumas() • Dim Numero1 As Integer • Dim Numero2 As Integer • Dim Suma As Integer • • Numero1 = Val(InputBox("Dame un número")) • Numero2 = Val(InputBox("Dame otro número")) • • Suma = Numero1 + Numero2 • • MsgBox "La suma es: " & Format(Suma) • • End Sub • Todavía más preguntas, ¿qué pasa si no le indico de que tipo es?, en nuestro ejemplo anterior funciono bien, ¿entonces?, ¿cuál es la diferencia?, la respuesta a esta interrogante, esta en la ayuda, así que nuevamente, busca y lee un poquito, por lo pronto, acostúmbrate a declarar explícitamente tus variables, reitero, declara explícitamente TODAS tus variables y acostumbrate a que como primer línea, en cualquier módulo de código, tengas un Option Explicit, entre más variables uses y mas líneas de código tengas, notaras cada vez más, las grandes ventajas de esto.Descargar el código de este artículo.¿Cómo puedo proteger un trabajo intelectual desarrollado en excel?.Por Héctor Miguel Orozco DíazLa pregunta anterior se hace con cierta frecuencia en los foros públicos de discusión y consulta (tanto en los deMicrosoft como en los "independientes"). Las respuestas siempre serán en relación con el tipo y grado deprotección "deseada". La forma más "fácil" de proteger en Excel (sin utilizar macros), es asignar unacontraseña (ó "password") ya sea a la hoja, al libro, al archivo. Para los dos primeros casos, "basta" con usar elcomando Herramientas | Proteger | Proteger hoja... o Proteger libro...
  18. 18. Para proteger un archivo ("completo") contra apertura y/o escritura, usa el comando Archivo | Guardar como... |Herramientas (BOTÓN AL FINAL) | Opciones generales.... En los diálogos mostrados por estos comandos,podrás asignar la contraseña de tu preferencia y a los componentes que se habrán de incluir en la protecciónque creas más "convenientes" (se te solicitará una confirmación).
  19. 19. Nota: Las contraseñas en Excel (y textos en VBA) son "sensibles" a la capitalización (mayúsculas ó minúsculas). NO ES LO MISMO "abc" QUE "aBc". Por lo tanto, si usas contraseñas para protección de tu trabajo... "¡ QUE NO SE TE OLVIDE... RECORDARLAS !!!" (EXACTAMENTE COMO Y EN DONDE LAS ASIGNASTE).Sin embargo, brincar (ó "crackear") las protecciones para la hoja y el libro (NO al archivo) es "sumamente fácil",mediante macros que pueden inclusive ser usadas "desde otro" libro cualquiera (ohh... desilusión !!!).Los siguientes códigos hacen el "trabajo sucio":Option Explicit** Para quitar password en protecciones a hojas ... **Public Sub RemoverPasswordEnHoja() ActiveSheet.Protect "", , , , True ActiveSheet.Range("a1").Copy ActiveSheet.Range("a1")End Sub** Para quitar password en protecciones a libros ... **Public Sub RemoverPasswordEnLibro() Dim Protecciones As Integer If ActiveWorkbook.ProtectStructure = True Then Protecciones = Protecciones + 1 If ActiveWorkbook.ProtectWindows = True Then Protecciones = Protecciones + 2 Select Case Protecciones Case 0: ActiveWorkbook.Protect "", False, False Case 1: ActiveWorkbook.Protect "", True, False Case 2: ActiveWorkbook.Protect "", False, True Case 3: ActiveWorkbook.Protect "", True, True End Select ActiveWorkbook.UnprotectEnd Sub
  20. 20. Para quitar password en protecciones a archivos ....Esta protección "ya empieza" a ser difícil de brincar. Se requiere "apoyo" de algún software especializado (quegeneralmente cuesta dinero) cuyas "versiones de prueba" (léase gratis) "rompen" contraseñas con hasta unmáximo de 4 caracteres. Te sugiero que utilices contraseñas "más largas", inclusive puedes usar "mezclas" demayúsculas y minúsculas, números y caracteres especiales, como los que se obtienen de la combinación delas teclas {Alt} + teclado numérico como: {Alt}+174 = «, {Alt}+0140 = Œ, {Alt}+225 = ß, {Alt}+(la_que_te_encuentres_simpática). Los caracteres que se "visualizan" dependen del tipo de letra que se usa.USO DE MACRO-CÓDIGOS CON APOYO DE VBA.Si quieres "llegar" a protecciones más "sofisticadas", tendremos que "echar mano" de las macros, para lo cual,enseguida se explicarán algunos "trucos" que, haciendo una "buena" combinación de ellos te podrás acercar alo que pudiera considerarse como un "Sistema de Protección (casi) Perfecto".Requisito INDISPENSABLE: Asignar también al proyecto VBA (macros) una contraseña.SIGUE LAS SUGERENCIAS INDICADAS ANTERIORMENTE... Y ¡OJO! CON LOS ACENTOS.Toma en consideración que una de las tareas más "quema-neuronas" en cuestiones de programación es: o "Anticipar" (en la medida de lo posible) las acciones del usuario para poder. o "Evaluar" las consecuencias de ejecutar un código y finalmente. o "Diseñar" prevenciones o correcciones de errores "involuntarios" (o premeditados?).La técnica empleada para este ejemplo, es precisamente el uso combinado de varios "trucos", los cuales seirán explicando en el curso de estos textos y cuya base principal es: "Mantener" el archivo grabado (en launidad de almacenamiento) SIEMPRE OCULTO Y CON CONTRASEÑA, para lo cual es imprescindible contarcon el apoyo de los eventos de la aplicación para "detectar" algunas acciones del usuario y "actuar enconsecuencia".ANALIZANDO LOS "INCONVENIENTES" (Y SOLUCIONES) DE USAR MACROS:>Dado que el usuario tiene la opción de decidir si un archivo se abre o no "con permiso" de usar macros ó puedeinclusive "mantener inoperables" los eventos (esto NO lo puedes evitar), las primeras acciones "preventivas"serán: 1. Si se ha de abrir sin permiso de usar macros (por elección o alto nivel de protección) ó los eventos son "inoperables" (en ese momento), hemos de asegurarnos que el archivo "se mantiene" OCULTO y con "password" (en la unidad de almacenamiento). 2. Si las macros y los eventos "están en operación" (y se va a "permitir" su uso), hemos de EVITAR que pueda grabarse el archivo (a la unidad de almacenamiento) de la manera "convencional", ya que podría "volverse visible" y quedar completamente "desprotegido" para la siguiente vez que se abra (lo haremos por código mediante un procedimiento "especial"). 3. Hemos también de prevenir (y corregir en su caso) que durante el curso de la sesión los eventos sean "des-habilitados".Estas acciones nos permiten darle al usuario "permiso de usar" el archivo "prácticamente" sin restricciones y"tomar" el control de lo que podrá o no "hacer" con él (y en él).Algunas opciones que el usuario puede usar para "impedir" el uso de macros son: o "Tener" un nivel alto de protección "contra" archivos con macros. o "Elegir" NO ejecutar las macros del archivo (si el nivel es medio ó bajo). o "Mantener presionada" la tecla {Mayús} (al abrir el archivo y "permitir" las macros).
  21. 21. En cualquiera de estos casos, las macros NO se ejecutan o "se omiten" las de apertura. Otra "forma" quepodría emplearse es: abrir el archivo mediante macros (en otro archivo) usando previamente la instrucciónApplication.EnableEvents = False"Contra" estas (y otras) opciones, nuestra primer acción preventiva prevalecerá: el archivo (desde la unidad dealmacenamiento) "permanece" OCULTO Y CON CONTRASEÑA.Ahora bien, cuando las macros "son permitidas" y los eventos "están operables", podemos verificar que "secumplan" ciertas condiciones para permitir o no el uso de nuestro archivo.Tales condiciones pueden ser -entre otras- A. Que el archivo está ubicado en algún directorio específico -o uno "alterno"- B. El nombre del usuario C. Si existe algún archivo en ese u otro directorio D. La fecha del sistema E. El nombre mismo del archivo F. Etc., etc., etc.Podrás encontrar otras que "acomoden" mejor a tus necesidades. En caso de que las condiciones ("mínimasnecesarias") estén cumplidas, se dará acceso al archivo, en caso contrario, se tomarán otras acciones (comopermitirle "verlo sin usarlo" ó definitivamente cerrar el libro -entre otras-).Si se permite el acceso al libro (total ó "restringido") para evitar que lo grabe de la manera "tradicional"(segunda acción preventiva), "forzamos" a la aplicación para que los métodos "convencionales" de grabado "nofuncionen" y le proveemos de un "comando especial" que se encargará de que el archivo se grabe (a la unidadde almacenamiento) SIEMPRE OCULTO Y CON CONTRASEÑA. Es por esto es que "nos tenemos queasegurar" de que los eventos estén "siempre operables" (tercera acción preventiva).ALGUNOS "TRUCOS" (COMBINABLES) POR CÓDIGO:Para continuar con la exposición de los ejemplos, "se dará por entendido" que se tiene al menos unconocimiento "esencialmente básico" en cuanto al uso del lenguaje Visual Basic para Aplicaciones (VBA) -laplataforma en la que "trabajaremos"-, así como de los objetos, propiedades, métodos, eventos, instrucciones y"otros".Para verificar que el archivo se encuentre ubicado en un directorio específico, usamos la propiedad Path de unobjeto Workbook, que "devuelve" una cadena de texto indicando la ruta (unidad y directorio):If ThisWorkbook.Path = "C:Mis documentosOtro directorio" ThenPara verificar el nombre del usuario, usaremos la propiedad UserName del objeto Application ("forzada" aminúsculas -ó mayúsculas-), que "devuelve" una cadena de texto con el nombre "registrado":If StrConv(Application.UserName, vbLowerCase) = "fulanito de tal" ThenPara verificar si existe algún archivo en ese u otro directorio, existe el método Dir("Ruta_ Archivo"), que"devuelve" una cadena de texto con el nombre del archivo ó una cadena vacía ("") si no existe:If Dir("Unidad:Ruta1Ruta2NombreArchivo.ext") <> "" ThenPara comparar dos fechas, primero "tendremos" que identificar el orden de los elementos con la propiedadInternational(xlDateOrder) del objeto Application, que "devuelve" un tipo de datos Long (0 = mes-día-año; 1= día-mes-año; 2 = año-mes-día), de lo contrario, un dato de fecha podría "significar" FECHAS DISTINTAS (ensistemas "diferentes").P.e.: La fecha "25 de Mayo de 2002" de un sistema "de origen" del orden 1 (día-mes-año) si se quierecomparar en un sistema "de destino" del orden 0 (mes-día-año) "indicando" la fecha como "25/5/02" significará"Mayo 2 de 2025". Una estructuración "confiable" sería:Dim Fecha_x As DateSelect Case Application.International(xlDateOrder) Case 0: Fecha_x = DateValue("5/25/02")
  22. 22. Case 1: Fecha_x = DateValue("25/5/02") Case 2: Fecha_x = DateValue("02/5/25")End SelectIf Now <= Fecha_x ThenPRIMER PUNTO: TERCERA ACCIÓN "PREVENTIVA".Una vez que "obtuvimos permiso" de usar las macros y estando los eventos "operables", puesto que uno deellos "detecta" la intención del usuario de grabar el archivo "de manera convencional", aseguramos que loseventos "permanezcan operables", utilizando para ello el método OnTime del objeto Application, haciendouna llamada "recursiva" al mismo método una y otra vez (por el tiempo que dure la sesión) para "monitorear"los eventos.PRECAUCIÓN !!! - La ejecución del método OnTime de manera recurrente y programada, NO ESCANCELADA "automáticamente" por la aplicación. Si el libro que la ejecuta es cerrado SIN CANCELAR LASIGUIENTE "LLAMADA", Excel volverá a abrir el libro y continuará su ejecución. ¡ ES NECESARIOCANCELAR AL SALIR !!!.Para lograr el efecto de "re-llamado" al método, usaremos las variables Públicas:Para el "siguiente monitoreo" de los eventosPublic MonitorEventos As DoublePara monitorear los eventos cada 20 segundos (p.e.)Public Const IntervaloMonitor As String = "0:00:20"Es el nombre de la macro que mantiene activos los eventosPublic Const MacroEventos = "MantenerEventos"En los siguientes procedimientos:Macro de "prevención" contra "suspensión" de eventosPublic Sub MantenerEventos() Mantiene siempre Activos los eventos Application.EnableEvents = True (Re)-Inicia un bucle de "Activación" cada "X" tiempo ComenzarLoopDeEventosFin del procedimientoEnd SubMacro de monitoreo "permanente" de EventosPublic Sub ComenzarLoopDeEventos() Se determina el "siguiente monitoreo" de los eventos MonitorEventos = Now + TimeValue(IntervaloMonitor) Una vez "llegado" el tiempo, "lanza" nuevamente el método OnTime haciendo referencia a la variable pública constante "MacroEventos" (macro "MantenerEventos") especificando que el siguiente "loop" se ejecute (Schedule:=True) Application.OnTime _ EarliestTime:=MonitorEventos, _ Procedure:=MacroEventos, _ Schedule:=TrueFin del procedimientoEnd SubMacro para "cancelar" el siguiente método OnTimeEste procedimiento se llamará "al cierre" del libro.Public Sub DetenerLoopDeEventos()
  23. 23. Necesariamente es igual al procedimiento de re-llamada, con excepción de que "la siguiente vez" que el método debiera ejecutarse se especifica como Falso. MonitorEventos = Now + TimeValue(IntervaloMonitor) Application.OnTime _ EarliestTime:=MonitorEventos, _ Procedure:=MacroEventos, _ Schedule:=FalseEnd SubUna vez definidos los procedimientos, los "llamamos" en alguna macro de evento como Auto_Open (óAuto_Close) o los procedimientos de evento del objeto Workbook.Para iniciar (y mantener) el método:Private Sub Workbook_Open() MantenerEventosEnd SubPara detener (y cancelar) el método:Private Sub Workbook_BeforeClose(Cancel As Boolean) DetenerLoopDeEventosEnd SubSEGUNDO PUNTO: SEGUNDA ACCIÓN "PREVENTIVA".Ahora que los eventos "permanecerán" activos, vamos a "impedir" que el archivo se grabe (a la unidad dealmacenamiento) de la manera "convencional" (ya sabemos que de esta manera podría "volverse visible" yquedar completamente "desprotegido" para la siguiente vez que se abra).Para esto será necesario declarar una variable pública del tipo Boolean (Verdadero ó Falso) como:PermisoParaGrabar, que será la que "impida" (ó "permita") que el archivo sea grabado y usaremos el eventoBefore_Save del objeto ThisWorkbook con una línea como:If Not PermisoParaGrabar = True Then Cancel = TrueAsí le estamos "indicando" a Excel que siempre y cada vez que el usuario "pretenda" grabar el archivo, "NO selo permita". La variable será usada como "candado" en el código de nuestro "comando especial" para "abrir" elpermiso, grabar (de manera "correcta") y "cerrar" nuevamente el candado.TERCER PUNTO: PRIMER ACCIÓN "PREVENTIVA".Con los eventos activos y los comandos convencionales de grabación "fuera del alcance" del usuario,procederemos a "instruir" a Excel para que, a través de un comando especial nos asegure que el archivoSIEMPRE "permanecerá" OCULTO Y CON CONTRASEÑA.Macro para guardar los cambios (sólo por código)Public Sub GuardarEspecial() Congelamos la actualización de la pantalla Application.ScreenUpdating = False La variable que "permite" o "impide" grabar el archivo PermisoParaGrabar = True Ocultamos la ventana del libro protegido Windows(ThisWorkbook.Name).Visible = False Protegemos el libro con Contraseña (inclusive su estructura y "arreglo" de ventanas) ThisWorkbook.Protect Password:="X_Contraseña", _ Structure:=True, Windows:=True Grabamos el libro (a la unidad de almacenamiento)
  24. 24. ThisWorkbook.Save "Cancelamos el permiso" que da la variable PermisoParaGrabar = False Fin del procedimiento.End SubUna macro como la anterior hará "un excelente trabajo", sólo faltaría "detectar" si el libro "continúa enoperación" (para volverlo a "presentar" al usuario ó cerrarlo si fuera el caso).El siguiente paso es: "Agregar" el comando a algún menú (o submenú), "aprovechando" el evento Open delobjeto ThisWorkboook, agregando la siguiente línea: AgregarComando., que "hace referencia" a la siguientemacro:Macro para agregar el Comando "Especial"Public Sub AgregarComando() Se agrega un comando TEMPORAL en la posición # 8 del menú de "Archivo" y ... Set MiComando = CommandBars("File").Controls.Add _ (Type:=msoControlButton, Before:=8, Temporary:=True) With MiComando .BeginGroup = True .Style = msoButtonCaption .Caption = "Guardar &especial" .FaceId = 1 Lo mandamos ejecutar la macro de "GuardarEspecial" .OnAction = "GuardarEspecial" End WithFin del procedimientoEnd SubFinalmente (y sólo "por si las dudas"), al salir del libro eliminaremos este comando usando el eventoBefore_Close del objeto ThisWorkbook con la siguiente instrucción: If Application.CommandBars("File").Controls(8).Caption = "Guardar &especial" _ Then Application.CommandBars("File").Controls("Guardar &especial").Delete (True)NOMBRE Y POSICIÓN DE LOS OBJETOS.Generalmente se usan las propiedades Name ó Index (posición) para "referirnos" por código a las hojas de unlibro, p.e.Worksheets("Resumen")Worksheets(3)Si el usuario "modifica" estas propiedades (cambiando nombre o posición), el código fallará lanzando "eltemido" mensaje de: "Subíndice fuera del intervalo", ó estaremos "afectando" a la hoja que "quedó" en laposición #3 y "creíamos" que era... "la que estaba antes???".Para efectos "prácticos", es mejor el uso de la propiedad "Name", inclusive puedes "regresar" la hoja a sunombre "original" en algún evento (como Worksheet_Deactivate) con una línea como la siguiente:If Hoja3.Name <> "Resumen" Then Hoja3.Name = "Resumen"Habrás notado que se utiliza Hoja3.Name. Hoja3 es el nombre-código (propiedad CodeName) que cada objetotiene en el proyecto de VBA (en este caso "verías" en la ventana de exploración del proyecto, un objetoWorksheet como - Hoja3 (Resumen) y en la ventana de propiedades, las propiedades: (Name) = Hoja3 yName = Resumen.Pues bien, la propiedad CodeName es aún más "conveniente" que la "simple" propiedad "Name" para el casode "asegurarnos" que no afecte al código si el usuario cambia las propiedades "Name" e "Index" de los objetossobre los que necesitamos un "control total".
  25. 25. PROTECCIONES "ADICIONALES" PARA "CELDAS ESPECIALES".Si ya has usado Herramientas | Proteger | Proteger hoja... y/o Proteger libro..., te habrás dado cuenta de que"se debe quitar" la protección cuando necesitas hacer modificaciones por código a las hojas "protegidas" poreste comando.Otra manera de "evitar" que el usuario modifique "celdas importantes" es (aprovechando nuevamente loseventos y código), "detectar" si el usuario selecciona alguna de esas celdas y "pedirle una clave" (para"permitirle estar ahí" ó "remitirlo" a otra celda). El siguiente código en el evento SelectionChange de un objetoWorksheet le pedirá esa clave al usuario si selecciona alguna de las celdas que se indiquen como"especiales":Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Permiso As String Select Case Target.Address Si el usuario selecciona "B6" ó "B18"... Case Range("B6").Address, Range("B18").Address Se le "pide" una clave. Permiso = InputBox("¿Cuál es tu clave?") Si la clave es "incorrecta" lo "mandamos" arriba. (Podrías "avisarle" que... ¡ NO es la clave K !!!) If Permiso <> "Hocus Pocus" Then Target.Offset(-1, 0).Select End SelectEnd SubIMPEDIR QUE EL USUARIO UTILICE "ALGUNOS" COMANDOS.Habrá ocasiones en las cuales "quisieras" que el usuario no pueda "copiar | cortar | pegar" datos "de" ni "a"ciertas celdas, hojas o libros. 1. - Una manera sería "inhabilitar" el modo "Cortar/Copiar" de la aplicación ("imperceptible" para el usuario), usando algún evento (SelectionChange, Activate, Deactivate) de los objetos Worksheet ó Workbook con la siguiente línea: 2. Application.CutCopyMode = False para "simular" el efecto de presionar {Esc} ("al momento de" copiar ó cortar) "cancelando" de la memoria el contenido del "porta-papeles". 3. - Otra manera sería "inhabilitar" los "atajos de teclado" como {Ctrl}+C, {Ctrl}+X, {Ctrl}+V utilizando para ello el método OnKey del objeto Application en cualquiera (o varios) de los eventos mencionados en el párrafo anterior.La sintaxis del método es:Application.OnKey "Tecla", "Procedimiento"Donde: argumento Tecla es la tecla (o combinación de teclas) que al ser presionada(s) "ejecutará(n)" la macroespecificada por el argumento Procedimiento. Si se omite el procedimiento, la(s) tecla(s) "vuelve(n)" a suacción natural.Por ejemplo, para impedir que se usen esas combinaciones de teclado en una hoja en específico, lossiguientes códigos "trabajan" bien:Cuando el usuario "activa" la hoja (con el código)...Private Sub Worksheet_Activate() Los "atajos de teclado" {Ctrl}+C, {Ctrl}+X, {Ctrl}+V
  26. 26. para "copiar", "cortar" y "pegar" quedan "inhabilitados" puesto que se especifica un argumento "vacío" para "la macro". Application.OnKey "^c", "" Application.OnKey "^x", "" Application.OnKey "^v", ""End SubCuando el usuario "des-activa" la hoja (con el código)...Private Sub Worksheet_Deactivate() Los "atajos de teclado" {Ctrl}+C, {Ctrl}+X, {Ctrl}+V para "copiar", "cortar" y "pegar" quedan "re-habilitados" Application.OnKey "^c" Application.OnKey "^x" Application.OnKey "^v"End SubNota: El método OnKey (usado de la manera anterior) NO IMPIDE el uso de los comandos (por menús o botones) para efectuar las mismas acciones de "copiar", "cortar" y "pegar".Si quieres "impedir" que se usen "también" comandos "integrados" de Excel, entonces...OPCIONES "AVANZADAS" PARA TRABAJAR CON MENÚS Y COMANDOS"Asegurar" un control de los comandos (sean barras de menús y/o herramientas) implica "averiguar" que tantose han personalizado en el "entorno" de cada usuario. Considerando que los menús pueden contenersubmenús y éstos a su vez más submenús se debe desarrollar una macro que pueda "ir descendiendo" a todoslos niveles de todos los elementos existentes. Una vez "detectados" los comandos "objetivo", una propiedad(Enabled o Visible) habrá de permitir (o no) su uso.Utilizaremos las siguientes variables Públicas:Declaramos las variables del tipo "necesario"...Public Barra As CommandBar, _ Comando As CommandBarControl, _ Contenedor As CommandBarControl, _ Siguiente As IntegerEn los siguientes procedimientos | funciones:Macro para "Des-Habilitar" comandosPrivate Sub DesHabilitarComandos() Por si existiera algún error On Error Resume Next Para buscar en TODAS las barras (Herramientas ó Menús) For Each Barra In Application.CommandBars Para buscar en TODOS los controles (Comandos ó Submenús) For Each Comando In Barra.Controls Inicia un "bucle" de búsqueda (a través de una función "recursiva") Siguiente = AtenuarProhibidos(Comando) "Busca" en el siguiente botón Next Comando "Busca" en la siguiente Barra de Comandos Next BarraFin del procedimientoEnd SubFunción "recursiva" para "bajar" por los menúsPrivate Function AtenuarProhibidos(Comando As CommandBarControl) As Integer
  27. 27. Por si existiera algún error On Error Resume Next "Inicializa" la variable del bucle Siguiente = 0 Para "afectar" sólo a Comandos ó Menús Select Case Comando.Type Case 1, 2, 4, 6, 7, 13, 18 Si es un botón de comando... Select Case Comando.ID "Ver" cuál es Case 19, 21, 22 Si es "copiar", "cortar" ó "pegar" Comando.Enabled = False Lo "DES-HABILITA" End Select Case Else Si es un Menú (ó Submenú) ... seguir buscando "más abajo" For Each Contenedor In Comando.Controls ... haciendo una "Re-Llamada" de la función Siguiente = Siguiente + AtenuarProhibidos(Contenedor) Next Contenedor (continuar con el "bucle") Siguiente = Siguiente - 1 (regresar al bucle en el mismo control) End Select y ... continuar "la llamada" a la función con "el siguiente" AtenuarProhibidos = Siguiente + 1Fin de la funciónEnd FunctionAunque es posible que este procedimiento sea "auto-alternante" (podría cambiarse en la función la sentencia:Comando.Enabled = Falsepor una que "auto-invierta" el estado del botón +/- así:If Comando.Enabled = True Then Comando.Enabled = False Else Comando.Enabled = Truepara un control "más estable" es mejor "definir" procedimientos "separados" (uno para inhabilitar y otro para re-habilitar los botones de comando). Dejo a tu criterio "la contra-parte".Complementariamente (y para NO "perjudicar" la interacción con el usuario) puedes usar los eventosWindowActivate y WindowDeactivate del objeto ThisWorkbook para que, los comandos quedeninhabilitados "solamente" cuando la ventana "activa" sea "el libro".Private Sub Workbook_WindowActivate(ByVal Wn As Window) DesHabilitarComandosEnd SubPrivate Sub Workbook_WindowDeactivate(ByVal Wn As Window) ReHabilitarComandosEnd SubPuedes incluir además en los procedimientos, las opciones del usuario para "personalizar" las barras de menúsy herramientas para que "sufran" el mismo efecto que lo botones. De esta manera, podrá agregar más barras(con los botones y menús que "no funcionan") siempre y cuando la ventana "activa" sea "otro libro", pero... al"regresar" a nuestro libro... ¡dejarán de "funcionar" también!!!Para mayor información acerca de las "IDs" (ó nombres) de otros comandos y menús que pudieras considerarcomo "necesarios" de inhabilitar para protección de tu trabajo, visita la página:http://support.microsoft.com/support/kb/articles/Q213/5/52.ASPOtra acción "conveniente" de controlar es el uso del comando "especial" de guardar, para lo cual puedesaprovechar los mismos eventos WindowActivate para "permitir su uso sólo en el libro" con la línea:Application.CommandBars("File").Controls("Guardar &especial").Visible = Truey el evento WindowDeactivate para "inhabilitar" su uso "fuera del libro" con otra línea "inversa" como:Application.CommandBars("File").Controls("Guardar &especial").Visible = FalseBueno... dejemos de momento tanta "palabrería", y pasemos a un...
  28. 28. CASO "PRÁCTICO" DE LA COMBINACIÓN DE ALGUNOS TRUCOSEl archivo "descargable" (al final de este artículo) contiene algunos ejemplos de cómo proteger (por código) loslibros de Excel. Te explico "brevemente" como funciona y cuales son las condiciones, contraseñas y "opciones"consideradas. 1. Condiciones A. Con las macros "habilitadas" y los eventos "operables", el libro se abrirá "sin problemas" si se cumple cualquiera de las dos primeras condiciones siguientes: I. Que el directorio donde se encuentra sea: "C:Mis documentos" o... II. Que el directorio "alterno" sea: "D:Personales..." (el que yo utilicé). (Obviamente puedes definir tus propias condiciones como se explicó antes.) III. O, si se abre desde otro directorio, avisará que las condiciones de operación no se cumplen y sugerirá "No Continuar" (aunque da la opción de "seguir adelante", se abrirá en modo de "sólo lectura", y... NO "se puede" guardar). B. Si las macros NO están "habilitadas" (por elección o nivel alto de protección), o se "abre por código" pero los eventos NO están "operables" (Open, Change, etc.), el libro se abrirá, pero estará OCULTO y con Contraseña. Una vez abierto el libro "sin problemas", solo puede grabarse a través del comando que se agrega automáticamente ("Guardar especial" en el menú "Archivo"), de esta manera (aún cuando la PC "-???-...¡se apagó!!!") siempre queda "bien" guardado.
  29. 29. 2. Contraseñas (Recuerda lo de mayúsculas, minúsculas, acentos y/o signos) A. Para el libro y la hoja "Protegida", la contraseña es: «Contraseña (el signo « es la combinación de teclas {Alt}+174). B. Para el proyecto de macros (VBA) es: «Contrase«Ñ«a (mismo signo). C. En la hoja "Protegida", algunas de las celdas "libres" requieren de un "Permiso especial" (con un formulario). La clave: Abrete Sésamo D. Existe una hoja oculta en el libro (podrías manejar ahí datos "Ultra-Secretos") que SOLO puede mostrarse mediante una imagen (con macro) en la hoja "Normal" y también requiere de un "Permiso especial". La clave: Abracadabra.
  30. 30. 3. Como protección adicional, todos los códigos son Privados (no se pueden ver en la "lista de macros" menú Herramientas | Macro | Macros ó teclas {Alt}+{F8}. El método OnTime "monitorea" que los Eventos "permanezcan activos", por si a algún "vivillo" se le ocurriera des-habilitarlos para "ver como funciona". Puedes eliminar éste método si te resulta "engorroso" ver un ligero parpadeo del cursor cada 20 segundos (ó el tiempo que determines) ó si lo consideras no necesario. Sólo "asegúrate" de hacerlo "correctamente". 4. La estructura de códigos es "modulada" (y en orden de aparición) para que se puedan usar "interactivamente" y son "funcionales" (si los ejecutas desde la ventana del VBE). Cada línea está "comentada" para que sea entendible y clara su intención. Espero que no tengas problemas para entenderlo. 5. Nota 1.- Cuando la ventana activa es este libro, TODOS los comandos "peligrosos" se des-habilitan (se restablecen cuando el libro deja de ser la ventana activa). Nota 2.- Si creas nuevas barras con comandos "prohibidos" (o los agregas a las ya existentes), de cualquier forma al activar de nuevo la ventana del libro se des-habilitarán. 6. La lista que consideré como comandos "peligrosos" es la siguiente (puede modificarse a tu criterio): En el menú (o Sub-menú) Estos comandos SE INHIBEN DE TODAS LAS BARRAS "Edición"... Eliminar hoja; Copiar o mover hoja "Edición"... "Eliminar"... Eliminar (celdas); Eliminar filas; Eliminar columnas "Formato"... Formato de celdas (por la pestaña de "protección") "Formato"... "Hoja"... Cambiar nombre; Ocultar; Mostrar "Herramientas"... Ver Nota 2 Personalizar (por si creas barras con "más prohibidos") "Herramientas"... "Proteger"... Proteger hoja; Proteger libro; Proteger y compartir "Datos"... Ordenar; Validación "Ventana"... Ocultar; Mostrar La lista de barras "Toolbar List" (por aquello del comando "Personalizar") 7. Visita la página de Microsoft indicada anteriormente para ver una lista de otros comandos que pudieras considerar como "peligrosos". 8. Saludos cordiales, y espero "haber sido de utilidad" para tus propósitos. 9. Héctor Miguel Orozco Díaz. hemiordi@hotmail.com 10. 11. Descargar el archivo Proteger.zip que contiene el archivo Proteger.xls con todo el código mostrado en este artículo. 12. 13. Nota de Mauricio: Les agradeceria mucho a mis visitantes y como agradecimiento por el gran trabajo de Héctor, le notificaran a su correo, de cualquier error, duda, mejora, observación o comentario en relación con el presente artículo, GRACIAS Héctor...Variables y objetos, ¿como nombrarlos? • Supongamos una sencilla macro como la siguiente • Option Explicit • • Public Sub Preguntas() • Dim Nombre As String • Dim Edad As Integer • • Nombre = InputBox("¿Cuál es tu nombre?") • Edad = InputBox("¿Cuantos años tienes?") • • MsgBox "Hola " & Nombre & " tienes " & Edad & " años" • • End Sub • Public Sub Preguntas1() • Dim Coche As String • Dim Sol As Integer
  31. 31. • • Coche = InputBox("¿Cuál es tu nombre?") • Sol = InputBox("¿Cuantos años tienes?") • • MsgBox "Hola " & Coche & " tienes " & Sol & " años" • • End Sub • •Descargar el código de este artículo.Grabando mi primer macro en ExcelTe sugiero que primero realices los pasos que menciono aquí y después, con toda libertad y confianza haztodas las pruebas que consideres pertinentes o Entra a Excel o Ve al menú Herramientas | Macro | Grabar nueva macro... o Te saldrá el siguiente cuadro de dialogo... Los datos que hay que introducir son: Nombre de la macro Con este nombre identificaremos a la macro, con este la podemos "ejecutar" y "llamar" desde otras macros, por default te saldrá Macro1 la primera vez y, si no cambias este nombre, a las sucesivas macros las ira nombrando Macro2, Macro3, Macron, etc, propongo que se llame Mi_Primer_Macro , las recomendaciones son: usa un nombre corto, pero suficientemente claro en relación con la tarea o tareas que hará la macro, NO uses espacios, por ejemplo, si tienes una macro que realiza un reporte, podrías llamarla: 1. hacerreporte 2. HACERREPORTE 3. hacer_reporte 4. HACER_REPORTE
  32. 32. 5. Hacer_Reporte 6. HacerReporte Comúnmente, y lo veraz en estas páginas, uso la opción 5 o 6 pues me parecen mas claras de leer, pero no te detengas en hacer uso de tu libre derecho de usar el que te de la gana. Método abreviado Si sabes para que nos sirve Ctrl + C o Alt + F4 , entonces ya sabes para que es esta opción, así es, bien pensado, sirve para relacionar una combinación de teclas con la macro que estamos grabando y ejecutarla con solo presionar estas teclas, en lo personal no lo uso, pues ya tengo bastante con las decenas de métodos abreviados que tiene Windows, prefiero "asignarlas" a un botón o un menú (te enseñare a hacer esto), pero estas en todo tu derecho de usarla si así lo deseas. Guardar macro en Toda la información ocupa un lugar, verdad?, pues las macros son información y ocupan lugar y hay que guardarlas en algún lado, este lado, son los archivos de Excel, es decir, "dentro" del archivo, se guardan las instrucciones en un lugar especial que se llama modulo , que aprenderemos a dominar, si observas la imagen, tenemos un Cuadro de lista desplegable o ComboBox (así se llama este "objeto") que tiene tres opciones: Libro de macros personal, Libro nuevo y Este libro, como veras, los tres son libros o sea, archivos de Excel, las macros de Excel solo pueden estar dentro de archivos de Excel. Para nuestro ejemplo escogeremos Este libro. Descripción Creo que el nombre es bastante "descriptivo", aquí puedes poner toda la información que consideres conveniente acerca de tu macro, su función más útil, es comentar brevemente cual es el propósito de nuestra macro, algunos ponen la fecha y el nombre del autor.o Damos un clic en el Botón de Comando (CommandButton) ACEPTAR , a partir de este momento, casi cualquier acción, lo repito, casi cualquier acción que realices sobre la ventana de Excel, se grabará en nuestra macro, por eso las recomendaciones antes de grabar una macro son: 1. Planea lo que hara tu macro, las correcciones que hagas, también se grabaran. 2. Casi nunca una macro queda a la primera, no importa que repitas de nuevo los pasos, pero hazla bien, cuando aprendas a editarlas, veremos como quitar lo que no sirve. 3. Procura no grabar demasiadas instrucciones, es mejor grabar pequeñas macros y después llamarlas desde otras o entre si, esto, ya veremos como se hace.o Realiza los siguientes pasos tal cual... R Selecciona la celda A1 S Escribe "Esta es mi primer macro" (o lo que gustes). E Presiona Enter, si tu selección se movió abajo (normalmente), entonces vuelve a seleccionar la celda A1 c Dale formato de Negritas , Cursiva , cambia el tamaño de la fuente, el estilo de la fuente y por ultimo el color de la fuente d Al final se tiene que ver algo muy parecido a esto:
  33. 33. o ο Da un clic en el botón Detener grabación , este botón (que aparece en la imagen de arriba) se encuentra dentro de la barra de herramientas Detener Grabación, esta barra se visualiza (o deberia de aparecer) en cuanto empiezas a grabar una macro, si no la vez, ve al menú Ver | Barra de Herramientas y activa la barra Detener Grabación o si lo prefieres, en el menú Herramientas | Macro veraz, en vez de Grabar Macro , la opción Detener Grabación , esto solo cuando tienes activada la grabadora de macros. ο Ahora, probemos la macro, borra o mejor, elimina la celda donde escribiste el texto Esta es mi primer macro, en nuestro ejemplo, se trata de la celda A1. ο Ve al menú Herramientas | Macro | Macros... o presiona el método abreviado de teclado Alt + F8 , por cualquiera de estos dos métodos, te saldrá el siguiente cuadro de dialogo. La imagen lo dice todo, tendras una lista de las macros que esten disponibles en los libros (archivos de Excel) abiertos, es decir, para que puedas ejecutar una macro, el libro que la contiene debe estar
  34. 34. abierto. Este cuadro de dialogo tiene más opciones que el anterior, así que las que no se vean aquí, tedejo de "tareita" investigues para que sirven. ο Selecciona la macro que acabamos de grabar, si no le cambiaste el nombre debe decir Macro1 , si usaste el propuesto será Mi_Primer_Macro o en su defecto el que hayas escogido, si tienes más libros abiertos que tengan macros, aquí las veraz (no todas, ya te explicare por que), da un clic en el Boton de Comando (CommandButton) EJECUTAR . ο ¿Que pasó?, se ve bonito no?, ahora, con un solo paso, hacemos varias instrucciones de Excel, si fue así?, bien, ahora ya tenemos el 0.01 % de lo necesario para dominar las macros y no te estoy desanimando, al contrario, pretendo, con estas páginas, subir un poco mi 5% de dominio y también pretendo, que lo hagamos juntos, si estas de acuerdo sigue leyendo y sino también sigue leyendo. ο Este es un buen momento para guardar tu archivo, propongo que se llame Mis macros , pero, como antes, puedes usar el nombre que gustes ¿como podría impedírtelo?. ο Ahora van las preguntas, lo siento pero te tendrás que acostumbrar a ellas, aun cuando veas que trato a detalle los temas, no es así, por que el tema es bastante extenso y muchas cosas las tendrás que buscar, descubrir y mejor aun, razonar por tu cuenta. l ¿ Todo salió bien ? ¿ ¿ Que pasa si ahora pongo el cursor, o sea la selección en otra celda, por ejemplo la C15 y ejecuto la macro? e Prueba a grabar otra macro, pero activa el botón que aparece al lado del Detener grabación y que se llama Referencia relativa y haz la prueba anterior, ¿que pasa ahora? q Si cambias de hoja en el libro ¿puedes ejecutar la macro? S Y si cambias de libro ¿aun la puedes ejecutar? Y Prueba a grabar una macro que cambie a otras ventanas fuera de Excel o abra otros programas ¿es posible? p Graba una macro un poco mas larga y ejecútala ¿que observas?, ¿como se ve la pantalla cuando se esta ejecutando? ο Tal vez pienses que son muchas preguntas para la primera vez, ya veraz que solito te saldrán mas, ahora mismo yo tengo más preguntas que respuestas, pero no importa, sigue siendo muy divertido crear y grabar macros. Cuando tengas contestadas las preguntas anteriores y cuando hagas las "tareitas" que propongo, entonces, pasamos al siguiente punto. ο Esto es más interesante, veamos las instrucciones que graba Excel a estas instrucciones se le conoce como código fuente , para esto ve la menú Herramientas | Macro | Macros... o presiona el método abreviado de teclado Alt + F8 y ya sabes que sale ¿verdad?, si, el cuadro de dialogo Macro , de nuevo, selecciona la primer macro que grabaste y que ejecutaste, pero ahora, en vez de ejecutarla, presiona el Botón de Comando (CommandButton) MODIFICAR . Esta acción abrirá una nueva ventana (la notaras en la barra de tareas de Windows) y nos llevara a una ventana que tal vez nunca has visto, esta ventana se llama Microsoft Visual Basic y es una nueva aplicación, un programa, correctamente es un Editor, un Editor del lenguaje Visual Basic para crear nuestras macros, también puedes abrir esta ventana desde el menú Herramientas | Macro | Editor de Visual Basic o presiona el método abreviado de teclado Alt + F11 , este Editor tienes que dominarlo si quieres obtener más provecho de tus macros, más adelante veremos las partes principales de este Editor, por lo pronto y si grabaste la macro de ejemplo, veraz algo muy similar a la siguiente imagen.
  35. 35. Las ventanitas que están a la derecha de la imagen, tal vez las tengas a la izquierda en tu ventana,pero no importa, estas ventanas las puedes mover como la mayoría de las ventanas de Windows(desde la barra de titulo) y posicionar donde gustes, te recomiendo dejarlas como en la imagen dearriba, para que nos entendamos mejor. ο Te pongo el código aquí por si en la imagen no se ve bien, además de que le faltan unas líneas abajo. ο Sub Mi_Primer_Macro() ο ο Macro1 Macro ο Macro grabada el 09/01/2002 por Tecnico1 ο ο Range("A1").Select ο ActiveCell.FormulaR1C1 = "Esta es mi primer macro" ο Range("A1").Select ο Selection.Font.Bold = True ο Selection.Font.Italic = True ο With Selection.Font ο .Name = "Arial" ο .Size = 20
  36. 36. ο .Strikethrough = False ο .Superscript = False ο .Subscript = False ο .OutlineFont = False ο .Shadow = False ο .Underline = xlUnderlineStyleNone ο .ColorIndex = xlAutomatic ο End With ο With Selection.Font ο .Name = "Comic Sans MS" ο .Size = 20 ο .Strikethrough = False ο .Superscript = False ο .Subscript = False ο .OutlineFont = False ο .Shadow = False ο .Underline = xlUnderlineStyleNone ο .ColorIndex = xlAutomatic ο End With ο Selection.Font.ColorIndex = 5 ο End SubYa la viste bien, ¿verdad que hay líneas repetidas?, ¿porque crees que sea esto?, observa muy bienlos colores, nos dicen mucho, pero lo primero que te enseñare de los colores es que las líneas queestán en verde no se "ejecutan" , esto quiere decir, que el VBA se las salta olímpicamente, las ignoracompletamente, esas líneas verdes se llama comentarios y sirven para documentar nuestras macrospara poner notas acerca del propósito o funcionamiento del código, algo muy importante, pues despuésde algunos cientos de líneas, ya ni sabes donde vas o para que servía determinada línea, por ejemplo,observa la primer línea después de la ultima verde, si quisiéramos comentarla, o sea, establecerla demodo que no se "ejecute", tenemos dos formas, agregando una comilla simple a la izquierda de la líneao escribiendo, también a la izquierda la palabra REM, me parece más fácil la comilla ¿no crees?.Sub Mi_Primer_Macro() Macro1 Macro Macro grabada el 09/01/2002 por Tecnico1 Range("A1").Select Range("A1").Select Rem Range("A1").SelectAhora que sabes como se comentan las líneas para que el VBA no las ejecute, te recomiendo quecuando estés probando código, no lo borres, mejor solo comenta la línea, pues algunas veces pasaque regresamos a la línea original y si la borramos en ocasiones ya no sabemos como iba, así que tepregunto, ¿que líneas de este código fuente, se podrían comentar, de modo que no se ejecuten, peroque la macro siga haciendo lo mismo?... muy bien, podría quedar así...Sub Mi_Primer_Macro() Macro grabada el 09/01/2002 por Tecnico1 Range("A1").Select ActiveCell.FormulaR1C1 = "Esta es mi primer macro" Range("A1").Select Selection.Font.Bold = True Selection.Font.Italic = True With Selection.Font
  37. 37. .Name = "Arial" .Size = 20 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With With Selection.Font .Name = "Comic Sans MS" .Size = 20 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.Font.ColorIndex = 5End SubPero todavía se puede mejorar más, prueba a comentar las líneas que terminen en la palabra Falsepara que nuestro código quede así:Sub Mi_Primer_Macro() Macro grabada el 09/01/2002 por Tecnico1 Range("A1").Select ActiveCell.FormulaR1C1 = "Esta es mi primer macro" Range("A1").Select Selection.Font.Bold = True Selection.Font.Italic = True With Selection.Font .Name = "Arial" .Size = 20 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With With Selection.Font .Name = "Comic Sans MS" .Size = 20 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.Font.ColorIndex = 5End Sub
  38. 38. Sigue haciendo lo mismo la macro?, si?, pues entonces vamos bien, con esto te darás cuenta que, lamayoría de las veces, la grabadora de macro nos escribe mucha "basura", es decir, código de más,código innecesario para nuestra macro, lo complicado es saber que quitar y que no, incluso queagregar y que no, ojalá que con todos los ejemplo que haya aquí, te sea más leve esta tarea. Porultimo, te escribiré una segunda versión de esta macro, la llamaremos Mi_Primer_Macro2 , regla, nopuede tener dos macros en el mismo modulo de código, que tengan el mismo nombre , no loolvides, esta segunda versión, esta basada completamente en la original, tu "tareita" es decirme cualesson las diferencias, claro, aparte del número de líneas, hice lagunas "trampitas", observa las primeraslíneas, observa las líneas que se quitaron y las que se modificaron, las que se movieron y las que sedejaron tal cual, ¿de acuerdo?...Sub Mi_Primer_Macro2() Macro modificada por mi ActiveCell.FormulaR1C1 = "Esta es mi primer macro, claro, con algunos cambios" With Selection.Font .Bold = True .Italic = True .Name = "Comic Sans MS" .Size = 20 .ColorIndex = 5 End WithEnd SubSe me pasaba comentarte que puedes hacer todas las macros que quieras dentro de un mismomodulo, lo único que tienes que hacer es procurar separarlas por una línea, como se que eresobservador, habrás notado que todas las macros empiezan con Sub y terminan con End Sub , pues asíson las macros, por ejemplo, podrías tener esto:Sub CopiarDatos() Aqui va el código de esta macroEnd SubSub HacerReporte() Aqui va el código de esta macroEnd SubSub HacerGrafico() Aqui va el código de esta macroEnd Sub ο Ahora hagamos algo muy interesante, grabaremos nuestra segunda macro, pero con una pequeña variante, iremos viendo como es que Excel, va grabando las instrucciones dentro de un modulo en el Editor de Visual Basic, para lograrlo abramos el Editor de Visual Basic, ya sabes como ¿verdad?, redimensiona y manipula las ventanas, tanto de Excel como del Editor, para que ocupen, aproximadamente la mitad de la pantalla cada una, cuida , que la pantalla de Excel quede en primer plano y en segundo plano el Editor de Visual Basic, cuidado , si en la ventana del Editor, no esta visible el MODULO donde se están grabando las macros no veraz nada, tienes que poner el cursor dentro del modulo actual para que veas la grabación, para que no haya duda, ve la siguiente imagen:
  39. 39. Observa como Excel esta en primer plano y el Editor en segundo plano, si estas en la misma sesión de trabajo, donde grabaste Mi_Primer_Macro , entonces solo deja el cursor dentro del modulo donde está, esta macro, si estas usando otra sesión de trabajo, te grabara esta segunda macro, dentro de un segundo modulo y tal vez no lo veas, en resumen, el modulo visible debe ser el actual, donde veas que Excel esta grabando actualmente tus macros.Descargar el código de este artículo.Escribiendo mi primer macro en ExcelEsta vez no usaremos la grabadora de macros, esta vez escribiremos nuestra propia macro desde cero, paraeste tema, considero que ya sabes entrar al EditorVBA y que ya sabes ejecutar cualquier macro, ¿estas listo?... o Entramos a Excel o Aquí podemos usar un nuevo libro o si lo prefieres abre tu libro de pruebas favorito. o Entra el Editor de Visual Basic Alt + F11 . o Puedes usar, si ya lo tienes, un modulo existente, o mejor aun, agregamos uno, esto lo hacemos desde el menú Insertar | Modulo , nuestro Explorador de Proyectos se tiene que ver así.
  40. 40. o El cursor de escritura debe de quedar dentro de la ventana de código, observa que estoy usando el mismo archivo que hice en el tema anterior Grabando mi primer macro, pero reitero, puedes usar cualquier otro que gustes, observa la barra de título, observa si tengo alguna nueva barra de herramientas, observa la Ventana de Propiedades, en fin, observa lo más que puedas.o El siguiente paso es importante, ¿qué hará nuestra macro?, bueno, realmente al entrar al EditorVBA ya "deberíamos" de haber tenidos resuelta esta cuestión, pero debes de recordar que esta es la primera y más importante pregunta que debemos hacernos, cuando empecemos a crear una macro, para nuestro ejemplo, como estamos considerando que será nuestra primera macro, tendremos que escoger algo sencillo, se me ocurre hacer una macro que nos solicite nuestro nombre y el nombre de algún mes, después solicitaremos los importes de algunos conceptos "predefinidos" como: transporte, alimentos, diversión, por ultimo sumar estos importes, entonces, los pasos que hará nuestra macro son:  Solicitar nuestro nombre  Escribirlo en una celda  Solicitar el nombre de algún mes  Escribirlo en alguna celda  Solicitar un importe para el gasto de Transporte  Escribirlo en alguna celda  Solicitar un importe para el gasto de Alimentos  Escribirlo en alguna celda  Solicitar un importe para el gasto de Diversión  Escribirlo en alguna celda  Introducir la formula que sume estos conceptoso Esto que acabamos de hacer es muy importante, siempre que te sea posible y repito, siempre, procura tratar de escribir la secuencia de pasos necesarios para lograr el proposito establecido, detras de esto, hay miles de líneas de teoría, así que puedes investigar los siguientes temas: Analisis de

×