Apunte de Excel Con VBA
Apunte de Excel Con VBA
Apunte de Excel Con VBA
Parte 1:
Caractersticas Generales
INTRODUCCIN Esencialmente la programacin de Excel se reduce a la manipulacin de objetos (mediante la escritura de instrucciones en un lenguaje que Excel puede entender), mediante el lenguaje VBA. VBA est pensado como un lenguaje de secuencia de comandos de aplicacin de Microsoft comn y ahora est incluido en las aplicaciones de Office 2000 (e incluso en aplicaciones de otros fabricantes). Por consiguiente, al dominar VBA usando Excel se podr entrar directamente en la escritura de macros para otros productos de Microsoft. Mejor an, se pueden generar soluciones completas que usan opciones a travs de varias aplicaciones.
3
INTRODUCCIN
EL NCLEO DE VBA Las acciones de VBA se realizan mediante la ejecucin del cdigo VBA.El cdigo VBA se escribe (o se graba) y se guarda en un mdulo VBA. Los mdulos se guardan en un libro de trabajo de Excel pero se editan o visualizan en el editor de Visual Basic. Un mdulo VBA se compone de procedimientos. Un procedimiento es bsicamente un cdigo de ordenador que realiza alguna accin sobre los objetos o con ellos. Sub Prueba() Sum= 1+1 MSGBox La respuesta es & Sum End Sub
5
EL NCLEO DE VBA Un mdulo VBA puede tener tambin procedimientos Function. Un procedimiento Function devuelve un solo valor. Se puede llamar una funcin desde otro procedimiento VBA o usar una frmula de hoja de clculo. Function AadirDos(arg1, arg2) AadirDos= arg1 + arg2 End Function VBA manipula los objetos contenidos en su aplicacin anfitriona (en este caso Excel).
EL NCLEO DE VBA Excel proporciona ms de 100 clases de objetos para manipular. Ejemplos de objetos son un libro de trabajo, una hoja de clculo, un rango de una hoja de clculo, un grfico y un rectngulo dibujado. Existen muchos ms objetos a nuestra disposicin y se pueden manipular mediante el uso de cdigo VBA. Las clases de objetos estn ordenados jerrquicamente. Los objetos pueden actuar como contenedores de otros objetos. Por ejemplo, Excel es un objeto llamado Applcation y contiene otros objetos como WorkBook y CommandBar. El objeto WoorkBook puede contener otros objetos como WorkSheet y Chart. Un objeto WoorkSheet puede contener objetos como Range, PivotTable y dems. Nos referimos al orden de estos objetos como modelo de objeto de Excel.
7
EL NCLEO DE VBA Objetos similares forman una coleccin. Por ejemplo, la coleccin WorkSheets est compuesta por todas las hojas de clculo de un libro concreto. La coleccin CommandBars est compuesta por todos los objetos CommandBar. Las colecciones son objetos en s mismas. Cuando nos referimos a un objeto contenido o miembro, estamos especificando su posicin en la jerarqua del objeto, usando un punto como seprador entre el contenedor y el miembro. Application.WorkBooks(Libro1.xls) Esto se refiere al libro de trabajo Libro1.xls en la coleccin WorkBooks.
8
EL NCLEO DE VBA Nos podemos referir a la Hoja1 del Libro1 como Application.WorkBooks(Libro1.xls).WorkSheets(Hoja1) Si se quiere omitir una referencia especfica a un objeto, Excel usa los objetos activos.Si el libro1 es el libro de trabajo activo, la referencia anterior se puede simplificar a WorkSheets(Hoja1).Range(A1) Si se sabe que la Hoja1 es la hoja activa, se puede incluso simplificar ms Range(A1)
9
EL NCLEO DE VBA Los objetos tienen propiedades. Se puede pensar en una propiedad como en una configuracin para un objeto. Por ejemplo, un objeto Range tiene propiedades como Value y Name. Un objeto Chart tiene propiedades como HasTitle y Type. Se puede usar VBA para determinar las propiedades del objeto y tambin para cambiarlas. Nos podemos referir a propiedades para combinar el objeto con su propiedad, separados por punto. Por ejemplo nos podemos referir al valor de la celda A1 de la Hoja1 como WorkSheets(Hoja1).Range(A1).Value
10
EL NCLEO DE VBA Se pueden asignar valores a variables de VBA.Para asignar un valor en la celda A1 de la Hoja1 a una variables llamada Inters, use la siguiente instruccin VBA: Inters = WorkSheets(Hoja1).Range(A1).Value Los objetos disponen de mtodos.Un mtodo es una accin que se realiza con el objeto. Por ejemplo, uno de los mtodos para el objeto Range es ClearContents. Este mtodo borra el contenido del mtodo. Se pueden especificar mtodos mediante la combinacin del objeto con el mtodo, separados por punto. Range (A1).ClearContents VBA tambin incluye todas las estructuras de lenguajes de programacin modernos, como matrices, bucles y de ms.
11
Para activar el editor de Visual Basic puede usar alguna delas siguientes tcnicas: Presionar ALT+F11 Seleccionar HERRAMIENTAS MACRO EDITOR DE VISUAL BASIC Hace clic sobre el botn Editor de Visual Basic, sitiado en la barra de herramientas de Visual Basic
12
13
VENTANAS DEL EDITOR DE VISUAL BASIC El Editor de Visual Basic est compuesto de varias ventanas partes :
Barra de mens Barras de herramientas Ventana Explorador de proyectos. Presenta un diagrama de rbol que contiene cada libro de trabajo que est actualmente abierto en Excel. Cada libro de trabajo es un proyecto. Si esta ventana no esta abierta hay que presionar Control+R. Para esconder la ventana, hay que hacer clic en el botn Cerrar de su narra de ttulo. Ventana cdigo. Una ventana de cdigo, o ventana de mdulo, contiene un cdigo VBA. Cada elemento de un proyecto tiene asociada una ventana de cdigo. Para visualizar una ventana de cdigo para un objeto, hay que hacer doble clic sobre el objeto en la ventana del Explorador de proyectos. Ventana inmediato. Esta ventana es til para ejecutar instrucciones de VBA directamente, probar las instrucciones y limpiar el cdigo. Para abrir esta ventana presione Control+G, para ocultarla basta hacer clic sobre el botn Cerrar de su barra de ttulo.
14
AADIR UN NUEVO MDULO DE VBA Para aadir un nuevo mdulo de VBA a n proyecto, hay que seleccionar el nombre del proyecto en la ventana Explorador de proyectos y seleccionar INSERTAR MODULO. Cuando se graba una macro, Excel inserta automticamente un mdulo VBA para contener el cdigo grabado. QUITAR UN MDULO VBA Hay que seleccionar el nombre del mdulo en la ventana del Explorador de proyectos y elegir ARCHIVO QUITAR.
15
GUARDAR UN CDIGO VBA En general una ventana de cdigo puede soportar cuatro tipos de cdigo: Procedimientos Sub. Conjuntos de instrucciones que ejecutan alguna accin. Procedimientos Function. Es un conjunto de instrucciones que devuelven un solo valor. Procedimientos Property. Son procedimientos especiales que se usan en mdulos de clase. Declaraciones. Es informacin acerca de una variable que se le proporciona aVBA. Un solo mdulo de VBA puede guardar cualquier cantidad de procedimientos Sub, procedimientos Function y declaraciones.
16
INTRODUCIR UN CDIGO VBA Sub Hola() Msg = Su nombre es &Application.UserName & ? Ans = MsgBox(Msg, vbYesNo) If Ans = VbNo Then MsgBox No se preocupe Else MsgBox Debo ser clarividente! End If End Sub
17
18
EJECUTAR UN CDIGO VBA Para ejecutar el procedimiento Hola es necesario asegurarse que el cursor est situado en cualquier parte del texto introducido. Despus se puede optar por uno de los siguientes mtodos: Presionar F5 Seleccionar Ejecutar, Ejecutar Sub/UserForm Hacer clic sobre el botn Ejecutar, Ejecutar Sub/UserForm
19
USAR EL GRABADOR DE MACROS El siguiente ejemplo muestra la forma de grabar una macro que simplemente cambia la configuracin de pgina de orientacin vertical a horizontal. 1) Activar una hoja de clculo del libro activo 2) Seleccionar el comando HERRAMIENTAS MACRO GRABAR NUEVA MACRO 3) Hacer cli en Aceptar para aceptar las opciones predeterminadas 4) Seleccionar el comando ARCHIVO CONFIGURAR PGINA 5) Seleccione la opcin Horizontal y haga clic en Aceptar 6) Haga clic en el botn detener grabacin
20
10
Sub Macro1() (Ejemplo parte ' Macro1 Macro ' Macro grabada el 15/11/00 por PRI00 ' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "" .RightHeader = "" .LeftFooter = "" .CenterFooter = "" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0)
1)
.BottomMargin = Application.InchesToPoints(0) .HeaderMargin = Application.InchesToPoints(0) .FooterMargin = Application.InchesToPoints(0) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = -4 .CenterHorizontally = False .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 100 End With End Sub
(Ejemplo parte 2)
22
11
A menudo el cdigo producido cuando se graba una macro es excesivo. La macro anterior se puede simplificar a : Sub Macro1() ' Macro1 Macro ' Macro grabada el 15/11/00 por PRI00 With ActiveSheet.PageSetup .Orientation = xlLandscape End With End Sub
23
12
La opcin colores del cdigo permite establecer el color del texto (de primer plano o de fondo), as como el color del indicador desplegado para varios elementos de cdigo VBA. La opcin fuente permite seleccionar la fuente que se va usar en los mdulos de 25 VBA
La ficha General
En general las opciones predeterminadas suelen ser muy tiles.
26
13
Las configuraciones de esta ficha determinan el comportamiento de las diversas ventanas en el Editor de VB. Cuando una ventana est acoplada, se fija en un lugar a lo largo de los bordes de la ventana del VBE. Esto facilita la identificacin y localizacin de una ventana en particular. Generalmente las configuraciones 27 predeterminadas funcionan bien.
28
14
Parte 2:
Variables, Constantes, Expresiones y Tipos de Datos
29
30
15
Bytes usados
Rango de valores
1 0 a 255 2 Verdadero o Falso 2 -32.768 hasta 32.767 -2.147.483.648 hasta 4 2.147.483.647 -3.402823E38 a -1.401298E-4545 (para valores negativos) y 1.4012298E-45 a 3.42823E38 4 (para valores positivos) 8 8 Del 1 Enero, 0100 hasta 31 de 8 diciembre, 9999 4
Single Double Currency Date Object String (de longitud variable) String (de longitud fija)
31
Incluye instrucciones Dim, Static o Private dentro del procedimiento. Incluye una instruccin Dim antes del Al nivel de mdulo primer procedimiento de un mdulo. Incluye una instruccin Public antes del Todos los mdulos primer procedimiento de un mdulo. Un procedimiento
Variables locales
Una variable local es una variable declarada dentro de un procedimiento. Estas variables se pueden usar slo en el procedimiento en que se declararon. Cuando el procedimiento finliza, la variable deja de existir y Excel libera su memoria.
32
16
Variables locales
La manera ms comn de declarar una variable local es situarla dentro de una instruccin DIM. Sub MiSub() DIM x As Integer DIM First As Long DIM InerestRate As Single DIM TodaysDate As Date DIM UserName As String * 20 Aqu se sita el cdigo del procedimiento End Sub Esto tambin es vlido: DIM x As Integer, y As Integer, z As Integer Esto no es vlido: DIM x, y, z As Integer
33
Variables Public
Para que una variable est disponible para todos los procedimientos de un proyecto de Vba, se declara la variable a nivel de mdulo con el uso de la palabra public. Public IntersAnual as Long
34
17
Variables Static
Las variables estticas son un caso especial. Se declaran a nivel de procedimiento y retienen su valor despus de que el procedimiento finaliza. Sub Ejemplo() Static Counter As Integer Aqu va el cdigo End Sub
35
18
EXPRESIONES DE ASIGNACIN
Una expresin de asignacin es una instruccin de VBA que realiza evaluaciones matemticas y asigna el resultado a una variable o aun objeto. VBA usa el signo igual = como operador de asignacin. x=1 Se puede usar una secuencia de x=x+1 continuacin (espacio seguido de x = (y * 2) / (z * 2) un signo de subrayado) para facilitar la lectura de expresiones FileOpen = true muy largas. Range(Ao). Value = 1995
38
19
OPERADORES ARITMTICOS + Suma, - Resta, * Multiplicacin, / Divisin, \ Divisin entera, Mod Resto, ^ exponencial, & Concatenacin OPERADORES COMPARATIVOS = Igual, < Menor, > Mayor, <= Menor o igual, >= Mayor o igual, <> Distinto OPERADORES LGICOS Not (negacin lgica, And (conjuncin lgica), Or (disyuncin lgica), XoR (exclusin lgica), Eqv (equivalencia en dos expresiones), Imp (implicacin lgica)
39
MATRICES
Una matriz es un grupo de elementos del mismo tipo que tienen un nombre comn; para referirse aun elemento especfico de una matriz se usa el nombre de la matriz y un nmero de ndice. Se puede declarar una matriz con DIM o Public como cualquier variable.
MATRICES MULTIDIMESIONALES
DIM MiMatriz(1 To 100, 1 to 10) As Integer MiMatriz(1,2) = 20
40
20
VARIABLES DE OBJETO
Una variable de objeto es una variable que representa un objeto entero, como puede ser un rango o una hoja de clculo. Las variables de objeto son importante por dos razones: Pueden simplificar el cdigo Pueden hacer que el cdigo se ejecute ms de prisa. Se declaran con DIM o Public. Por ejemplo, la expresin siguiente declara AreaEntradaDatos como un objeto Range. Para ver como simplifican el cdigo, veamos un ejemplo sin usar variables de objeto: Sub VarSinObj(); Worksheets(Hoja1).Range(A1).Value = 124 Worksheets(Hoja1).Range(A1).Font.Bold = True Worksheets(Hoja1).Range(A1).Font. Italic = True End Sub
41
Esta rutina introduce un valor en la celda A1 de la HOJA1, del libro de trabajo activo, y despus aplica Negrita y cursiva a su contenido. Para reducir el cdigo se puede condensar la rutina con una variable de objeto. Sub VarObj(); Dim MiCelda As Range Set Micelda = Worksheets(Hoja1).Range(A1) MiCelda.Value = 124 MiCelda.Font.Bold = True MiCelda.Font. Italic = True End Sub
21
FUNCIONES INTEGRADAS
Las funciones integradas de VBA no son las misma que las de Excel. La funcin UCASE de VBA, que convierte una cadena a maysculas es equivalente a la funcin MAYUSC de Excel. Para obtener la lista de funciones de Sub MostrarRaiz() VBA, se teclea en el cdigo VBA MiValor = 25 seguido de un punto. El Editor de VB RaizCuadrada = Sqr(MiValor) despliega una lista con todas las MsgBox RaizCuadrada funciones. End Sub 43
FUNCIONES INTEGRADAS
El objeto WorsheetFunction, que est contenido en el objeto Application, contiene todas las funciones de hoja de clculo que se pueden llamar desde los procedimientos VBA. Veamos un ejemplo para convertir un nmero decimal en nmero romano. Sub MostrarRomano ValorDecimal = 1999 ValorRomano = Application.WorsheetFunction.Romano(ValorDecimal) MsgBox ValorRomano End Sub Es importante saber que no se puede usar una funcin de hoja de clculo que tenga una funcin de VBA equivalente. Por ejemplo no se puede usar la funcin de hoja de clculo RAIZ, porque VBA tiene la funcin SQR. La siguiente sentencia da error: Application.WorksheetFunction.RAIZ(144)
44
22
Parte 3:
Manipulacin objetos y colecciones
45
VBA ofrece dos importantes dos importantes estructuras que pueden simplificar el trabajo con objetos y colecciones: Estructuras With ...End With Estructuras For Each...next
23
Sub CerrarActivo() For Each Book In Workbooks If Book.Name <> ActiveWorkbook.Name Then Book.Close Next Book End Sub
Sub ConvertirMayus() For Each Cell In Selection Cell.Value = UCASE(Cell.Value) Next Cell End Sub
48
24
ESTRUCTURAS IF...THEN
Se usa para ejecutar una o ms instrucciones de forma condicional. La sintaxis general es: If condicin Then inst_verdaderas [Else inst_falsas] Sub Positivos() a = InputBox("Ingrese un nmero") If a > 0 Then MsgBox "Nmero Positivo" End If End Sub Ingresa un nmero, y si es mayor que cero muestra el mensaje Nmero Positivo
Sub Positivos_Negativos() a = InputBox("Ingrese un nmero") If a > 0 Then MsgBox "Nmero Positivo" Else _ MsgBox "Nmero negativo" End Sub
Ingresa un nmero, y si es mayor que cero muestra el mensaje Nmero Positivo, y si no Nmero Negativo
49
ESTRUCTURAS IF...THEN
Ingresa un nmero, y si es Sub Positivos_Negativos_Cero() mayor que cero muestra el a = InputBox("Ingrese un nmero") mensaje Nmero Positivo, si es menor que cero If a > 0 Then muestra el mensaje MsgBox "Nmero Positivo" Nmero Negativo, y si es ElseIf a < 0 Then cero muestra el mensaje MsgBox "Nmero negativo " Cero ElseIf a = 0 Then MsgBox " Cero " End If End Sub La funcin IIF de VBA es parecida a la funcin IF (SI) de Excel IIF(expresin, parte verdadera, parte falsa)
Sub Descuento() MsgBox IIf(Range("A1") = 0, "Cero", "Distinto de Cero") End Sub
50
25
52
26
53
BUCLES FOR...NEXT
Esta sentencia de iteracin se ejecuta un nmero determinado de veces Su sintaxis es: For contador = empezar To finalizar [Step valorincremento] [Instrucciones] [Exit For] [instrucciones] Next [contador] Sub SumaNmeros Sum = 0 For Count = 0 To 10 Sum = Sum + Count Next Count MsgBox Sum End Sub Suma los diez primeros nmeros naturales
54
27
BUCLES FOR...NEXT
Sub SumaNmerosPares Suma los nmeros pares Sum = 0 entre 0 y 10 For Count = 0 To 10 Step 2 Sum = Sum + Count Next Count MsgBox Sum End Sub Sub BuclesAnidados Dim MiMatriz(1 To 3, 1 To 3) Asigna el valor 2 a todos las casillas de una For i = 1 To 3 matriz de 3 x 3 For j = 1 to 3 MiMatriz(i,j) = 2 Next j Next i End Sub
55
BUCLES DO...WHILE
Do While se ejecuta mientras se verifica una condicin especificada. Do While puede tener cualquiera de estas dos sintaxis. Do [While condicion] [instrucciones] [Exit Do] [instrucciones] Loop Do [instrucciones] [Exit Do] [instrucciones] Loop [While condicion]
Sub DoWhileDemo() Do While IsEmpty(ActiveCell) ActiveCell.Value = 0 ActiveCell.Offset(1, 0).Select Loop End Sub
Mientras la celda activa este vaca se desplaza hacia abajo asignndole a cada celda el valor 0
56
28
BUCLES DO...UNTIL
El bucle se ejecuta hasta que la condicin llegue a ser verdadera. Do Until puede tener cualquiera de estas dos sintaxis. Do Until condicion] [instrucciones] [Exit Do] [instrucciones] Loop Do [instrucciones] [Exit Do] [instrucciones] Loop [Until condicion]
Sub DoUntilDemo() Do ActiveCell.Value = 0 ActiveCell.Offset(1, 0).Select Loop Until Not IsEmpty(ActiveCell) End Sub
57
Parte 4:
Procedimientos SUB con VBA
58
29
30
62
31
Parte 5:
Procedimientos FUNCTION con VBA
64
32
33
67
68
34
70
35
VENTAS MENSUALES % DE COMISIN 0-9.999 8,00% 10.000-19999 10,50% 20.000-39.999 12,00% 40.000+ 14,00% Una forma de calcular las comisiones es mediante el uso e la fucnin SI: =si(Y(A1>00,A1<=9999,99),A1*0,08, si(Y(A1>=10000,A1>=19999,99),A1*0,105, si(Y(A1>=20000,A1<=39999,99),A1*0,12, si(A1>=40000,A1*0,14,0)))) Este es un mal planteamiento por varias razones. Primera, la frmula es demasiado compleja y muy difcil de entender. Segunda, los valores son cdigos cerrados dentro de la frmula haciendo la modificacin de la frmula muy difcil.
72
36
74
37
75
38
77
78
39
Parte 6:
Formularios
79
UserForms
Un cuadro de dilogo personalizado se genera en un UserForm y se puede acceder a l con ayuda del Editor de VB. A continuacin se expone la secuencia tpica de fases a realizar para la creacin de un UserForm: 1) Insertar un UserForm en el libro de trabajo 2) Escribir un procedimiento que despliegue el UserForm Este procedimiento est localizado en un mdulo de VBA (no en el mdulo de cdigo para el UserForm) 3) Aadir controles al UserForm 4) Ajustar algunas propiedades a los controles aadidos 5) Escribir procedimientos de controlador de evento para los controles. Estos procedimientos que estn situados en la ventana de cdigo para el UserForm, se ejecutan cuando ocurren varios eventos (como hacer clic con el ratn).
80
40
UserForms
INSERTAR UN NUEVO UserForm Activar el Editor de VB y seleccionar el Libro de trabajo correspondiente y elegir el comando Insertar, UserForm. Un libro de trabajo puede tener cualquier nmero de UserForms, y cada uno de ellos contiene un solo UserForms. Los UserForms tienen nombres como UserForm1, UserForm2, y as sucesivamente. Se puede cambiar el nombre del UserForm para que su identificacin sea ms fcil. Para ello se selecciona el UserForm y se usa la ventana propiedades, desde donde se puede cambiar la propiedad Name (presionar F4 si la ventana de propiedades no est desplegada).
81
UserForms
Ventana Propiedades
82
41
UserForms
DESPLEGAR UN UserForm Se usa el mtodo Show del objeto UserForm. El siguiente procedimiento, que se encuentra dentro de un mdulo de VBA normal, despliega UserForm1: Private Sub AbrirFormulario() Userform1.Show End Sub Cuando se despliega el UserForm, permanece visible en la pantalla hasta que se oculta. El procedimiento puede tanto cargar el UserForm (con una instruccin Unload) como ocultarlo (con el mtodo Hide del objeto UserForm) AADIR CONTROLES A UN UserForm Se usa el Cuadro de herramientas (el Editor de VB no tiene comandos de men para aadir controles). Este cuadro se puede desplegar con Ver, Cuadro de Herramientas.
83
UserForms
AADIR CONTROLES A UN UserForm Se usa el Cuadro de herramientas (el Editor de VB no tiene comandos de men para aadir controles). Este cuadro se puede desplegar con Ver, Cuadro de Herramientas.
84
42
UserForms
AADIR CONTROLES A UN UserForm Se hace clic sobre el botn del Cuadro de Herramientas que corresponde al control que se quiere aadir, y despus se hace clic dentro del cuadro de dilogo. Cuando se aade un control nuevo, se le asigna un nombre que combina el tipo de control con la secuencia numrica para ese tipo de control. Por ejemplo si se aade el primer botn de comando se le asignar el nombre ComandButton1, y al segundo que se aada CommandButton2. Siempre conviene cambiarle el nombre a los controles para que sean ms representativos. Los nombres de lo controles se cambian desde la ventana de Propiedades. CONTROLES DISPONIBLES PARA EL USUARIO Casilla de verificacin (CheckBox). Es til para ofrecer al usuario una opcin binaria: s o no, verdadero o falso, activar o desactivar, y dems. Cuando se selecciona una Casilla de verificacin posee un valor Verdadero; en caso contrario es Falso.
85
UserForms
CONTROLES DISPONIBLES PARA EL USUARIO Cuadro combinado (ComboBox). Es similar al cuadro de lista. Sin embargo, un Cuadro Combinado es un cuadro de lista desplegable que presenta un solo elemento por vez. Otra diferencia con respecto al cuadro de lista es que el usuario puede introducir un valor que no aparece en la lista dada de elementos. Botn de comando (CommandButton). Todo cuadro de dilogo que se genere probablemente tenga, al menos, un Botn de comando. Normalmente se tendr un Botn de comando etiquetado como Aceptar y otro etiquetado como Cancelar. Botn Macro (Frame). Se usa para agrupar otros controles. Se puede hacer bien por motivos estticos o por agrupar lgicamente un conjunto de controles. Un Marco es particularmente til cuando el cuadro de dilogo contiene ms de un grupo de controles de Botn de opcin.
86
43
UserForms
CONTROLES DISPONIBLES PARA EL USUARIO Imagen (Image).Se usa para desplegar una imagen grfica, que pude provenir de un archivo o se pude pegar desde el Portapapeles. La imagen grfica se guarda en el libro de trabajo. De esta forma, se puede distribuir el libro a cualquier persona y no es necesario incluir una copia del archivo grfico. Etiqueta (Label). Simplemente presenta texto en el cuadro de dilogo. Cuadro de lista (Listbox). Presenta una lista de elementos donde el usuario puede seleccionar uno (o mltiples elementos). Estos controles son muy flexibles. Por ejemplo, se puede especificar un rango de hoja de clculo que contenga elementos de un Cuadro de lista, y este rango puede constar de mltiples columnas Pgina mltiple (Multipage). Permite crear cuadros de dilogo con fichas, como el que aparece cuando se selecciona el comando herramientas, opciones. De forma predeterminada una pgina mltiple consta de dos pginas. Para aadir pginas, se hace clic con el botn derecho del ratn sobre una ficha y se selecciona Nueva pgina desde el men contextual.
87
UserForms
CONTROLES DISPONIBLES PARA EL USUARIO Botn de opcin (OptionButtons). Son muy tiles cuando el usuario necesita seleccionar entre un pequeo nmero de elementos. Estos botones se usan siempre en grupos de al menos dos elementos. Cuando se selecciona uno de los botones, los otros botones del grupo no estn seleccionados. Si el cuadro de dilogo contiene ms de un grupo de Botones de opcin, cada grupo de stos debe tener el mismo valor de la propiedad group name. De lo contrario, todos los Botones de opcin formarn parte del mismo grupo. De forma alternativa, se pueden agrupar los Botones de opcin en un control Marco, que agrupa automticamente los Botones de opcin contenidos dentro del marco. RefEdit. Se usa cuando es necesario permitir que el usuario seleccione un rango de una hoja de clculo. Barra de desplazamiento (ScrollBar). Es similar a un control Botn de nmero. La diferencia estriba en que el usuario puede desplazarse con el botn Barra de desplazamiento para cambiar el valor del contrl en incrementos ms amplios. Dicho control es ms til para seleccionar un valor que se extiende a travs de un rango muy amplio de posibles valores. 88
44
89
UserForms
AJUSTAR LOS CONTROLES DEL CUADRO DE DILOGO
Despus de situar un control en un cuadro de dilogo, se puede mover y modificar su tamao usando las tcnicas del ratn estndar. Un UserForm puede contener lneas de divisin horizontales y verticales que ayudan a alinear los controles que se aaden. Cuando se aade o se mueve un control, se ajusta a la cuadrcula. Si no se quieren ver estas lneas se pueden desactivar seleccionando Herramientas Opciones en el Editor de VB. En el cuadro de dilogo Opciones se selecciona la ficha general y se establecen las opciones deseadas en la seccin Opciones de la cuadricula. El men Formato de la ventana del Editor de VB proporciona varios comandos para ayudar a precisar la alineacin y el espacio de los controles en un cuadro de dilogo. Antes de usar estos comandos hay que seleccionar los controles con los que se quiere trabajar.
90
45
UserForms
AJUSTAR LOS CONTROLES DEL CUADRO DE DILOGO
91
UserForms
AJUSTAR LAS PROPIEDADES DEL CONTROL Se pueden cambiar las propiedades del control en el tiempo de diseo con la ventana de Propiedades, mientras se est configurando el cuadro de dilogo, o durante el tiempo de ejecucin, cuando el cuadro de dilogo se presenta al usuario. Se pueden usar instrucciones VBA para cambiar las propiedades del control en el tiempo de ejecucin. USAR LA VENTANA DE PROPIEDADES La ventana propiedades tiene dos fichas: La ficha alfabtica presenta las propiedades del objeto seleccionado en orden alfabtico La ficha Por categoras las presenta agrupadas en categoras lgicas Si se seleccionan dos o ms controles a la vez, la ventana Propiedades despliega slo las propiedades comunes a los controles seleccionados.
92
46
UserForms
USAR LA VENTANA DE PROPIEDADES
93
UserForms
USAR LA VENTANA DE PROPIEDADES La mejor manera de aprender sobre diversas propiedades de un control es usar la Ayuda en lnea. Simplemente se hace clic sobre una propiedad de la ventana de Propiedades y se presiona F1. Por ejemplo, la propiedad Alignment de un Botn de Opcin.
94
47
UserForms
CAMBIAR EL ORDEN DE TABULACION El orden de tabulacin determina la secuencia en la que los controles se activan cuando el usuario presiona Tab o Mays-tab.Para establecer el orden de tabulacin de los controles se selecciona Ver Orden de tabulacin en el Editor de VB
De forma alternativa, se puede establecer una posicin de control individual en el orden de tabulacin, usando la ventana Propiedades. El primer control en el orden de tabulacin tiene una Propiedad TabIndex de 0. Cambiar esta propiedad puede afectar a otros controles. Si se quiere eliminar un control del orden de tabulacin, se establece su propiedad TabStop como False.
95
UserForms
ESTABLECER TECLAS DE ACCESO DIRECTO Se puede asignar una tecla de aceleracin o tecla de acceso directo a la mayora de los controles de un cuadro de dilogo. Esto permite al usuario acceder al control presionando Alt-tecla de acceso directo. Para ello se usa la propiedad Accelerator de la ventana propiedades. PROBAR UN UserForm Existen tres maneras de probar un UserForm sin tener que llamarlo desde un procedimiento de VBA. Elegir el comando Ejecutar, Ejecutar Sub/UserForm Presionar F5 Hacer clic sobre el botn Ejecutar Sub/UserForm en la barra de herramientas Estndar
96
48
UserForms
DESPLEGAR UN UserForm Sub MostrarDilogo() UserForm1().show End Sub CERRAR UN UserForm Unload UserForm1 PROCEDIMINETOS DE CONTROLADOR DE EVENTO Cuando el usuario interacta con el cuadro de dilogo, mediante la seleccin de un elemento de un cuadro de lista, haciendo clic sobre un botn de comando y dems, se produce un evento a ocurrir. Por ejemplo, hacer clic sobre el Botn de comando promueve el evento Click para dicho botn. La aplicacin necesita procedimientos que se ejecuten cuando estos eventos ocurran. Estos procedimiento se llaman controlador de evento.
97
Este procedimiento debe estar en un mdulo de VBA, no en el mdulo del cdigo del UserForm.
UserForms
PROCEDIMINETOS DE CONTROLADOR DE EVENTO Los procedimientos de controlador de evento deben estar localizados en la ventana de cdigo del UserForm. Sin embargo, el procedimiento de controlador de evento puede llamar a cualquier procedimiento que est localizado en un mdulo VBA estndar. CREAR UN UserForm: Un ejemplo El ejemplo usa un UserForm para obtener dos tipo de informacin: el nombre y el sexo de una persona. Usa el control Cuadro de texto (TextBox) para obtener el nombre. Usa tres botones de opcin (OptionsButtons) para obtener el sexo (masculino, femenino o desconocido). La informacin se recoge en el cuadro de dilogo y luego se enva a la siguiente fila en blanco de la hoja de clculo.
98
49
UserForms
CREACIN DEL CUADRO DE DILOGO 1) Abra un libro de trabajo nuevo 2) Presionar Alt-F11 para activar el Editor de VB 3) En la ventana Proyecto, seleccionar el proyecto del libro de trabajo y elegir insertar, UserForm para aadir un formulario vaco. 4) Si la ventana propiedades no est visible, presionar F4. 5) Cambiar la propiedad Caption del UserForm (usando la ventana propiedades) a Obtener nombre y sexo. 6) Aadir un control Etiqueta (Label) y ajustar sus propiedades: Accelerator N, caption Nombre, TabIndex 0 7) Aadir un control Cuadro de texto (TextBox) y ajustar sus propiedades: Name NombreTexto, TabIndex 1 8) Aadir un control Marco (frame) y ajustar sus propiedades: Caption Sexo, TabIndex 2
99
UserForms
CREACIN DEL CUADRO DE DILOGO
9) Aadir un control Botn de opcin (OptionButtons) dentro del Marco y ajustar sus propiedades: Accelerator M, Caption Masculino, Name OpcinMasculino, TabIndex 0 10) Aadir otro control Botn de opcin (OptionButtons) dentro del Marco y ajustar sus propiedades: Accelerator F, Caption Femenino, Name OpcinFemenino, TabIndex 1
100
50
UserForms
CREACIN DEL CUADRO DE DILOGO 11) Aadir otro control Botn de opcin (OptionButtons) dentro del Marco y ajustar sus propiedades: Accelerator D, Caption Desconocido, Name Opcindesconocido, TabIndex 2, Value True 12) Aadir un control Botn de Comando (CommandButton) dentro del Marco y ajustar sus propiedades como sigue: Caption Aceptar, Default True, Name BotnAceptar, TabIndex 3 13) Aadir otro control Botn de Comando (CommandButton) dentro del Marco y ajustar sus propiedades como sigue: Caption Cancelar, Cancel True, Name BotnCancelar, TabIndex 4
101
UserForms
CREACIN DEL CUADRO DE DILOGO
ESCRIBIR UN CDIGO PARA DESPLEGAR EL CUADRO DE DILOGO Ahora se debe aadir un Botn de Comando a la hoja de clculo (Cuadro de controles). Este botn ejecuta un procedimiento que despliega el UserForm. 1) Activar Excel 2) Activar la barra Cuadro de Controles 3) Aadir un Botn de comando
102
51
UserForms
ESCRIBIR UN CDIGO PARA DESPLEGAR EL CUADRO DE DILOGO 4) Hacer doble clic sobre el botn, esto activa el Editor de VB (especficamente, el mdulo de cdigo para la hoja de calculo se despliega, con un procedimiento controlador de evento vaco para el Botn de Comando (CommandButton)de la hoja de Clculo) 5) Aadir la instruccin UserForm1.Show al procedimiento Private Sub CommandButton1-Click() UserForm1.Show End Sub
103
UserForms
PROBAR EL UserForm Al salir del modo de diseo (desactivarlo de la barra Cuadro de Controles) y hacer clic sobre el botn, se despliega el cuadro de dilogo:
Como an no hemos creado ningn controlador de evento, slo podemos cerrar el cuadro de dilogo. 104
52
UserForms
AADIR PROCEDIMIENTOS DE CONTROLADOR DE EVENTO En esta seccin se explica cmo escribir procedimientos que controlan los eventos que ocurren cuando el cuadro de dilogo se ha desplegado. 1) Activar el Editor de VB 2) Hacer doble clic sobre el botn Cancelar. El Editor de VB activa la ventana de Cdigo del UserForm y proporciona un procedimiento vaco llamado BotnCancelar_Click 3) Modificar el procedimiento como sigue: Private Sub Botncancelar_Click() Unload UserForm End Sub 4) Presionar Mays-F7 para volver a desplegar el UserForm1 5) Hacer doble click sobre el botn Aceptar e introducir el siguiente procedimiento (ste es el controlador de evento para el evento Click del Botn Aceptar)
105
UserForms
AADIR PROCEDIMIENTOS DE CONTROLADOR DE EVENTO Private Sub BotnAceptar_Click() Sheets(Hoja1).Activate NextRow = Application.WorkSheetFunction.CountA(Range(A:A)) + 1 Cells(NextRow, 1) = NombreTexto.text If OpcinMasculino Then Cells(NextRow, 2) = Masculino If OpcinFemenino Then Cells(NextRow, 2) = Femenino If OpcinDesconocido Then Cells(NextRow, 2) = Desconocido NombreTexto = OpcinDesconocido = true NombreTexto.SetFocus End Sub
106
53
UserForms
AADIR PROCEDIMIENTOS DE CONTROLADOR DE EVENTO
107
UserForms
VALIDAR LOS DATOS
Este ejemplo no asegura que el usuario realmente introduce el nombre en el Cuadro de texto. El siguiente cdigo se inserta en el procedimiento BotnAceptar_Click() antes de que el texto se transfiera a la hoja de clculo. Asegurar que se ha introducido un nombre If NombreTexto.Text = Then MsgBox Se debe introducir un nombre Exit Sub End If Con esto se asegura que el usuario ingresa un texto. Si este est vaco aparece un mensaje y la rutina termina.
108
54
Parte 7:
Controles
109
Categora comportamiento
Enabled: Propiedad del tipo True/False que especifica si el control est activo o no en tiempo de ejecucin; un control no activo es visible pero el usuario no puede interactuar con l, y se visualiza con un color distinto. Visible: Otra propiedad True/False, que indica si el control est visible u oculto en tiempo de ejecucin. TabIndex: El orden por el cual nos movemos con la tecla TAB, entre los controles, se establece con esta propiedad. Es un valor numrico, 0, 1 ... TabStop: Es del tipo True/False y establece si un control puede ser accesible con la teca TAB.
110
55
Categora posicin
Left y Top: La primera contiene la coordenada columna y la segunda la coordenada lnea de pantalla donde se sita el control. Width y Height: Cuando un control es redimensionable, esto es, que sus dimensiones son variables, tendr estas dos propiedades que nos informan del ancho y la altura del control. EJEMPLO 1) Inserte un formulario en l proyecto 2) Inserte un botn de comando 3) Haga doble click sobre el botn para acceder a la ventana de cdigo 4) En el procedimiento de evento click aada las siguientes lneas de cdigo:
111
112
56
114
57
116
58
117
2) Acceda a las propiedades Caption de los controles de forma que queden como en la pantalla anterior. 3) Ponga la propiedad Visible del TextBox que muestra el resultado del clculo a False. Haga lo mismo con el correspondiente control Label. 118
59
End Sub
If CamaAdicional = true Then Precio = Precio + 1500 End If If BaoCompleto = true Then Precio = Precio + 2000 End If TextBox4 = Precio TextBox4.Visible = True Label4.Visible = True End Sub
120
60
121
EL CONTROL LISTBOX
A continuacin se presentan algunos puntos a tener en cuenta cuando se trabaja con controles de Cuadro de lista.
Los elementos de un Cuadro de Lista se pueden recuperar desde un rango de celdas (especificadas por la propiedad RowSource) o pueden ser aadido usando un cdigo de VBA (y usando el mtodo AddItem). Un Cuadro de lista se puede configurar para permitir una seleccin de una celda o una seleccin mltiple. Esto est determinado por la propiedad MultiSelect. No es posible desplegar un Cuadro de lista sin elementos seleccionados (la propiedad ListIndex es -1). Sin embargo, una vez se ha seleccionado un elemento, no es posible no seleccionar ningn elemento. Un Cuadro de lista puede contener columnas mltiples (controladas por la propiedad ColumnCount) e incluso un encabezado descriptivo (controlado por la propiedad ColumnHeads). Los elementos de un Cuadro de lista se pueden presentar como Casillas de verificacin si se permite una seleccin mltiple, o como Botones de opcin si se permite una seleccin de una sola celda. Esta operacin est controlada por la propiedad ListStyle.
122
61
EL CONTROL LISTBOX
Aadir elementos al control Cuadro de lista Antes de desplegar un Userform que use un control Cuadro de lista, probablemente se necesite rellenar el mismo con elementos. Esto se debe realizar en tiempo de diseo, usando elementos guardados en un rango de hoja de clculo, o en tiempo de ejecucin, usando VBA para aadir los elementos. Los ejemplos que veremos a continuacin suponen que: Se ha generado un cuadro de dilogo en un UserForm llamado UserForm1. Este cuadro de dilogo contiene un control de Cuadro de lista llamado ListBox1. El libro de trabajo contiene una hoja llamada Hoja1 y un rango A1:A12 que contiene los elementos a desplegar en el Cuadro de lista. Aadir elementos a un Cuadro de lista en tiempo de diseo Para aadir elementos en tiempo de diseo los elementos deben estar guardados en en un rango de hoja de clculo. Se usa la propiedad RowSource para especificar el rango que contiene dichos elementos (HOJA1!A1:A2)
123
EL CONTROL LISTBOX
Aadir elementos a un Cuadro de lista en tiempo de diseo
124
62
EL CONTROL LISTBOX
Aadir elementos a un Cuadro de lista en tiempo de ejecucin Para aadir elementos a un Cuadro de lista en tiempo de ejecucin existen dos formas: Configurar la propiedad RowSource para una direccin de rango usando un cdigo. Escribir un cdigo que usa el mtodo AddItem para aadir los elementos al Cuadro de lista. UserForm1.ListBox1.RowSource = Hoja1!A1:A12 Si los elementos no estn contenidos en un rango de hoja de clculo, se puede escribir un cdigo VBA para rellenar el cuadro de lista antes de que aparezca el cuadro de dilogo (con el mtodo AddItem).
125
EL CONTROL LISTBOX
Aadir elementos a un Cuadro de lista en tiempo de ejecucin
Sub ShowUserForm1() With UserForm1.ListBox1 .RowSource = .AddItem Enero .AddItem Febrero .AddItem Marzo .AddItem Abril .AddItem Mayo .AddItem Junio .AddItem Julio .AddItem Agosto .AddItem Septiembre End With UserForm1. Show End Sub
126
63
EL CONTROL LISTBOX
Aadir elementos a un Cuadro de lista en tiempo de ejecucin Tambin se pude usar el mtodo AddItem para recuperar elementos de un Cuadro de Lista a partir de un rango. For Row = 1 To 12 UserForm1.ListBox1.AddItem Sheets(Hoja1).Cells(Row,1) Next Row Si los datos estn contenidos en una matriz de una dimensin meses, que contiene 12 elementos, podemos escribir ListBox1.List = meses
127
EL CONTROL LISTBOX
Seleccin de las opciones en el ListBox La propiedad MultiSelect que en el momento de crear el control tiene el valor 0Single, que permite seleccionar slo una opcin, puede tomar los siguientes valores: 1-Simple: permite seleccionar ms de un elemento simplemente pulsando el botn del ratn sobre cada uno 2-Extended: permite adems seleccionar un rango de la lista combinando la tecla de maysculas con el botn del ratn. En este caso para seleccionar elementos aislados combinaremos la tecla Control con el ratn. Acceso a la opcin en el caso de seleccin simple Para determinar el elemento que se ha seleccionado, hay que acceder a la propiedad Value del Cuadro de lista. MsgBox ListBox1.Value Si se necesita saber la posicin del elemento seleccionado se puede acceder a la propiedad ListIndex del Cuadro de lista. MsgBox Se ha seleccionado el elemento & ListBox1.ListIndex 128
64
EL CONTROL LISTBOX
Acceso a las opciones en multiseleccin Cuando tengamos la multiseleccin activada (la propiedad MultiSelect es 1 2) podr haber ms de un elemento seleccionado, y las propiedades anteriores no sern adecuadas. Utilizaremos la propiedad Selected que es una matriz unidimensional de elementos tipo Boolean. El nmero de elementos es el mismo que el de la propiedad List. Si el tercer elemento est seleccionado, entonces el tercer elemento de Selected tendr el valor True, en caso contrario valdr False. Tambin nos puede ser til la propiedad ListCount, que devuelve el nmero total de elementos de la lista. Crear un cuadro de lista con contenido variable Este ejemplo demuestra cmo crear un Cuadro de lista cuyo contenido cambia, dependiendo de la seleccin del usuario de un grupo de botones de opcin. El cuadro de lista obtiene los elementos de un rango de hoja de clculo. El procedimiento que controla el evento Click de los controles de Botn de opcin simplemente establece la propiedad RowSource del Cuadro de lista en un rango diferente.
129
EL CONTROL LISTBOX
Crear un cuadro de lista con contenido variable Private Sub OpcionCoches_Click() ListBox1.RowSource = "Hoja1!Coches" End Sub Private Sub OpcionColores_Click() ListBox1.RowSource = "Hoja1!Colores" End Sub Private Sub OpcionMeses_Click() ListBox1.RowSource = "Hoja1!Meses" End Sub
130
65
EL CONTROL LISTBOX
Elaborar un Cuadro de lista desde otra lista
A continuacin se muestra el procedimiento que se ejecuta cuando el usuario hace clic sobre el botn Aadir
Private Sub Aadir_Click() If ListBox1.ListIndex = -1 Then Exit Sub ListBox2.AddItem ListBox1.Value End Sub
131
EL CONTROL LISTBOX
Elaborar un Cuadro de lista desde otra lista A continuacin se muestra el procedimiento que se ejecuta cuando el usuario hace clic sobre el botn Eliminar Private Sub Eliminar_Click() If ListBox2.ListIndex = -1 Then Exit Sub ListBox2.RemoveItem ListBox2.ListIndex End Sub
Mover elementos de un cuadro de lista
132
66
EL CONTROL LISTBOX
Mover elementos de un cuadro de lista
Private Sub MoverEncima_Click() With ListBox1 ItemNum = .ListIndex If ItemNum > 0 Then TempItem = .List(ItemNum - 1) .List(ItemNum - 1) = .List(ItemNum) .List(ItemNum) = TempItem .ListIndex = .ListIndex - 1 End If End With End Sub
133
EL CONTROL LISTBOX
Mover elementos de un cuadro de lista
Private Sub MoverDebajo_Click() With ListBox1 ItemNum = .ListIndex If ItemNum < .ListCount - 1 And ItemNum <> -1 Then 0 Then TempItem = .List(ItemNum +1) .List(ItemNum +1 1) = .List(ItemNum) .List(ItemNum) = TempItem .ListIndex = .ListIndex + 1 End If End With End Sub
134
67
EL CONTROL MULTIPAGE
El control Pgina Mltiple es muy til para cuadros de dilogo personalizados que deben presentar muchos controles. El mencionado control permite agrupar las opciones y colocar cada grupo en una ficha aparte. Hay que tener en cuenta lo siguiente cuando se use este control:
La ficha (o pgina) que se despliega al frente est determinada por la funcin Value el control.El valor 0 despliega la primera ficha, el 1 la segunda y as sucesivamente. De forma predeterminada, un control de Pgina Mltiple tiene dos pginas. Para aadir una nueva, se hace clic con el botn derecho del ratn sobre una ficha y se selecciona Nueva Pgina desde el men contextual. Cuando se est trabajando con un control de Pgina Mltiple, basta con hacer clic sobre una ficha para establecer las propiedades de esa pgina en concreto. La ventana Propiedades pesenta las propiedades que se pueden ajustar. Puede ser difcil seleccionar el control de Pgina mltiple, porque al hacer clic sobre el mismo, se selecciona toda la pgina. Para seleccionar el control propiamente dicho se puede usar la tecla Tab para realizar un recorrido en crculo por todos los controles. Tambin se puede seleccionar el control Pgina mltiple desde la lista desplegable de la ventana Propiedades.
135
EL CONTROL MULTIPAGE
Si el control pgina Mltiple consta de muchas fichas, se puede establecer su propiedad multiRow en True para desplegar las fichas en ms de una fila. Si se prefiere se pueden desplegar botones en lugar de fichas. Para ello se cambia la propiedad Style a 1. La propiedad TabOrientation determina la localizacin de las fichas en el control Pgina Mltiple
136
68
EL CONTROL RefEdit
A continuacin se presentan algunos temas a tener en cuenta cuando se use el control REfEdit: El control REfEdit devuelve una cadena de texto que representa una direccin de rango. Se puede convertir esta cadena en un objeto Range mediante el uso de una instruccin como la siguiente: Set UserRange = Range(RefEdit1.Text) Desplegar la seleccin de rango actual es una buena prctica para inicializar el control RefEdit. Esto se puede hacer con la ayuda del procedimiento UserForm_Initialize usando una instruccin como la siguiente. RefEdit1.Text = ActiveWindow.RangeSelection.Address No hay que dar por supuesto que el control RefEdit siempre va a devolver siempre la direccin de rango vlido, por lo tanto debemos verificar que sea realmente vlido.
137
EL CONTROL RefEdit
On Error Resume Next Set UserRange = Range(RefEdit1.Text) If Err <> 0 Then MsgBox El rango seleccionado no es vlido RefEdit1.SetFocus On error GoTo 0 Exit Sub End If Si el rango seleccionado correponde aun hoja diferente de la activa deber indicarlo de la siguiente forma: Hoja2!A1:A20
138
69
EL CONTROL RefEdit
EJEMPLO
139
EL CONTROL RefEdit
EJEMPLO
Sub Clculo() UserForm1.Show End Sub Private Sub CommandButton1_Click() RefEdit1.Text = "" TextBox1 = "" End Sub Private Sub CommandButton2_Click() End End Sub
140
70
EL CONTROL RefEdit
EJEMPLO
Private Sub Opcin_Producto_Click() Set UserRange = Range(RefEdit1.Text) prod = 1 For Each cell In UserRange prod = prod * cell.Value Next cell TextBox1 = prod End Sub Private Sub Opcin_Suma_Click() Set UserRange = Range(RefEdit1.Text) Sum = 0 For Each cell In UserRange Sum = Sum + cell.Value Next cell TextBox1 = Sum End Sub
141
Parte 8:
Rangos
142
71
Mover un rango
Sub Mover_Rango() Range(A1:A8).Cut Range(C4) End Sub
144
72
145
146
73
147
74
75
152
76
77
155
156
78
Parte 9:
Grficos
157
158
79
159
SEAT
BMW
AUDI MARCAS
FIAT
RENAULT
160
80
Sub grafico() Range("A2:E6").Select Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("Hoja1").Range("A2:E6"), PlotBy:= _ xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Hoja1" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "VENTAS DEL AO 2000" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "MARCAS" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CANTIDAD" End With ActiveChart.HasLegend = False ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False End Sub
161
Cuando se genera un grfico usando el mtodo Add de la coleccin Charts, el grfico es siempre una hoja de grfico. En el cdigo anterior, el mtodo Location mueve el grfico a una hoja de clculo. ACTIVAR UN GRFICO El cdigo VBA puede activar un grfico incrustado usando el mtodo Activate. ActiveSheet.ChartObjects(Grfico 1).Activate Si el grfico se encuentra en una hoja de grfico, se usa una instrucciin como esta: Sheets(Grfico1)Activate Una vez activado el grfico, se puede hacer referencia a l en el cdigo con ActiveChart. Por ejemplo, la siguiente instruccin despliega el nombre del grfico activo. S no existe un grfico activo, la instruccin genera un error. MsgBox ActiveChart.name
162
81
Para modificar un grfico en VBA, no es necesario activarlo. Veamos un ejemplo que cambia el tipo de grfico a Areas. Sub Modificar_Grafico ActiveSheet.ChartObjects(Grafico1).Chart.Type = xlArea End Sub Convertir un grfico incrustado en una hoja de grfico Sub ConvertChart1() Sheets(Hoja1).ChartObjects(1).Chart.Location xlLocationAsNewShee, Mi Grfico End Sub Convertir una hoja de grfico en un grfico incrustado Sub ConvertChart2() Charts(Mi grfico).Location xlLocationAsObject, Hoja1 End Sub
163
Determinar si un grfico est activado La siguiente funcin CharIsSelected devuelve Verdadero si est activa una hoja de grafico o si est activo un grfico incrustado, y devuelve Falso si no est activado ningn grfico: Private Function ChartIsSelected() As boolean Dim x As String ChartIsSelected = False On Error Resume Next x = ActiveChart.Name if Err = 0 Then CharIsSelected = True End Function Eliminar ObjetosGrficos (ChartObjects) de grficos (Charts) Para eliminar objetos de clase ChartObject de un libro de trabajo, se puede usar simplemente el mtodo Delete de la coleccin ChartObjects. ActiveSheet.ChartObjects.Delete
164
82
Para eliminar hojas de grfico de un libro de trabajo activo, se usa la siguiente instruccin: ActiveWorkBook.Charts.Delete Normalmente, si se eleminan hojas Excel presenta una advertencia. El usuario debe contestar a este aviso para que pueda continuar la macro. Para elimnar este aviso se usa la siguiente serie de instrucciones: Application.DisplayAlerts = False ActiveWork.Charts.Delete Application.DisplayAlerts = False
165
Aplicar formato al grfico El siguiente ejemplo aplica diferentes tipos de formato al grfico activo: Sub ChartMod1() with ActiveChart .Type = xlArea .ChartArea.Font.Name = Arial .ChartArea.FontStyle = Regular .PlotArea.Interior.ColorIndex = xlNone .Axes(xlValue).TickLabels.Font.Bold = True .Axes(xlCategory).TickLabels.Font.Bold = True .HasLegend = True .Legend.Position = xlBottom End with End Sub Debe estar activo un grfico o este procedimiento dar error.
166
83
Aplicar formato al grfico El siguiente ejemplo funciona en un grfico concreto: el contenido en un ChartObject llamado Grfico 1, ubicado en la Hoja1. Ntese que el grfico nunca se activa. Sub ChartMod2() with Sheets(Hoja1).ChartObjects(Grfico 1).Chart .Type = xlArea .ChartArea.Font.Name = Arial .ChartArea.FontStyle = Regular .PlotArea.Interior.ColorIndex = xlNone .Axes(xlValue).TickLabels.Font.Bold = True .Axes(xlCategory).TickLabels.Font.Bold = True .HasLegend = True .Legend.Position = xlBottom End with End Sub
167
Bucle por todos los grficos En algunos casos es necesario ejecutar una operacin en todos los grficos. El siguiente ejemplo cambia el tipo de grfico para cada grfico incrustado en una hoja activa. Sub Cambiar_Tipo_Grafico1() For each cht In ActiveSheet.ChartObjects cht.Chart.Type = xlArea Next cht End Sub El siguiente procedimiento realiza la misma operacin que el procedimiento anterior pero funciona en todas las hojas de grfico de un libro de trabajo activo: Sub Cambiar_Tipo_Grafico2() For each cht In ActiveWorkBook.Charts cht.Type = xlArea Next cht End Sub
168
84
Bucle por todos los grficos Sub Cambiar_Leyenda() For each cht In ActiveSheet.ChartObjects With cht.hart.Legend.Font .Name = Arial .FontStyle = Bold .Size = 12 End With Next cht End Sub Alinear y ajustar el tamao de los ObjetosGrficos (ChartObjects) Un objeto de clase ChartObject posee propiedades de posicin y tamao estndar, a las que se puede acceder con el cdigo VBA. El siguiente ejemplo ajusta el tamao de todos los objetos de la clase ChartObject en HOJA1, de forma que se ajusten a las dimensiones del ChartObject llamado Grfico 1. Tambin ordena los objetos de clase ChartObject de forma que aparezcan uno despus del otro a lo largo de la izquierda de la hoja de clculo:
169
Alinear y ajustar el tamao de los ObjetosGrficos (ChartObjects) Sub Tamao_Posicin_Grficos W = ActiveSheet.ChartObjects(Grfico 1).Width H = ActiveSheet.ChartObjects(Grfico 1).Height TopPos = 0 For each chtObj in ActiveSheet.ChartObjects with chtObj .Width = W .Height = H .Left = 0 .Top = TopPos End With TopPos = TopPos + H Next chtObj End Sub
170
85
Presentar un grfico en un UserForm Supongamos que tenemos un procedimiento grafico que genera un grfico incrustado en la hoja1.
Sub ShowChart() grafico UserForm1.Show End Sub Private Sub UserForm1_Initialize() Set CurrentChart = ActiveSheet.ChartObjects(1).Chart Fname = ThisWork.Path & "\temp.gif" CurrentChart.Export FileName:=Fname, FilterName:="GIF" Sheets("Hoja1").ChartObjects1(1).Delete Image1.Picture = LoadPicture(Fname) Application.ScreenUpdating = True Kill ThisWorkbook.Path & "\temp.gif" End Sub
171
86
174
87