Вы находитесь на странице: 1из 9

VBA CONCEPTOS E INSTRUCCIONES BSICAS

Como casi siempre hay ms de una forma de programar un evento, podrn observar que a veces se escribe una lnea O la otra.
Quiere decir que puedo utilizar cualquiera de las 2. (Nunca las 2 juntas!)

MACRO: Una macro es un conjunto de instrucciones escritas en lenguaje Visual Basic , que nos permite automatizar ciertas tareas
que la aplicacin no contempla desde las herramientas de la hoja.
Por ejemplo, si necesitamos que se inserten automticamente 2 hojas nuevas al abrir un libro, recurriremos a una macro.
Otros casos: completar alguna tarea cada vez que se ingresa un valor en una celda o rango de celdas; realizar un cierto control
antes de imprimir, guardar o cerrar el libro, etc. Son todas tareas que pueden ser automatizadas mediante rutinas o macros.
Cmo se crea una macro: para automatizar una tarea mediante una macro bsicamente se necesitan los siguientes elementos:
1- un espacio de trabajo donde escribir las instrucciones o rutinas que harn esas tareas: el Editor de Macros. A este espacio se
accede desde men Herramientas, Macros, Editor o con el atajo de teclado Alt+F11.



Una vez en ese 'espacio', escribiremos o copiaremos las rutinas en:
a- alguno de los objetos (hoja o libro) que seleccionemos con doble clic en el panel de Objetos que se encuentra a la
izquierda del Editor.
b- insertando mdulos
c- o insertando formularios personales o Userforms.
2- una accin que har que la tarea programada se ejecute. A esto llamamos 'Eventos' que inician una macro y pueden
ser: abrir o cerrar un libro, entrar o salir de una hoja, cambios o seleccin de celdas, antes de imprimir o guardar, el 'clic' en
un botn de comando, al presionar un atajo de teclado, y otros ms.
3- un lenguaje de programacin. En Excel utilizamos VBA (Visual Basic para Aplicaciones)
4- Ocasionalmente un formulario donde trabajar para luego volcar los resultados en las hojas: llamados Userforms.
Dnde colocar o escribir la macro: esto depender de lo que deba ejecutar nuestra rutina.

Si las instrucciones se deben ejecutar, por ejemplo, al abrir o cerrar un libro, se colocan en el objeto ThisWorkbook (o EsteLibro
segn la versin).
Si las instrucciones se deben ejecutar al entrar o salir de una hoja o al seleccionar o modificar una celda, se colocan en el objeto
Hoja. Estos objetos se encuentran en el margen izquierdo del Editor, en la ventana Proyecto-VBAProyect
Si nuestra rutina ser llamada con un botn, atajo de teclado o desde otra rutina, se colocar en un mdulo (estando en el Editor,
men Insertar, Mdulo).
Las instrucciones para los controles de un formulario o Userforms se colocan en la seccin Cdigo del mismo formulario.
Cmo ejecutar una macro: En el punto anterior se menciona que se necesita una 'accin' que dispare o ejecute una macro
grabada. Veamos los distintos casos:
1- Una accin automtica resultado de un evento, ya sea a nivel libro, hoja, rango o celda
En este grupo se encuentran las rutinas que se ejecutan en la apertura o cierre de libro, al entrar o salir de una hoja, al seleccionar o
cambiar valores en celda Son las que se colocan en el objeto HOJA o ThisWorkbook, como se menciona en tema anterior
2- Al presionar un botn dibujado en la hoja. Podemos utilizar botones de la barra'Cuadro de controles o ActiveX' o de la barra
'Formularios'. En versin 2003 se encuentra en Men Ver, Barras de Herramientas. En versin 2007 desde la fichaProgramador
Dibujamos el control en la hoja, ajustamos algunas propiedades como texto, tamao, ubicacin. Al hacer clic derecho sobre el
control optamos por 'Ver cdigo' o 'Asignar macro' segn qu barra de herramientas hemos utilizado.
a- Cuadro de controles: al optar por 'Ver cdigo' nos llevar al Editor, al objeto HOJA donde se generar automticamente
una rutina con estas 2 instrucciones:
Private Sub CommandButton1_click()
'aqu escribiremos nuestras instrucciones
End Sub
b- Formularios: ya debemos tener lista la rutina en un mdulo del Editor y la asignaremos cuando optemos por 'Asignar
macro'.
Las rutinas para este caso son como el siguiente ejemplo:
Sub nombre_rutina()
'nuestras instrucciones
End Sub
3- Ejecutar un atajo de teclado: En estos casos tendremos una rutina como la del punto anterior (b) en un mdulo del Editor.
Desde la hoja Excel, men Herramientas, Macros, Macros seleccionarla de la lista. Presionar el botn 'Avanzadas' e ingresar una
letra, por ejemplo 't' (sin las comillas)
Nota: Si Excel ya tiene asignada esta letra la reemplazar por Ctrl+Maysc +t Esto significa que en el momento que necesitemos
que la macro se ejecute presionaremos juntas las teclas Ctrl + t (o Ctrl+Mayusc+t)
4- Desde el men Herramientas: si no hemos asignado la rutina que se encuentra en un mdulo a ningn botn ni a atajo de
teclado, la ejecutaremos desde este men de Excel.
Referencias: Veamos los diferentes modos de referirnos a libros, hojas y celdas:

Workbook : Libro de trabajo.
ActiveWorkbook : Libro activo
Workbooks(2) : El segundo libro abierto
Workbooks("Libro1.xls") : Llamada al libro de nombre Libro1

Workbooks(milibro) : Llamada a un libro cuyo nombre se encuentra en una variable llamada 'milibro' (*)
*-Si el nombre del libro se encuenta en una variable, NO lleva comillas
Previamente asignamos nombre, por ej: milibro=ActiveWorkbook.name


WorkSheet : Hoja de trabajo
ActiveSheet : Hoja activa
Sheets("Enero") : Hoja de nombre 'Enero'
Sheets(3) : Nmero de hoja segn el orden de las pestaas.
[Hoja2] : La 2da hoja segn orden de las pestaas

Range o Cells : rango o celda
Activecell : la celda activa
Range("A2") : la celda A2
Cells(2,1) : la celda de fila 2 y columna 1 = A2 .
Cells(3,"D") : la celda de fila 3 y col D = D3
*-Ntese que mientras en Range se introduce la celda en el orden Col,Fila, en Cells es a la inversa: Cells(fila,col)
Range("A5:B10") : rango de celdas desde A5 hasta B10 inclusive
Range("E:E") : columna E
Range("2:2") : fila 2
[A3] : la celda A3
Range("A" & fila) : celda de la col A y fila segn valor de variable

TRABAJANDO CON LIBROS



1-Abrir un segundo libro:

Workbooks.Open "C:\Mis docu\Libro1.xlsb"

' o tambin: Application.Workbooks.Open "C:\.....\Libro1.xlsb"

Nota: Si el nombre se encuentra en una varible NO lleva comillas

Ej. 1: la variable 'libro2' contiene el nombre y la extensin.

Workbooks.Open ThisWorkBook.Path & "\" & libro2

Ej. 2: la variable 'libro2' contiene solo el nombre.

Workbooks.Open ThisWorkBook.Path & "\" & libro2 & ".xlsm"

2-Activar un segundo libro:

Workbooks("LibroOriginal.xlsm").Activate

'o tambin: Workbooks(1).Activate , en este caso es el 1er libro abierto.

IMPORTANTE: Al abrir un libro, ste pasa a ser el libro activo. Por lo tanto no es necesario activarlo nuevamente.

3-Cerrar un libro

Ej. 1: sin guardar cambios:

Workbooks("Libro1.xls").Close False
'o tambin: ActiveWorkbook.Close False

Ej. 2: guardando los cambios:

ActiveWorkbook.Save
ActiveWorkbook.Close
'o en 1 sola lnea: ActiveWorkBook.Close True

4-Guardar un libro con otro nombre o ruta:

Ej. 1: La carpeta y el nombre del libro pueden guardarse en variables, como en este caso:

ruta = ThisWorkbook.Path & "\"
'o quizs: ruta = "C:\"
libro = "LibroCopia.xlsm"
ActiveWorkbook.SaveAs ruta & libro

IMPORTANTE: tener presente que si en las variables no se incluye barra separadora o extensin del libro, deber agregarse en la
instruccin

Ej. 2:
ruta = "C:\Archivos Copia2013"
libro = "Ventas2013.xlsm"

ActiveWorkbook.SaveAs ruta & "\" & libro

Ej. 3: Guardar un libro cuyo nombre ser el valor de una celda:

ActiveWorkbook.SaveAs Filename:=Range("A2").Value

Nota: en este caso como no se indica la ruta o carpeta, se lo guarda en la misma carpeta del libro activo.

5-No mostrar aviso al salir, al eliminar hoja, o cualquier aviso que queremos omitir:

Application.DisplayAlerts= False 'volverla a True al finalizar la macro

6-No mostrar la ejecucin de la macro (movimiento de pantalla):

Application.ScreenUpdating = False 'volverla a True al finalizar la macro


TRABAJANDO CON HOJAS

1-Seleccionar la hoja anterior o siguiente:
ActiveSheet.Previous.Select 'hoja anterior a la activa
ActiveSheet.Next.Select 'hoja posterior a la activa

2-Obtener datos de la hoja:
nbre = ActiveSheet.Name 'nombre de la hoja
nroH = ActiveSheet.Index 'nmero de hoja

3-Copiar datos de una hoja a la siguiente:

Ej. 1: Se copia un rango previamente seleccionado a la hoja sgte.

Selection.Copy
'o tambin: Range("A5:H10").Copy
ActiveSheet.Paste Destination:=ActiveSheet.Next.Range("B2")

Ej. 2 : Mtodo abreviado, donde se copia en otra hoja a partir de B2

Range("A5:H10").Copy Destination:=Sheets("Base").Range("B2")

NOTA: las 'copias' tienen muchos detalles a considerar: con o sin formatos, con o sin frmulas, etc.

4- Mover o Copiar la hoja entera:

Se realiza una copia de la hoja activa, colocndola al final de todas.

Sheets("Hoja1").Copy After:=Sheets(Sheets.Count)

Nota: recordar que luego de la copia la hoja activa es la que se acaba de crear.


5- Ocultar filas o columnas:

ActiveCell.EntireRow.Hidden=True ' filas
ActiveCell.EntireColumn.Hidden= True 'col

Nota: para volverlas a mostrar utilizar la instruccin en False. Por ej:
Range("C1").EntireRow.Hidden = False

6-Proteger o desproteger una hoja:

ActiveSheet.Protect "contrasea" 'proteger con contrasea
ActiveSheet.Unprotect "contrasea" 'quitar la proteccin

Nota: Para obtener el cdigo con ciertos permisos que se pueden seleccionar desde la ventana de Proteccin, realizar los pasos
con la grabadora de macros.

7-Insertar filas o columnas a partir de cierta ubicacin:

'reemplazar i por el nro de columna
ActiveSheet.Column(i).Select
Selection.EntireColumn.Insert
'reemplazar Column por Row en caso de filas.

8-Eliminar filas o columnas:

Ej. 1: eliminar la fila 7 de hoja activa

ActiveSheet.Rows("7:7").Select
Selection.EntireRow.Delete

Ej. 2: eliminar cierta fila de hoja 'Base'

filx = 5
Sheets("BASE").Range("A" & filx).EntireRow.Delete

Nota: observar que no es necesario seleccionar previamente la fila.

9-Insertar una imagen en una hoja:

Ej. 1: se indica la ruta de la imagen en el mismo cdigo

ActiveSheet.Pictures.Insert ("D:\Mis imgenes\img01.JPG")

Ej. 2: se indica la ruta de la imagen en una celda. Adems la imagen queda seleccionada

ruta = ActiveSheet.Range("B5")
ActiveSheet.Pictures.Insert(ruta).Select

Nota: la ruta va entre comillas, por ej: "C:\Mis docu\Foto1.jpg"

10-Imprimir la hoja seleccionada:

ActiveWindow.SelectedSheet.PrintOut Copies:=1, Collate:=True
'o tambin: ActiveSheet.PrintOut

Nota: Reemplazar PrintOut por PrintPreview para realizar solo una vista preliminar.














TRABAJANDO CON RANGOS O CELDAS


1- Formas de seleccionar una celda o un rango de celdas:

Range("B7").Select 'selecciona la celda B7
Range("B:B").Select 'selecciona toda la columna B

Range("A4:A10, D10, B5:B20").Select
'selecciona rangos discontinuos

Range("A:A, D:F").Select 'selecciona las columnas A, D, E y F
Range("2:2, 4:7").Select 'selecciona las filas 2 y desde 4 hasta la 7

Seleccin de rangos con variables:

Range("A" & variable).Select

rgo="B2:E" & variable
Range(rgo).Select

rgo = "B" & ini & ":E" & fini
Range(rgo).Select

Nota: observar que las variables NO llevan comillas

Atencin: al inicio de la seccin Macros se encuentran otras instrucciones de seleccin

2- Seleccionar celdas a cierta distancia de la celda activa:

Sheets(1).Range("A1").Offset(2,3).Select
'selecciona 2 filas hacia abajo y 3 col a derecha de A1 = D3

ActiveCell.Offset(-10,1).Select
'selecciona la celda que se encuentra 10 filas por encima y 1 columna a la derecha de la celda activa.

3- Ampliar un rango seleccionado

Selection.Resize(10,4).Select ' (10 filas, 4 columnas)
' si el rango seleccionado fue A1:B5 ahora ser: A1:D10


4- Seleccionar el rango donde se encuenra la celda activa:

Range("B2").CurrentRegion.Select

5- Guardar la direccin de una celda en una variable:

lugar= ActiveCell.Address
'guarda la referencia absoluta, por ej: $E$2

lugar= ActiveCell.Address(False, False)
'guarda la referencia relativa, por ej: E2

6- Copiar un comentario en otra celda:

ActiveCell.Offset(0,1).Value = ActiveCell.Comment.Text
'copia el comentario de la celda activa en la celda que se encuentra en la columna siguiente.

7-Seleccionar celdas y borrarlas:

Range(rango). Select 'previamente se asign a la variable rango una ref
Selection.ClearContents 'borra contenidos

Selection.Clear 'borra todo (contenidos, formatos, etc)

Nota: La expresin Cells indica el total de celdas de una hoja. Entonces la instruccin:
Cells.Clearcontents borrar el contenido del total de celdas de la hoja activa.


8- Combinar - descombinar celdas selecccionadas:

Range("B1:E1").Select
Selection.Merge

Nota: Para quitar la combinacin se utilizar: Unmerge

9- Seleccionar hasta la ltima celda no vaca:

Range("A2", Range("A2").End(xlDown)).Select
'seleciona desde A2 hacia abajo

Range("A2", Range("A2").End(xlToRight)).Select
'selecciona desde A2 hacia la derecha

Range("D2", Range("D2").End(xlToLeft)).Select
'selecciona desde D2 hacia la izquierda

Range("A20", Range("A20").End(xlUp)).Select
'selecciona desde A20 hacia arriba

10- Obtener la primer celda vaca, en col A:

Range("A65536").End(xlup).Row + 1

'o tambin: Range("A2").End(xlDown).Row + 1

Nota: Considerar la versin Excel para tomar el rango final.


TRABAJANDO CON COLECCIONES

Una coleccin es un conjunto de objetos del mismo tipo: hojas, celdas, controles o Shapes, imgenes.
Para trabajar con una coleccin se programa un bucle: es decir repetir la misma instruccin para cada elemento de la coleccin.

A continuacin algunos ejemplos del bucle: For Each....Next


Ejemplo1: introducir un nombre para cada hoja del libro activo. Esta rutina se coloca en un mdulo:

Sub nombraHojas()
Dim MiNombre As String
Dim hoja As Worksheet
'controla posible error al ingresar un nombre de hoja no vlido
On Error Resume Next
For Each hoja In Worksheets
MiNombre = InputBox("Ingrese nombre para esta hoja: ")
If MiNombre <> "" Then hoja.Name = MiNombre
Next hoja
End Sub

Ejemplo2: introducir valores para cada celda de un rango (se coloca en un mdulo)

Sub colocaValores()
Dim celdita as Range
For Each celdita in ActiveSheet.Range("A1:B10")
celdita.Value = InputBox("Ingrese valor: ")
Next celdita
End Sub

Ejemplo3: introducir los mismos valores en celdas de todas las hojas (se coloca en un mdulo)

Sub valoresHoja()
Dim hoja as Sheets
For Each hoja in Sheets
hoja.Range("E3").Value = Date
hoja.Range("F3").Value = Time
Next hoja
End Sub


OTRO TIPO DE BUCLES:

Ejemplo1: realizar una accin por cada valor que tome una variable i (se coloca en un mdulo)

Sub muestraNombre()
Dim i as Byte
Dim hoja as Worksheet
'se controla posible error de que no existan tantas hojas
On Error Resume Next
For i=1 to 5
Msgbox WorkSheets(i).Name
Next
End Sub

En este ejemplo se muestra el nombre de cada hoja, desde la nro 1 a la 5


Ejemplo2: realizar una accin mientras se cumpla una condicin (se coloca en un mdulo)

Sub recorreRango()
'Se recorre la col A a partir de la fila 2 hasta encontrar una celda vaca.
'El valor de cada celda se incrementa en 1
Range("A2").Select
'se controla posible error de que la celda contenga texto
On Error resume next
While Activecell.Value <> ""
ActiveCell.Value = ActiveCell.Value + 1
'pasa a la fila siguiente
ActiveCell.Offset(1,0).Select
Wend
End Sub



TRABAJANDO CON OBJETOS

A continuacin algunos ejemplos de cmo llamar a objetos insertados en hoja, como ser Cuadros de texto, Listas o Cuadros
combinados y tambin un Userform.
1- Llamando a un Userform, desde un botn:
En una hoja de Excel, los botones que lanzan una accin, pueden ser colocados con la barra de Formularios o ActiveX (Cuadro de
Controles).
a. Botn de formulario: se asigna una macro, como la del ejemplo, que previamente se escribi en un mdulo en el Editor de
Visual Basic.
Sub mostrando ()
'nombre del Userform que se desea mostrar
UserForm1.Show
End Sub
b. Botn del Cuadro de controles: una vez dibujado en la hoja, clic derecho, opcin Ver cdigo y escribir la rutina (sta se
habilita en la hoja donde aparecer el control). Ejemplo:
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

2- Asignando valores a los Cuadros de texto:
Ejemplos de cmo colocar datos en los textbox dibujados en hoja con la barra ActiveX o 'Cuadro de controles'.

Nota: Estas instrucciones como las del punto 3 y 4, se colocan dentro de alguna rutina general, como puede ser un botn para
guardar o aceptar.

TextBox1.Value = "CANCELADO"
TextBox2 = Sheets("Hoja3").Range("A5").Value
TextBox2 = Range("C1").Value + Range("C2").Value

Notese que en Textbox2 se omiti la expresin 'value' ya que esa es su propiedad predeterminada. Puede colocarse o no.

3- Volcar datos de un control Textbox y Combobox a la hoja:
Estos controles han sido dibujados con la barra ActiveX o 'Cuadro de controles'
'pasar datos de un control Textbox a la celda indicada :
Range("B5") = TextBox1.Value

'pasar el valor de un combo a la fila siguiente de la indicada en Cells(fil, col)
Sheets("Hoja1").Cells(fila, col).Offset(1, 0).Value = Combobox1.Value

Nota: previamente se habr asignado un valor de fila y columa a las variables fil y col respectivamente.

4- Asignar rango a un control Listbox y Combobox:
En una hoja, dibujar un Cuadro de lista y un Cuadro combinado, con la barra 'Formularios'.
En un mdulo, colocar esta macro que asignar un rango de valores a los controles dibujados.
Ejemplo 1:

Sub Lista()
'asignar rango de entrada al control Lista
ActiveSheet.Shapes("List Box 1").Select
Selection.ListFillRange = "$F$1:$F$4"

'asignar rango de entrada al control Combobox
ActiveSheet.Shapes("Drop Down 1").Select
Selection.ListFillRange = "$K$1:$K$7"
End Sub

Ejemplo 2:

En este caso el control Lista se dibuj con la barra ActiveX o Cuadro de Controles:

Sub ListaX()
'asignar rango de entrada al control Lista
ActiveSheet.ListBox1.ListFillRange = "$F$1:$F$4"
End Sub

5- Cargar datos a un control ListBox de un UserForm:
Private Sub UserForm_Activate()
Dim item As Variant
For Each item In Range("F1:F6")
ListBox1.AddItem item.Value
Next item
End Sub

Вам также может понравиться