VBA Excel PDF
VBA Excel PDF
VBA Excel PDF
El siguiente procedimiento utiliza un nombre especificado como cadena para identificar un objeto Form.
Sub CierraForm() Forms("MiForm.frm").Close End Sub
Tambin es posible operar al mismo tiempo sobre toda una coleccin de objetos siempre que los objetos compartan mtodos comunes. Por ejemplo, el siguiente procedimiento cierra todos los formularios abiertos.
Sub CierraTodos() Forms.Close End Sub
Mtodo es toda accin que puede realizar un objeto. Por ejemplo, Add es un mtodo del objeto ComboBox ya que sirve para aadir un nuevo elemento a un cuadro combinado. El siguiente procedimiento utiliza el mtodo Add para aadir un nuevo elemento a un ComboBox.
Sub AadeElemen(nuevoElemento as String) Combo1.Add nuevoElemento
End Sub
Propiedad es un atributo de un objeto que define una de las caractersticas del objeto, tal como su tamao, color o localizacin en la pantalla, o un aspecto de su comportamiento, por ejemplo si est visible o activado. Para cambiar las caractersticas de un objeto, se cambia el valor de sus propiedades Para dar valor a una propiedad, hay que colocar un punto detrs de la referencia a un objeto, despus el nombre de la propiedad y finalmente el signo igual ( =) y el nuevo valor de la propiedad. Por ejemplo, el siguiente procedimiento cambia el ttulo de un formulario de Visual Basic dando un valor a la propiedad Caption.
Sub CambiaNombre(nuevoTitulo) miForm.Caption = nuevoTitulo End Sub
Hay propiedades a las que no se puede dar valor. El tema de ayuda de cada propiedad indica si es posible leer y dar valores a la propiedad (lectura/escritura), leer slo el valor de la propiedad (slo lectura) o slo dar valor a la propiedad (slo escritura). Se puede obtener informacin sobre un objeto devolviendo el valor de una de sus propiedades. El siguiente procedimiento utiliza un cuadro de dilogo para presentar el ttulo que aparece en la parte superior del formulario activo en ese momento.
Sub NombreFormEs() formNonmbre = Screen.ActiveForm.Caption MsgBox formNombre End Sub
Evento es toda accin que puede ser reconocida por un objeto, como puede ser el clic del mouse o la pulsacin de una tecla, y para la que es posible escribir cdigo como respuesta. Los eventos pueden ocurrir como resultado de una accin del usuario o del cdigo del programa, tambin pueden ser originados por el sistema. Para un mejor conocimiento de los conceptos: procedimiento, objeto, propiedades, mtodos y eventos, ver en el glosario. Ejemplo de un procedimiento:
Sub Command125_Click () Range("A2").Value= 7 Application.Close End Sub
"Sub" es el procedimiento; "Command125_Click" es el evento; "Range ("A2")" y "Application" son objetos; "Value" es una propiedad, y "Close" es un mtodo. Este procedimiento dice que cuando el usuario clickee sobre el botn de comando 125, la celda A2 tome el valor de 7, y luego cierre la aplicacin (salir de Excel).
Informtica Facultad de Ingeniera - UNNE 2
El primer carcter debe ser una letra. En el nombre no se pueden utilizar espacios, puntos (.), signos de interjeccin (!), ni los caracteres @, &, $, #. El nombre no puede tener ms de 255 caracteres de longitud. Como regla general, no se deben usar nombres iguales a los de los procedimientos Function, instrucciones y mtodos de Visual Basic. No obstante puede utilizar las mismas palabras clave que utiliza el lenguaje. Para utilizar una funcin intrnseca del lenguaje, o una instruccin o mtodo, cuyo nombre coincide con uno de los nombres asignados, es preciso entonces identificarlos explcitamente. Para ello se sita delante del nombre de la funcin intrnseca, instruccin o mtodo, el nombre de la biblioteca de tipos asociada. Por ejemplo, si utiliza una variable llamada Left, la nica forma de utilizar la funcin Left es escribiendo VBA.Left. Los nombres no se pueden repetir dentro del mismo nivel de alcance. Por ejemplo, no se pueden declarar dos variables con el nombre edad dentro del mismo procedimiento. Sin embargo, se puede declarar una variable privada edad y una variable de nivel de procedimiento llamada edad dentro del mismo mdulo. Nota: Visual Basic no diferencia entre maysculas y minsculas, pero respeta la forma en que se escriben las instrucciones de declaracin de nombres.
Declaracin de variables
Para declarar variables se utiliza normalmente una instruccin Dim. La instruccin de declaracin puede incluirse en un procedimiento para crear una variable de nivel de procedimiento. O puede colocarse al principio de un mdulo, en la seccin Declarations, para crear una variable de nivel de mdulo. El siguiente ejemplo crea la variable NombreTexto y especficamente le asigna el tipo de datos String.
Informtica Facultad de Ingeniera - UNNE 3
Si esta instruccin aparece dentro de un procedimiento, la variable NombreTexto se puede usar slo en ese procedimiento. Si la instruccin aparece en la seccin Declarations del mdulo, la variable NombreTexto estar disponible en todos los procedimientos dentro del mdulo, pero para los restantes mdulos del proyecto. Para hacer que esta variable est disponible para todos los procedimientos de un proyecto, basta con comenzar la declaracin con la instruccin Public, tal y como muestra el siguiente ejemplo:
Public NombreTexto As String
Si desea ms informacin sobre cmo dar nombre a sus variables, puede consultar la seccin "Visual Basic Naming Rules" en la Ayuda de Visual Basic. Las variables se pueden declarar como de uno de los siguientes tipos de datos: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (para cadenas de longitud variable), String * longitud (para cadenas de longitud fija), Object, o Variant. Si no se especifica el tipo de datos, el tipo de datos Variant es el predefinido. Tambin es posible crear un tipo definido por el usuario empleando la instruccin Type. Si desea ms informacin sobre tipos de datos puede consultar la seccin "Tipo de datos Summary" en la Ayuda de Visual Basic. Se pueden declarar varias variables en una instruccin. Para especificar el tipo de datos se debe incluir un tipo de datos para cada variable. En la siguiente instruccin se declaran las variables intX, intY, e intZ como del tipo Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
En la siguiente instruccin, intX e intY se declaran como del tipo Variant; y slo intZ se declara como del tipo Integer.
Dim intX, intY, intZ As Integer
No es necesario especificar el tipo de datos en la instruccin de declaracin. Si se omite, la variable ser del tipo Variant. Utilizar la instruccin Public La instruccin Public se puede utilizar para declarar variables pblicas de nivel de mdulo.
Public NombreTexto As String
Las variables pblicas se pueden usar en cualquier procedimiento del proyecto. Si una variable pblica se declara en un mdulo estndar o en un mdulo de clase, tambin se podr usar en los proyectos referenciados por el proyecto en que se declara la variable pblica. Utilizar la instruccin Private
Informtica Facultad de Ingeniera - UNNE 4
La instruccin Private se puede usar para declarar variables privadas de nivel de mdulo, no dentro de procedimientos (all se declara con Dim y las variables siempre son privadas al procedimiento).
Private MiNombre As String
Las variables Private pueden ser usadas nicamente por procedimientos pertenecientes al mismo mdulo. Nota: Cuando se utiliza a nivel de mdulo, la instruccin Dim es equivalente a la instruccin Private. Sera aconsejable usar la instruccin Private para facilitar la lectura y comprensin del cdigo. Utilizar la instruccin Static Cuando se utiliza la instruccin Static en lugar de la instruccin Dim, la variable declarada mantendr su valor entre llamadas sucesivas. Utilizar la instruccin Option Explicit En Visual Basic se puede declarar implcitamente una variable usndola en una instruccin de asignacin. Todas las variables que se definen implcitamente son del tipo Variant. Las variables del tipo Variant consumen ms recursos de memoria que la mayor parte de las otros tipos de variables. Su aplicacin ser ms eficiente si se declaran explcitamente las variables y se les asigna un tipo de datos especfico. Al declararse explcitamente las variables se reduce la posibilidad de errores de nombres y el uso de nombres errneos. Si no desea que Visual Basic realice declaraciones implcitas, puede incluir en un mdulo la instruccin Option Explicit antes de todos los procedimientos. Esta instruccin exige que todas las variables del mdulo se declaren explcitamente. Si un mdulo incluye la instruccin Option Explicit, se producir un error en tiempo de compilacin cuando Visual Basic encuentre un nombre de variable que no ha sido previamente declarado, o cuyo nombre se ha escrito incorrectamente. Se puede seleccionar una opcin del entorno de programacin de Visual Basic para incluir automticamente la instruccin Option Explicit en todos los nuevos mdulos. Consulte la documentacin de su aplicacin para encontrar la forma de modificar las opciones de entorno de Visual Basic. Tenga en cuenta que esta opcin no tiene ningn efecto sobre el cdigo que se haya escrito con anterioridad. Nota: Las matrices fijas y dinmicas siempre se tiene que declarar explcitamente.
Declaracin de matrices
Informtica Facultad de Ingeniera - UNNE 5
Las matrices se declaran igual que las restantes variables, utilizando instrucciones Dim, Static, Private, o Public. La diferencia entre las variables escalares (aquellas que no son matrices) y las variables matriz es que normalmente se debe especificar el tamao de la matriz. Una matriz con un tamao especificado es una matriz de tamao fijo. Una matriz cuyo tamao puede cambiar mientras el programa se est ejecutando es una matriz dinmica. Si una matriz se indexa desde 0 desde 1 depende del valor de la instruccin Option Base. Si Option Base 1 no se especifica, todos los ndices de matrices comienzan en cero. Declarar una matriz fija En la siguiente lnea de cdigo se declara como matriz Integer una matriz de tamao fijo con 11 filas y 11 columnas:
Dim MiMatriz(10, 10) As Integer
El primer argumento corresponde al nmero de filas y el segundo al nmero de columnas. Como sucede en cualquier otra declaracin de variable, a menos que se especifique para la matriz un tipo de datos, los elementos de sta sern del tipo Variant. Cada elemento numrico Variant de la matriz utiliza 16 bytes. Cada elemento de cadena Variant utiliza 22 bytes. Para escribir cdigo de la forma ms compacta posible, debe declarar explcitamente sus matrices con un tipo de datos distinto a Variant. Las siguientes lneas de cdigo comparan el tamao de varias matrices:
' Una matriz Integer utiliza 22 bytes (11 elementos * 2 bytes). ReDim MiMatrizInteger(10) As Integer ' Una matriz Double-precision utiliza 88 bytes (11 elementos * 8 bytes). ReDim MiMatrizDoble(10) As Double ' Una matriz Variant utiliza al menos 176 bytes (11 elementos * 16 bytes). ReDim MiMatrizVariant(10) ' La matriz Integer utiliza 100 * 100 * 2 bytes (20.000 bytes). ReDim MiMatrizInteger(99, 99) As Integer ' La matriz Double-precision utiliza 100 * 100 * 8 bytes (80.000 bytes). ReDim MiMatrizDoble (99, 99) As Double ' La matriz Variant utiliza al menos 160.000 bytes (100 * 100 * 16 bytes). ReDim MiMatrizVariant(99, 99)
El tamao mximo de una matriz depende del sistema operativo y de la cantidad de memoria disponible. Es ms lento utilizar una matriz que sobrepasa la cantidad de memoria RAM disponible en el sistema ya que los datos tienen que ser ledos y escritos del disco. Declarar una matriz dinmica
Informtica Facultad de Ingeniera - UNNE 6
Al declarar una matriz dinmica se puede cambiar el tamao de una matriz mientras que el cdigo se est ejecutando. Para declarar una matriz dinmica se usan las instrucciones Static, Dim, Private, o Public, dejando los parntesis vacos, tal y como se muestra en el siguiente ejemplo.
Dim MatrizSingle() As Single
Nota: Se puede usar la instruccin ReDim para declarar implcitamente una matriz dentro de un procedimiento. Tenga cuidado para no cambiar el nombre de la matriz cuando use la instruccin ReDim, ya que se crear una segunda matriz incluso en el caso de que se haya incluido la instruccin Option Explicit en el mdulo. La instruccin ReDim se puede utilizar en un procedimiento, dentro del alcance de la matriz, para cambiar el nmero de dimensiones, definir el nmero de elementos y para definir los lmites superior e inferior para cada dimensin. Se puede usar la instruccin ReDim para modificar la matriz dinmica cuantas veces sea necesario. Sin embargo, cada vez que se hace, se pierden los valores almacenados en la matriz. Se puede usar la instruccin ReDim Preserve para ampliar una matriz conservando los valores que contiene. Por ejemplo, la siguiente instruccin aade 10 nuevos elementos a la matriz MatrizVar sin perder los valores almacenados en los elementos originales.
ReDim Preserve MatrizVar(UBound(MatrizVar) + 10)
Nota: Cuando se utiliza la palabra clave Preserve con una matriz dinmica, slo se puede cambiar el lmite superior de la ltima dimensin, no pudiendo modificarse el nmero de dimensiones.
Declaracin de constantes
Al declarar una constante, se puede asignar a un valor un nombre que tenga algn significado apropiado. La instruccin Const se utiliza para declarar una constante y darle valor. Una constante no puede modificarse o cambiar de valor una vez que ha sido declarada. Se puede declarar una constante dentro de un procedimiento o al principio de un mdulo, en la seccin de Declarations. Las constantes a nivel de mdulo son privadas, a menos que se especifique lo contrario. Para declarar una constante pblica a nivel de mdulo, la instruccin Const debe ir precedida por la palabra clave Public. Se puede declarar explcitamente una constante como privada colocando la palabra clave Private antes de la instruccin Const para facilitar la lectura y comprensin del cdigo. Si desea ms informacin, consulte la seccin "Comprender el alcance y la visibilidad" en la Ayuda de Visual Basic. El siguiente ejemplo declara la constante Public EdadCon como un Integer y le asigna el valor 34.
Informtica Facultad de Ingeniera - UNNE 7
Las constantes se pueden declarar de uno de los siguientes tipos de datos: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, o Variant. Dado que ya se conoce el valor de una constante, es muy fcil elegir el tipo de datos en la instruccin Const. Si desea ms informacin sobre tipos de datos, consulte la seccin "Tipo de datos" en la Ayuda de Visual Basic. En una sola instruccin se pueden declarar varias constantes. Para especificar un tipo de datos, debe incluirse el tipo de datos para cada constante. En la siguiente instruccin se declaran como Integer las constantes EdadCon y SalarioCon.
Const EdadCon As Integer = 34, SalarioCon As Currency = 35000
Este error puede resultar menos evidente cuando dos procedimientos se llaman uno al otro de forma indefinida, o cuando nunca se cumple la condicin definida como fin de un bucle. Las funciones recursivas tienen diversos usos. Por ejemplo, el siguiente procedimiento utiliza una funcin recursiva para calcular el factorial:
Function Factorial (N) If N <= 1 Then ' Se ha llegado al fin de las llamadas recursivos. Factorial = 1 ' (N = 0) abandona las llamadas. Else ' Llama nuevamente a Factorial si N > 0. Factorial = Factorial(N - 1) * N End If End Function
Debe probar el procedimiento recursivo para comprobar que no se llama a s mismo tantas veces que agota la memoria disponible. Si se produce un error, compruebe que el procedimiento no se llama a s mismo de forma indefinida. Si no es as, trate de ahorrar memoria mediante:
Un nuevo estudio de la lgica del procedimiento. A menudo es posible sustituir bucles anidados por un procedimiento recursivo.
Utilizar bucles para repetir cdigo Empleando bucles es posible ejecutar un grupo de instrucciones de forma repetida. Algunos bucles repiten las instrucciones hasta que una condicin es False, otros las repiten hasta que la condicin es True. Hay tambin bucles que repiten un conjunto de instrucciones un nmero determinado de veces o una vez para cada objeto de una coleccin. Elegir el bucle a utilizar: Do...Loop: sigue en el bucle mientras o hasta una condicin sea True. For...Next: utiliza un contador para ejecutar las instrucciones un nmero determinado de veces. For Each...Next: repite el grupo de instrucciones para cada uno de los objetos de una coleccin. Ejecutar varias instrucciones sobre el mismo objeto Normalmente, en Visual Basic, debe especificarse un objeto antes de poder ejecutar uno de sus mtodos o cambiar una de sus propiedades. Se puede usar la instruccin With para especificar un objeto una sola vez para una serie completa de instrucciones. With: Ejecutar una serie de instrucciones sobre el mismo objeto
Se puede usar la instruccin If...Then...Else para ejecutar una instruccin o bloque de instrucciones determinadas, dependiendo del valor de una condicin. Las instrucciones If...Then...Else se pueden anidar en tantos niveles como sea necesario. Sin embargo, para hacer ms legible el cdigo es aconsejable siempre que se pueda utilizar una instruccin Select Case en vez de recurrir a mltiples niveles de instrucciones If...Then...Else anidadas. Ejecutar una sola instruccin cuando una condicin es True: Para ejecutar una sola instruccin cuando una condicin es True, se puede usar la sintaxis de lnea nica de la instruccin If...Then...Else. El siguiente ejemplo muestra la sintaxis de lnea nica, en la que se omite el uso de la palabra clave Else:
Sub FijarFecha() miFecha = #13/2/95# If miFecha < Now Then miFecha = Now End Sub
Para ejecutar ms de una lnea de cdigo, es preciso utilizar la sintaxis de mltiples lneas. Esta sintaxis incluye la instruccin End If, tal como muestra el siguiente ejemplo:
Sub AvisoUsuario(valor as If valor = 0 Then Aviso.ForeColor = Aviso.Font.Bold = Aviso.Font.Italic End If End Sub Long) "Red" True = True
Ejecutar unas instrucciones determinadas si una condicin es True y ejecutar otras si es False: Use una instruccin If...Then...Else para definir dos bloques de instrucciones ejecutables: un bloque que se ejecutar cuando la condicin es True y el otro que se ejecutar si la condicin es False.
Sub AvisoUsuario(valor as If valor = 0 Then Aviso.ForeColor = Aviso.Font.Bold = Aviso.Font.Italic Else Aviso.Forecolor = Aviso.Font.Bold = Aviso.Font.Italic End If End Sub Long) vbRed True = True vbBlack False = False
Comprobar una segunda condicin si la primera condicin es False: Se pueden aadir instrucciones ElseIf a una instruccin If...Then...Else para comprobar una segunda condicin si la primera es False. Por ejemplo, el siguiente procedimiento funcin calcula una bonificacin salarial dependiendo de la clasificacin del trabajador. La instruccin que sigue a la instruccin Else slo se ejecuta cuando las condiciones de todas las restantes instrucciones If y ElseIf son False.
Informtica Facultad de Ingeniera - UNNE 10
Function Bonificacin(rendimiento, salario) If rendimiento = 1 Then Bonificacin = salario * 0.1 ElseIf rendimiento = 2 Then Bonificacin= salario * 0.09 ElseIf rendimiento = 3 Then Bonificacin = salario * 0.07 Else Bonificacin = 0 End If End Function
Mediante la palabra clave Step, se puede aumentar o disminuir la variable contador en el valor que se desee. En el siguiente ejemplo, la variable contador j se incrementa en 2 cada vez que se repite la ejecucin del bucle. Cuando el bucle deja de ejecutarse, total representa la suma de 2, 4, 6, 8 y 10.
Sub DosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "El total es " & total End Sub
Para disminuir la variable contador utilice un valor negativo en Step. Para disminuir la variable contador es preciso especificar un valor final que sea menor que el valor inicial. En el siguiente ejemplo, la variable contador miNum se disminuye en 2 cada vez que se repite el bucle. Cuando termina la ejecucin del bucle, total representa la suma de 16, 14, 12, 10, 8, 6, 4 y 2.
Sub NuevoTotal() For miNum = 16 To 2 Step -2 total = total + miNum Next miNum MsgBox "El total es " & total End Sub
11
Nota: No es necesario incluir el nombre de la variable contador despus de la instruccin Next. En los ejemplos anteriores, el nombre de la variable contador se ha incluido para facilitar la lectura del cdigo. Se puede abandonar una instruccin For...Next antes de que el contador alcance su valor final, para ello se utiliza la instruccin Exit For.
Instruccin SET
Set variable_objeto = {[New] expresin_objeto | Nothing} La sintaxis de la instruccin Set consta de las siguientes partes: Parte variable_objeto Descripcin Requerido. Nombre de la variable o de la propiedad; sigue las convenciones estndar de nombres de variables. Opcional. New se utiliza normalmente durante una declaracin para permitir la creacin implcita de un objeto. Cuando utiliza New con la instruccin Set se crea una nueva instancia de la clase. Si variable_objeto contena una referencia a un objeto, esta referencia se libera cuando se asigna el nuevo objeto. La palabra clave New no se puede utilizar para crear nuevas instancias de cualquier tipo de datos intrnseco ni para crear objetos dependientes. Requerido. Expresin que consiste en el nombre de un objeto, otra variable declarada del mismo tipo de objetos, o una funcin o mtodo que devuelve un objeto del mismo tipo de objeto. Opcional. Interrumpe una asociacin de variable_objeto con cualquier objeto especfico. Al asignar Nothing a variable_objeto se liberan todos los recursos del sistema y de memoria asociados con el objeto al que se hizo referencia previamente cuando ninguna otra variable se refiere a l.
New
expresin_objeto
Nothing
Comentarios Para ser vlido, variable_objeto debe ser un tipo de objeto coherente con el objeto que se le ha asignado. Las instrucciones Dim, Private, Public, ReDim y Static slo declaran una variable que se refiere a un objeto. No se har referencia a ningn objeto real hasta que use la instruccin Set para asignar un objeto especfico.
12
El siguiente ejemplo ilustra el uso de Dim para declarar una matriz del tipo Form1. Actualmente no existe ninguna instancia de Form1. Set asigna referencias a nuevas instancias de Form1 a la variable misFormulariosSecundarios. Este cdigo se podra utilizar para crear formularios secundarios en una aplicacin MDI.
Dim Set Set Set Set misFormulariosSecundarios(1 to misFormulariosSecundarios(1) = misFormulariosSecundarios(2) = misFormulariosSecundarios(3) = misFormulariosSecundarios(4) = 4) As Form1 New Form1 New Form1 New Form1 Nwq Form1
Generalmente, cuando usa Set para asignar una referencia de objeto a una variable, no se crea ninguna copia del objeto para esa variable. En su lugar se crea una referencia al objeto. Ms de una variable de objeto se puede referir al mismo objeto. Puesto que estas variables son referencias al objeto (no copias de l), cualquier cambio en el objeto se refleja en todas las variables que se refieren a l. No obstante, cuando utiliza la palabra clave New en la instruccin Set, en realidad est creando una instancia del objeto.
Conjunto Range
Representa una celda, una fila, una columna, una seleccin de celdas que contienen uno o ms bloques contiguos de celdas o un rango 3D.
Propiedad Range Propiedad Cells Range y Cells Propiedad Offset Mtodo Union
Propiedad Range
Use Range(arg), donde arg asigna un nombre al rango, para devolver un objeto Range que represente una sola celda o un rango de celdas. El ejemplo siguiente coloca el valor de la celda A1 en la celda A5.
Worksheets("Hoja1").Range("A5").Value = _ Worksheets("Hoja1").Range("A1").Value
El ejemplo siguiente rellena el rango A1:H8 con nmeros aleatorios estableciendo la frmula de cada celda del rango. La propiedad Range, si se emplea sin un calificador de objeto (un objeto colocado a la izquierda del punto), devuelve un rango de la hoja
Informtica Facultad de Ingeniera - UNNE 13
activa. Si la hoja activa no es una hoja de clculo, este mtodo no se llevar a cabo con xito. Use el mtodo Activate para activar una hoja de clculo antes de usar la propiedad Range sin un calificador de objeto explcito.
Worksheets("Hoja1").Activate Range("A1:H8").Formula = "=Rand()" ' El rango est en la hoja activa
Si usa un argumento de texto para la direccin del rango, deber especificar la direccin en notacin de estilo A1 (no podr usar la notacin F1C1).
Propiedad Cells
Use Cells(fila; columna), donde fila es el ndice de fila y columna es el ndice de columna, para devolver una sola celda. El ejemplo siguiente establece en 24 el valor de la celda A1.
Worksheets(1).Cells(1, 1).Value = 24
Aunque tambin puede usar Range("A1") para devolver la celda A1, en algunas ocasiones la propiedad Cells puede ser ms conveniente, ya que permite usar una variable para la fila o la columna. El ejemplo siguiente crea encabezados de fila y columna en la Hoja1. Tenga en cuenta que, despus de activar la hoja de clculo, puede usar la propiedad Cells sin una declaracin explcita de hoja (devuelve una celda de la hoja activa).
Sub SetUpTable() Worksheets("Hoja1").Activate For Ao = 1 To 5 Cells(1, Ao + 1).Value = 1990 + Ao Next Ao For Cuarto = 1 To 4 Cells(Cuarto + 1, 1).Value = "Q" & Cuarto Next Cuarto End Sub
Aunque podra usar funciones de cadena de Visual Basic para modificar las referencias de estilo A1, es mucho ms sencillo (y una mejor prctica de programacin) usar la notacin Cells(1, 1). Para devolver parte de un rango use expresin.Cells(fila; columna), donde expresin es una expresin que devuelve un objeto Range y fila y columna son relativas a la esquina superior izquierda del rango. El ejemplo siguiente establece la frmula de la celda C5.
Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"
14
Este ejemplo establece en Arial de 8 puntos la fuente y el tamao de fuente de todas las celdas de Hoja1.
With Worksheets("Hoja1").Cells.Font .Name = "Arial" .Size = 8 End With
Este ejemplo ejecuta un bucle en las celdas A1:J4 de Hoja1. Si una de las celdas contiene un valor menor que 0,001, el ejemplo reemplazar dicho valor por cero (0).
For rwIndex = 1 to 4 For colIndex = 1 to 10 With Worksheets("Hoja1").Cells(rwIndex, colIndex) If .Value < .001 Then .Value = 0 End With Next colIndex Next rwIndex
Este ejemplo establece el estilo de fuente de las celdas A1:C5 de Hoja1 como cursiva.
Worksheets("Hoja1").Activate Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True
Este ejemplo examina una columna de datos denominada "miRango". Si una celda contiene el mismo valor que la celda inmediatamente superior, el ejemplo mostrar la direccin de la celda que contiene los datos duplicados.
Set r = Range("miRango") For n = 1 To r.Rows.Count If r.Cells(n, 1) = r.Cells(n + 1, 1) Then MsgBox "Hay duplicacin en " & r.Cells(n + 1, 1).Address End If Next n
Range y Cells
Para devolver un objeto Range use Range(celda1; celda2), donde celda1 y celda2 son objetos Range que especifican las celdas inicial y final. El ejemplo siguiente establece el estilo de lnea de los bordes de las celdas A1:J10.
With Worksheets(1) .Range(.Cells(1, 1), _ .Cells(10, 10)).Borders.LineStyle = xlThick
15
End With
Observe el punto delante de cada propiedad Cells. El punto es necesario si el resultado del enunciado With precedente se aplica a la propiedad Cells, en cuyo caso, se indica que las celdas estn en la hoja de clculo uno (sin el punto, la propiedad Cells devolvera las celdas de la hoja activa).
Propiedad Offset
Use Offset(fila; columna), donde fila y columna son los desplazamientos de fila y columna, para devolver un rango con un desplazamiento especfico con respecto a otro. El ejemplo siguiente selecciona la celda situada tres filas debajo y una columna a la derecha de la celda de la esquina superior izquierda de la seleccin actual. No se puede seleccionar una celda que no est en la hoja activa, por lo que primero deber activar la hoja.
Worksheets("Hoja1").Activate 'Can't select unless the sheet is active Selection.Offset(3, 1).Range("A1").Select
Mtodo Union
Use Union(rango1, rango2, ...) para devolver rangos de varias reas, es decir, rangos compuestos por dos o ms bloques contiguos de celdas. El ejemplo siguiente crea un objeto definido como la unin de los rangos A1:B2 y C3:D4 y, a continuacin, selecciona el rango definido.
Dim r1 As Range, r2 As Range, myMultiAreaRange As Range Worksheets("Hoja1").Activate Set r1 = Range("A1:B2") Set r2 = Range("C3:D4") Set myMultiAreaRange = Union(r1, r2) myMultiAreaRange.Select
La propiedad Areas es muy til para trabajar con selecciones que contienen varias reas. Divide una seleccin de varias reas en objetos Range individuales y despus devuelve los objetos en forma de conjunto. Puede usar la propiedad Count del conjunto devuelto para comprobar una seleccin que contiene varias reas, como se muestra en el siguiente ejemplo.
Sub NoMultiAreaSelection() NumberOfSelectedAreas = Selection.Areas.Count If NumberOfSelectedAreas > 1 Then MsgBox "No puede utilizar este comando " & _ "en una seleccin multi-reas" End If End Sub
Propiedad ActiveCell
Devuelve un objeto Range que representa la celda activa de la ventana activa (la ventana superior) o de la ventana especificada. Si la ventana no contiene una hoja de clculo, esta propiedad fallar. Es de slo lectura.
Comentarios
Si no especifica un calificador de objeto, esta propiedad devolver la celda activa de la ventana activa. Celda activa no es lo mismo que seleccin. La celda activa es una sola celda de la seleccin actual. La seleccin puede contener ms de una celda, pero slo una es la celda activa. Todas las expresiones siguientes devuelven la celda activa y son equivalentes:
ActiveCell Application.ActiveCell ActiveWindow.ActiveCell Application.ActiveWindow.ActiveCell
Ejemplo
Este ejemplo usa un cuadro de mensaje para mostrar el valor de la celda activa. Puesto que la propiedad ActiveCell falla si la hoja activa no es una hoja de clculo, el ejemplo activar Hoja1 antes de utilizar la propiedad ActiveCell.
Worksheets("Hoja1").Activate MsgBox ActiveCell.Value
Propiedad Column
Devuelve el nmero de la primera columna del primer rea del rango especificado. Long de slo lectura.
Comentarios
Column A devuelve 1, column B devuelve 2 y as sucesivamente.
Informtica Facultad de Ingeniera - UNNE 17
Para devolver el nmero de la ltima columna del rango, use la siguiente expresin:
myRange.Columns(myRange.Columns.Count).Column
Ejemplo
Este ejemplo establece en 4 puntos el ancho de las columnas salteadas de Hoja1.
For Each col In Worksheets("Hoja1").Columns If col.Column Mod 2 = 0 Then col.ColumnWidth = 4 End If Next col
Propiedad Columns
Propiedad Columns tal como se aplica al objeto Application. Devuelve un objeto Range que representa todas las columnas de la hoja de clculo activa. Si el documento activo no es una hoja de clculo, esta propiedad fallar. Es de slo lectura. expresin.Columns expresin: Requerida. Expresin que devuelve un objeto de la lista Aplicar a.
Propiedad Columns tal como se aplica al objeto Range. Devuelve un objeto Range que representa las columnas del rango especificado. Es de slo lectura. expresin.Columns expresin: Requerida. Expresin que devuelve un objeto de la lista Aplicar a. Propiedad Columns tal como se aplica al objeto WorkSheet. Devuelve un objeto Range que representa todas las columnas de la hoja de clculo especificada. Es de slo lectura. expresin.Columns expresin: Requerida. Expresin que devuelve un objeto de la lista Aplicar a. Para obtener informacin sobre cmo devolver un solo elemento de un conjunto, consulte Devolver un objeto de un conjunto.
Informtica Facultad de Ingeniera - UNNE 18
Comentarios
El uso de esta propiedad sin calificador de objeto equivale a usar ActiveSheet.Columns. Si se aplica a un objeto Range que sea una seleccin de varias reas, la propiedad slo devolver las columnas de la primera rea del rango. Por ejemplo, si el objeto Range tiene dos reas - A1:B2 y C3:D4 - Selection.Columns.Count devuelve 2, no 4. Si desea utilizar esta propiedad en un rango que puede contener una seleccin de varias reas, compruebe Areas.Count para determinar si el rango contiene ms de una rea. En ese caso, ejecute un bucle sobre cada rea del rango.
Ejemplo
Este ejemplo da formato de negrita a la fuente de la columna uno (columna A) de Hoja1.
Worksheets("Hoja1").Columns(1).Font.Bold = True
Este ejemplo establece como 0 (cero) el valor de todas las celdas de la columna uno del rango denominado "miRango".
Range("miRango").Columns(1).Value = 0
Este ejemplo muestra el nmero de columnas de la seleccin de Hoja1. Si se ha seleccionado ms de una rea, el ejemplo ejecutar un bucle en cada rea.
Worksheets("Hoja1").Activate areaCount = Selection.Areas.Count If areaCount <= 1 Then MsgBox "La seleccin contiene " & _ Selection.Columns.Count & " columnas." Else For i = 1 To areaCount MsgBox "Area " & i & " de la seleccin contiene " & _ Selection.Areas(i).Columns.Count & " columnas." Next i End If
Propiedad EntireColumn
Devuelve un objeto Range que representa toda la columna (o columnas) que contiene el rango especificado. Es de slo lectura.
Ejemplo
Este ejemplo establece el valor de la primera celda de la columna que contiene la celda activa. El ejemplo debe ejecutarse desde una hoja de clculo.
ActiveCell.EntireColumn.Cells(1, 1).Value = 5
Propiedad Row
Informtica Facultad de Ingeniera - UNNE 19
Devuelve el nmero de la primera fila de la primera rea del rango. Long de slo lectura.
Ejemplo
Este ejemplo establece en 4 puntos el alto de las filas alternativas de Hoja1.
For Each rw In Worksheets("Hoja1").Rows If rw.Row Mod 2 = 0 Then rw.RowHeight = 4 End If Next rw
Propiedad Rows
Para un objeto Application, devuelve un objeto Range que representa todas las filas de la hoja de clculo activa. Si el documento activo no es una hoja de clculo, esta propiedad fallar. Para un objeto Range, devuelve un objeto Range que representa las filas del rango especificado. Para un objeto Worksheet, devuelve un objeto Range que representa todas las filas de la hoja de clculo especificada. Objeto Range de slo lectura.
Comentarios
Para obtener informacin sobre cmo devolver un solo elemento de un conjunto, consulte Devolver un objeto de un conjunto. El uso de esta propiedad sin calificador de objeto equivale a usar ActiveSheet.Rows. Si se aplica a un objeto Range que es una seleccin mltiple, la propiedad slo devolver las filas de la primera rea del rango. Por ejemplo, si el objeto Range tiene dos reas -A1:B2 y C3:D4- Selection.Rows.Count devuelve 2, no 4. Si desea utilizar esta propiedad en un rango que puede contener una seleccin mltiple, compruebe Areas.Count para determinar si el rango es una seleccin mltiple. En ese caso, ejecute un bucle sobre cada rea del rango, como se muestra en el tercer ejemplo.
Ejemplo
Este ejemplo elimina la fila tres de Hoja1.
Worksheets("Hoja1").Rows(3).Delete
Este ejemplo elimina las filas de la regin actual de la hoja de clculo uno en las que el valor de la celda uno de la fila es el mismo que el valor de la celda uno de la fila anterior.
For Each rw In Worksheets(1).Cells(1, 1).CurrentRegion.Rows this = rw.Cells(1, 1).Value If this = last Then rw.Delete last = this Next
20
Este ejemplo muestra el nmero de filas de la seleccin de Hoja1. Si se ha seleccionado ms de una rea, el ejemplo ejecutar un bucle en cada rea.
Worksheets("Hoja1").Activate areaCount = Selection.Areas.Count If areaCount <= 1 Then MsgBox "La seleccin contiene " & _ Selection.Rows.Count & " filas." Else i = 1 For Each a In Selection.Areas MsgBox "Area " & i & " de la seleccin contiene " & _ a.Rows.Count & " filas." i = i + 1 Next a End If
Propiedad EntireRow
Devuelve un objeto Range que representa toda la fila (o filas) que contiene el rango especificado. Es de slo lectura.
Ejemplo
Este ejemplo establece el valor de la primera celda de la fila que contiene la celda activa. El ejemplo debe ejecutarse desde una hoja de clculo.
ActiveCell.EntireRow.Cells(1, 1).Value = 5
Propiedad Formula
Veremos esta propiedad, tal como se aplica al objeto Range. Devuelve o establece la frmula del objeto en notacin de estilo A1 y en el lenguaje de la macro. Variant de Lectura/Escritura. expresin.Formula expresin: Requerida. Expresin que devuelve un objeto Range.
Comentarios
Si la celda contiene una constante, esta propiedad la devolver. Si la celda est vaca, la propiedad Formula devuelve una cadena vaca. Si la celda contiene una frmula, la propiedad Formula devuelve la frmula como una cadena con el mismo formato en que se presentara en la barra de frmulas (incluido el signo igual).
Informtica Facultad de Ingeniera - UNNE
21
Si se define el valor o la frmula de una celda como una fecha, Microsoft Excel comprobar si dicha celda ya tiene uno de los formatos numricos de fecha u hora. De lo contrario, cambiar el formato numrico al formato numrico de fecha corto predeterminado. Si el rango tiene una o dos dimensiones, puede definir la frmula conforme a una matriz de Visual Basic de las mismas dimensiones. Asimismo, es posible introducir la frmula en una matriz de Visual Basic. Si define la frmula para un rango de varias celdas, se rellenarn todas las celdas del rango con la frmula.
Ejemplo
Este ejemplo establece la frmula de la celda A1 de Hoja1.
Worksheets("Hoja1").Range("A1").Formula = "=$A$4+$A$10"
Propiedad Value
Veremos tal como se aplica al objeto Range. Devuelve o establece el valor del rango especificado. Variant de Lectura/Escritura. expresin.Value(RangeValueDataType) expresin: Requerida. Expresin que devuelve un objeto Range. RangeValueDataType: Variant opcional. Tipo de datos del valor del rango. Puede ser una constante xlRangeValueDataType. xlRangeValueDataType puede ser una de estas constantes xlRangeValueDataType. xlRangeValueDefault: default. Si el objeto Range est vaco, devuelve el valor Empty (utilice la funcin IsEmpty para comprobar si este es el caso). Si el objeto Range contiene ms de una celda, devuelve una matriz de valores (utilice la funcin IsArray para comprobar ese caso). xlRangeValueMSPersistXML: Devuelve la representacin del conjunto de registros del objeto Range expecificado en formato XML. xlRangeValueXMLSpreadsheet: Devuelve los valores, formatos, frmulas y nombres del objeto Range especificado en formato de hoja de clculo XML.
22
Comentarios
Al definir un rango de celdas con el contenido de un archivo de hoja de clculo XML, slo se utilizan los valores de la primera hoja del libro. No se puede definir un rango de celdas no contiguas en formato de hoja de clculo XML.
Ejemplo
Este ejemplo establece el valor de la celda A1 de Hoja1 como 3.14159.
Worksheets("Hoja1").Range("A1").Value = 3.14159
Este ejemplo ejecuta un bucle sobre las celdas A1:D10 de Hoja1. Si una de las celdas tiene un valor menor que 0.001 el cdigo sustituir el valor por 0 (cero).
For Each c in Worksheets("Hoja1").Range("A1:D10") If c.Value < .001 Then c.Value = 0 End If Next c
Nota: Cuando usa las propiedades Offset y Resize, como en los ejemplos de abajo, puede sustituir los nmeros entre parntesis por una expresin numrica.
Range("A1").CurrentRegion.Select varNbRows=Selection.Rows.Count Range("A1").Offset(varNbRows - 1,0).Select
Seleccionar otro libro distinto (el libro debe estar abierto; no olvidar el ".xls"):
Windows("Totales.xls").Activate
23
Nota : Puede crear una variable y usarla como desplazamiento, como se indica:
varFilaInicial = Range("A1").CurrentRegion.Rows.Count ActiveCell.Offset([varFilaInicial], 0).Select
ActiveCell.EntireRow.Select ActiveCell.EntireColumn.Select
Para seleccionar varias filas o columnas no contiguas: NOTA: Use el objeto "Range" y no Columns o Rows
Range("A:A, C:C, E:F").Select Range("1:1,5:6,9:9").Select
Para seleccionar un rango desde la celda hasta la ltima celda no vaca en la columna:
Range("A1", Range("A1").End(xlDown)).Select Range(ActiveCell, ActiveCell.End(xlDown)).Select
Para seleccionar un rango desde la celda hasta la primera celda no vaca en la columna:
Range("A32", Range("A32").End(xlUp)).Select Range(ActiveCell, ActiveCell.End(xlUp)).Select
Para seleccionar un rango desde la celda hasta la ltima celda no vaca en la fila (por izquierda o derecha) (Notar el uso de xltoRight y de xltoLeft):
Range("A1", Range("A1").End(xltoRight)).Select Range(ActiveCell, ActiveCell.End(xltoLeft)).Select
24
Para redefinir el tamao del rango (de A1:B5 a A1:D10) Nota: un rango no es expandido sino que se redefine desde la celda activa.
Selection.Resize(4, 10).Select
y no
Selection.Resize(2, 5).Select
Si queremos seleccionar celdas que llamamos Var_1, Var_2 y Var_3, podemos usar el siguiente bucle:
Sub asigna() For i = 1 To 3 varNo1 = "Var_" & i Range([varNo1]).Select ....--- cualquier proceso con la celda seleccionada --Next i End Sub
25
GLOSARIO evento
Evento es toda accin que puede ser reconocida por un objeto, como puede ser el clic del mouse o la pulsacin de una tecla, y para la que es posible escribir cdigo como respuesta. Los eventos pueden ocurrir como resultado de una accin del usuario o del cdigo del programa, tambin pueden ser originados por el sistema.
instruccin
Una unidad sintcticamente completa que expresa un tipo de accin, declaracin o definicin. Normalmente una instruccin tiene una sola lnea aunque es posible utilizar dos puntos (:) para poner ms de una instruccin en una lnea. Tambin se puede utilizar un carcter de continuacin de lnea (_) para continuar una sola lnea lgica en una segunda lnea fsica. Si desea realizar un comentario, colocar al principio de la lnea la palabra REM o el signo apstrofe (').
mtodo
Un procedimiento que se aplica a un objeto.
mdulo
Un conjunto de declaraciones y procedimientos.
objeto (object)
Un objeto representa un elemento de una aplicacin, como una hoja de clculo, una celda, un diagrama, un formulario o un informe. En cdigo de Visual Basic, un objeto debe identificarse antes de que se pueda aplicar uno de los mtodos del objeto o cambiar el valor de una de sus propiedades.
propiedad (propertie)
Un atributo con nombre de un objeto. Las propiedades definen caractersticas de objetos, como tamao, color y ubicacin en la pantalla, o comportamientos de objetos, como si est o no habilitado.
procedimiento (procedure)
Una secuencia con nombre de instrucciones que se ejecutan como una unidad. Por ejemplo, Function, Property y Sub son todos tipos de procedimientos. Un nombre de procedimiento siempre se define a nivel de mdulo. Todo el cdigo ejecutable debe estar contenido en un procedimiento. Los procedimientos no se pueden anidar dentro de otros procedimientos. Es similar al concepto con el que antes llevaba el nombre de macros
26