Actualizado el 21 de Marzo del 2018 (Publicado el 11 de Marzo del 2018)
674 visualizaciones desde el 11 de Marzo del 2018
248,7 KB
6 paginas
Aula Macedonia
Curso de Programación en VBA para Excel
Artículo realizado por
Iñaki Ecenarro.
Capítulo 2. Celdas, rangos, libros y hojas.
En este capítulo vamos a aprender un poco más sobre cómo hacer referencia a celdas, rangos, hojas y libros.
Supongo que todos estos conceptos están claros, que todo el mundo sabe lo que es una celda o un rango, o la
diferencia entre un libro y una hoja.
Todos los ejemplos de este capítulo están incluídos en este fichero: Excel2.xls
(39kbs)
Bueno, para entrar en calor vamos a hacer una pequeña rutina que pida al usuario un valor y luego sume ese valor a
la celda activa.
Sub Sumar_A_Celda()
Dim i As Double
If MsgBox("Esta macro pide al usuario
un valor y lo suma a la celda activa.", _
vbOK, "Sumar a celda") = vbCancel Then Exit Sub
i = Val(InputBox("Importe a sumar: ", "Sumar a celda activa"))
ActiveCell.Value = ActiveCell.Value + i
End Sub
La primera línea es la declaración de la variable "i". Ya hemos comentado anteriormente lo que es la declaración de
variables, lo único nuevo es el tipo de variable (double). Cuando declaramos una variable hay que indicar qué tipo de
variable queremos que sea. Los tipos de variables más importantes son:
Integer
Long
Boolean
Single
Double
String
Date
Un valor entero, entre 32.768 y 32.767
Un valor entero, entre 2.147.483.648 y 2.147.483.647
Verdadero y Falso
Un valor con decimales, con precisión simple
Un valor con decimales, con precisión doble
Un cadena de caracteres
Una fecha
Object
Variant
Referencia a cualquier tipo de objeto de Excel
Un variable que puede cambiar de tipo
En este caso declaramos la variable como Double, por si acaso al usuario se le ocurre meter un valor con
decimales.
Siguiendo con nuestra rutina, primero presentamos al usuario un pequeño mensaje diciendo lo que vamos a hacer.
Esto está explicado en la entrega anterior, no creo que necesite nada más. Si el usuario pulsa "Cancelar", salimos
de la rutina y no hacemos nada.
En la siguiente línea obtenemos del usuario el valor que quiere sumar a la celda activa. La función InputBox ya la
hemos visto antes, obtiene del usuario una entrada, pero en formato de cadena de caracteres. Como nosotros lo que
queremos es un valor numérico, utilizamos la función Val() para convertir la cadena de caracteres proveniente de
InputBox en un número. Lo ponemos todo en la misma línea, pero también se podía haber escrito en dos líneas:
Dim s as String
s = InputBox("Importe a sumar: ", "Sumar a celda activa")
i = Val(s)
Bueno, seguramente queda más claro que de la otra forma, pero normalmente se escribe de la primera forma. Cada
uno que lo escriba como quiera, tampoco tiene demasiada trascendencia.
La última línea es la que hace realmente la suma, dando valor a la propiedad Value de
ActiveCell. Ya hemos visto en la entrega anterior lo que es ActiveCell. Una aclaración sobre
ActiveCell y ActiveSheet (que también vimos en la entrega anterior): en realidad, ActiveCell no
es un objeto, sino que es una "propiedad" de un objeto especial llamado Application, pero
cuando
escribiendo
"Application.ActiveCell". Application es un objeto que representa la aplicación Excel completa.
A través de Application se puede acceder a todas las opciones de la aplicación (las que
podemos cambiar a través de Herramientas, Opciones), acceder a las funciones de hoja de cálculo (SUMA,
PROMEDIO, etc) y también podemos obtener objetos que referencian a la celda activa (ActiveCell), la hoja activa
(ActiveSheet), el libro activo (ActiveWorkbook), etc.
"ActiveCell"
escribimos
Excel
entiende
que
estamos
Un pequeño ejemplo del uso del objeto Application: para mostrar y ocultar la barra de estado (la que aparece en la
parte de abajo, debajo de las etiquetas de las hojas), podemos usar el siguiente código:
Para ocultar la barra de estado:
Application.DisplayStatusBar = False
Para volver a mostrar la barra de estado:
Application.DisplayStatusBar = True
El objeto Application tiene un montón de propiedades y métodos, que están muy bien explicados en la ayuda de
Excel, y su uso es bastante sencillo.
Siguiendo con la última línea de la rutina, podrás comprobar que utilizamos la propiedad Value de ActiveCell. Si
hubiésemos utilizado la propiedad Formula en lugar de Value, la rutina tendría que ser un poco distinta. Utilizando
Value, estamos dando a la celda activa un valor directamente, es decir, si miras el contenido de la celda verás que
no hay ninguna fórmula; la suma la ha hecho nuestra rutina, y ha puesto en la celda el resultado de dicha suma.
Sin embargo, si queremos que la fórmula de la suma quede en la celda debemos usar la propiedad Formula. La
propiedad Formula es una "cadena de carácteres", que incluye todo lo que se escribiría normalmente en una celda
de una hoja de cálculo para introducir una fórmula (incluyendo el signo "=" al principio). Por ejemplo, si queremos
que poner en la celda A2 una fórmula que nos de el doble del valor de la celda A1, haremos:
Range("A2").Formula = "=A1*2"
Como es una cadena de caracteres, hay que rodearla con comillas dobles, y entre éstas ponemos la fórmula tal
como lo haríamos en la hoja de cálculo. Tras esta explicación, si queremos cambiar nuestra rutina para introducir la
fómula de suma en la celda, nuestro primer intento sería escribir:
ActiveCell.Formula = ActiveCell.Formula + i
Si ejecutamos este código veremos que el resultado puede variar dependiendo de lo que contenga la celda activa:
Si la celda activa contiene un número (no una fórmula), el resultado es el mismo que antes. La razón es que
como no hay ninguna fórmula ActiveCell.Formula devuelve un número, igual que ActiveCell.Value. Luego le
sumamos nuestro valor y asignamos el valor resultante como fórmula de la celda.
Si la celda activa contiene una fórmula, el resultado es que la macro se para con un error. Esto es debido a
que ActiveCell.Fórmula nos devuelve una cadena de caracteres (por ejemplo, la cadena "=A1*2"), y luego
estamos intentando sumar un número (i) a una cadena de caracteres, cosa que evidentemente no se puede
hacer y Excel nos da un error de tipos de datos incompatibles.
Para conseguir
ActiveCell.Formula una cadena de caracteres con una fórmula escrita correctamente. Vamos a intentarlo:
lo que realmente queremos (introducir una
fórmula en
la celda), debemos asignar a
ActiveCell.Formula = ActiveCell.Formula & "+" & i
El operador & ya lo vimos en la primera entrega, se utiliza para concatenar cadenas de caracteres. Partimos de la
fórmula que actualmente tiene la celda activa (por ejemplo, "=A1*2") y luego le añadimos un signo "+" y luego
nuestro valor (i), con lo que la fórmula pasará a ser "=A1*2+3" (si i tiene el valor 3).
El problema que se nos presenta ahora es que si en la celda activa no hay una celda, sino un valor (por ejemplo, 2),
nosotros asignaremos a ActiveCell.Formula la cadena "2+3" (si i tiene el valor 3). ¿Veis el error? Evidentemente el
error es que falta el signo "=" al principio de la fórmula para decirle a Excel que es una fórmula. O sea que
deberíamos añadir delante de la fórmula un "=", lo que podemos hacer de la siguiente forma:
ActiveCell.Formula = "=" & ActiveCell.Formula & "+" & i
¿Cuál es el problema ahora? Pues que si la celda activa tiene una fórmula nos encontramos con que nuestra fórmula
definitiva tiene dos signos "=" al principio, uno el que ya tenía y otro el que le hemos puesto nosotros. El resultado
es que introducimos una fórmula incorrecta y Excel nos vuelve a dar un error.
Bueno, creo que he montado un pequeño lío, pero en realidad no tiene ninguna dificultad. Lo que hay que hacer es
comprobar si en la celda activa hay una fórmula (esto se puede hacer mirando si el primer carácter es el signo "=",
utilizando por ejemplo la función Left). Si hay una fórmula, sólo añadimos la parte del final, y si no hay una fórmula
añadimos primero un signo "=" y luego la parte del final. Esto queda como ejercicio, y si no te sale me escribes y lo
comentamos.
Pues aparte de todo este lío ya lo hemos visto todo. Si ejecutas la rutina Sumar_A_Celda() comprobarás que
primero te pide un valor y luego suma ese valor a la celda activa. Por cierto, que nadie piense que esta macro es
ninguna maravilla, porque lo mismo que hace se puede hacer más rápido utilizando "Pegado especial..", que además
es capaz de restar, multiplicar y dividir. Ya llegaremos a eso también, pero para ir aprendiendo un poco no nos viene
mal.
Ahora vamos a avanzar otro paso: la rutina anterior sumaba un valor a la celda activa, y ahora vamos a sumar ese
valor a todo el rango que seleccione el usuario. Como siempre, aquí va la rutina completa, luego la explicamos:
Sub Sumar_A_Rango()
Dim i As Double
suma a todas las celdas " & _
Dim h As Object
If MsgBox("Esta macro pide al usuario un valor y lo
Chr(13) & "del rango seleccionado.", vbOK, "Copiar
= vbCancel Then Exit Sub
i = Val(InputBox("Importe a sumar: ", "Sumar a rango seleccionado"))
For Each h In Selection.Cells
h.Value = h.Value + i
Next h
End Sub
celda izquierda") _
Lo primero que hacemos es declarar las variables. La primera variable (i), es de tipo Double, al igual que en la rutina
anterior. La segunda variable (h) la declaramos como una variable de tipo Object, para que apunte a cualquier tipo de
objeto de Excel (una hoja, un rango, una celda, etc.)
Las dos siguientes líneas son iguales que antes: primero presentamos un pequeño mensaje al usuario, y luego
obtenemos el valor y convertimos la cadena a un valor numérico.
En las tres siguientes líneas está todo lo nuevo. Vamos
Comentarios de: Curso de programación en VBA para Excel - Capítulo 2. Celdas, rangos, libros y hojas (0)
No hay comentarios