You are on page 1of 25

SELECCIONA FINAL DE LA CELDA ACTIVA, ABAJO, IZQUIERDA, DERECHA Y ARRIBA

Activecell.end(xldown)
Activecell end(xltoleft)
Activecell end(xltoright)
Activecell end(xlup)
SELECCIONA LA LINEA SIGUIENTE
Activecell.offset(1,0).select
PARA RECORRER UN RANGO ESTABLECIDO POR EL USUARIO A TRAVES DE
REFEDIT
Dim <variable> As Range
Set <variable> = Range(Refedit.value)
SELECCIONA UNA CELDA O RANGO DE CELDAS
Range(A1:B3).Select
Range(B2).Activate
AGREGAR NUEVA HOJA Y ESTABLECE NOMBRE DE LA HOJA
Dim NuevaHoja as Objeto
Set NuevaHoja = Worksheets.Add
NuevaHoja.Name = Presupuesto
GRABAR ARCHIVO
Active.Workbook.Save
SOLICITAR UN RANGO A TRAVES DE INPUTBOX
Dim MiRango as Range
Set MiRango = Application.inputbox(Promp:=Seleccione un Rango para Traspaso;type:=8)
VERIFICA QUE EL RANGO SELECCIONADO SEA DE LA COLUMNA A
If Mirando.column <> 1 Then
Msgbox El Rango Seleccionado NO es Valido, VbCritical
Exit Sub
End if
PONE NOMBRE DE RANGO A CELDA ACTIVA
BAJA 5 LINEAS, COLOCA HOLA, VUELVE A CELDA NOMBRE Y ELIMINA
NOMBRE
ActiveCell.Name = Nombre
ActiveCell.Offset(5,0).Activate
ActiveCell.Value = Hola
Application.GotoReference:= Nombre
ActiveWorkbook.Names(Nombre).Delete

SELECCIONAR HOJA DENTRO DEL LIBRO


Sheets(Nombre).Select
BORRAR CONTENIDO DE LA CELDA
Selection.ClearContents
SELECCIONAR TODA LA HOJA
Cells.Select
ELIMINA COLUMNA, FILA, CELDA
Selection.EntireColumn.Delete
Selection.EntireRow.Delete
Selection.Delete shift := xlup
INSERTAR COLUMNA, FILA, CELDA
Selection.Entirecolumn.Insert
Selection.EntireRow.Insert
Selection.Insert shift := XlDown
ACTIVAR UN ARCHIVO ABIERTO
Windows (NombreArchivo).Activate
SOLICITA UNO O VARIOS RANGOS DEL MISMO LIBRO U OTROS LIBROS ABIERTOS Y
PROCESAR EL RANGO SELECIONADO
Dim MiCelda, MiProc as Range
Set MiCelda = Application.InputBox(prompt:=Ingrese Rango ,Type:=8)
For Each MiProc In MiCelda
[instrucciones]
Next
CAPTURA SELECCIN ACTUAL PARA TRABAJO EN LA MACRO
Dim MiC As String
Dim MiP As Range
Dim Verif As Boolean
Dim Cc As Range
MiC = ActiveWindow.RangeSelection.Address(False, False)
For Each MiP In Range(MiC)
For Each Cc In Range("cuenta")
If Cc.Value = MiP.Value Then
If Cc.Offset(0, 2).Value = "*" Then 'AUX
'
c1 = True 'AUX
With MiP.Offset(0, 1).Interior
.Pattern = xlSolid

.PatternColorIndex = xlAutomatic
If MiP.Offset(0, 1).Value = "" Then
.Color = 65535 'amarillo
Else
.ColorIndex = 15 'gris
End If
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
End if
next
next
SELECCIONA UNA CARPETA DE UN LIBRO ABIERTO
Worksheets(nombre carpeta).Activate
SELECCIONA UN RANGO
Range(nombre rango).Activate
INSERTA UNA LINEA SI LA FILA SIGUIENTE CUMPLE LA CONDICION
If ActiveCell.Offset(1,0).Value=contenido celda then ActiveCell.EntireRow.Insert
IR AL FINAL DE LA SELECCION Y POSESIONARSE EN LA LINEA SIGUIENTE
ActiveCell.End(xlDown).Select
INSERTA LINEA SI DOS FILAS MAS ABAJO DE CELDA ACTIVA TIENE DATOS
If ActiveCell.Offset(2,0)<> then
Selection.EntireRow.Insert
End if
INGRESA DATOS DE UN LISTVIEW A LA PLANILLA EXCEL
Dim a as Integer
For a= 1 to [nombre userform].[nombre listview].ListItem.Count
ActiveCell.Offset(0,6).Value= [nombre userform].[nombre listview].ListItem(a).SubItem(2)
Next a
(2) corresponde a columna del Listview a traspasar, numero variable
PONE UNA FORMULA EN LA CELDA ACTIVA
ActiveCell.Offset(0, 12).FormulaR1C1 = "=r[-1]c+rc[-2]-rc[-1]"
Pone la formula a 12 columnas de la posicin actual
ActiveCell.FormulaR1C1 = ("=subtotal(9,r7c13:r10000c13)")
Pone la formula en la celda activa
PONE UNA FORMULA A PARTIR DE LA CELDA ACTIVA 5 COLUMNAS A LA DERECHA
(SUMA HACIA ARRIBA)
Dim fila as string
fila = "=SUM(r[-" & ActiveCell.Row - 6 & "]c:r[-1]c)"
ActiveCell.Offset(0, 5).FormulaR1C1 = fila

'SOLICITA RANGO DE OTRO LIBRO QUE NO SEA EL ACTUAL


Dim MiCelda1 As Range
Set MiCelda1 = Application.InputBox(prompt:="Seleccione un Rango en Hoja Imputacion",
Type:=8)

PARA EVITAR QUE LA RUTINA PARE CUANDO HAY UN ERROR EN TIEMPO


REAL
Despues de Public Sub
On Error GoTo Error
Despues de Exit Sub
Error:
End
End Sub
CAPTURA EN LA VARIABLE EL CONTENIDO DEL NOMBRE DE LA CELDA
Donde Menu es el nombre de la hoja y Nom es el nombre de la celda
Dim Vnom As String
Vnom = Worksheets("menu").Range("nom")
CAPTURA EN LA VARIABLE EL CONTENIDO DEL NOMBRE DE UN RANGO DE
CELDAS PARA UTILIZAR EN UN FOR EACH en hoja excel
Donde Menu es el nombre de la hoja y Nom es el nombre de la celda
Dim Rg as Range
For Each Rg In Worksheets("menu").Range("nom")
<commandos>
Next
SELECCIONA PRIMERA CELDA EN OTRA UBICACION PARA LLENAR UN COMBO O
PROCESO DE DATOS COMPARATIVOS
Dim Dato1 as Range
Dim Dato 2 as Double
Set Dato1 = Application.Workbooks("analisis.xlsm").Worksheets("tarifa").Range("tar")
Dato2 = 1
Do While Dato1.Offset(Dato2, 0).Value <> " "
'MsgBox Dato1.Offset(Dato2, 0).Value
< commandos >
Dato2 = Dato2 + 1
Loop

CAPTURA LA SELECCIN ACTUAL Y LA TRANSFORMA EN


UN RANGO PARA TRABAJAR CELDA A CELDA
Public Sub PositivoNegativo()
Dim Rs As String
Dim Rg As Range
Rs = ActiveWindow.RangeSelection.Address(False, False)
For Each Rg In Range(Rs)
If Rg.Value > 0 Then
Rg.Value = Rg.Value * -1
End If
Next
End Sub

'DESPLIEGA TODOS LOS NOMBRES DE LAS HOJAS QUE CONTIENE EL LIBRO


Sub NombredeHojas()
Dim celda As Integer
Dim Hoja As Worksheet
celda = 1
For Each Hoja In Worksheets
Sheets(1).Cells(celda, 1).Value = Hoja.Name
celda = celda + 1
Next Hoja
End Sub

SUMA COLUMNAS 2 A 9 QUE ESTAN A LA DERECHA DE LA CELDA ACTIVA


Y ELIMINA LA LINEA QUE SU SUMA ES CERO
Public Sub SumaCero()
Dim S As Double
Dim i As Integer
Do While ActiveCell.Value <> ""
S=0
For i = 2 To 9
S = S + ActiveCell.Offset(0, i).Value
Next i
If S = 0 Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Activate
End If
Loop
End Sub

REDONDEAR CELDAS
'Redondea el contenido numerico de la celda a cero decimal
Dim Rr As Range
Dim Ss As Range
Dim Zz As Double
Set Rr = Selection
For Each Ss In Rr
Zz = Round(Ss, 0)
Ss.Value = Zz
Ss.NumberFormat = "#,##0"
Next Ss

FORMATEAR FUENTE
Cells.Select
With Selection.Font
.Name = "MS Sans Serif"
.Size = 10

End With
LNEAS DE DIVISIN
ActiveWindow.DisplayGridlines = False
INDICE DE COLORES
ActiveWorkbook.Colors(44) = RGB(236, 235, 194) 'verde
COLOREAR RANGO
Range("A1:B10").Interior.ColorIndex = 44
CAMBIAR ENTRE ESTILOS A1 / RC
Application.ReferenceStyle = xlA1Application.ReferenceStyle = xlR1C1
SELECCIONAR UNA HOJA DEL LIBRO, PONER UNA FORMULA, DARLE
FORMATO A CELDA ACTIVA
Sheets("MatrizAnexo").Select
ActiveCell.FormulaR1C1 = _
"=ROUND(+R[-19]C[14]/COUNTIF(R[-25]C[14]:R[-20]C[15],"">0""),0)"
Selection.NumberFormat = "#,##0"

PARA TRABAJAR DIRECTO EN LA HOJA EXCEL


Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim Cc, Nro As Double
Dim Dir As String
Dim Aa As Currency
Dim Vv As Boolean 'variable verificador de movimiento
Dim Mm As String 'para distribucion en rendicion
Dim Rr As Range 'para distribucion en rendicion en rango
Dim C As Range
Dim Cant As Long
For Each C In Target
Cant = Cant + 1
Next
If Cant = 1 Then
'********************************
INSERTA UNA FORMULA EN LA MISMA LINEA 9 COL HACIA LA DERECHA
SI LA COL A Y LA FILA > 6 Y LA CELDA DE LA COL IZQ ES VACIA
If Target.Column = 1 And Target.Row > 6 And Target.Value <> "" And Target.Offset(-1, 0).Value <>
"" Then
Target.Offset(0, 9).FormulaR1C1 = "=r[-1]c+rc[-2]-rc[-1]"
End If
'********************************
'Para verificar tipo de documento ingresado en la celda
Nro = 1
Vv = False
Dir = Worksheets("datos").Range("tipodoc").Offset(Nro, 0).Value
Cc = Target.Value 'contenido en la celda activa
Aa = Target.Row 'numero de fila en celda activa
Do While Dir <> ""

Mm = Worksheets("datos").Range("tipodoc").Offset(Nro, 0).Address
If Cc = Dir Then
Range("D" & Aa).Select
ActiveCell.Offset(0, 12).Value = Worksheets("datos").Range(Mm).Offset(0, 2).Value
Exit Sub
End If
Nro = Nro + 1
Dir = Worksheets("datos").Range("tipodoc").Offset(Nro, 0).Value
Loop
If Dir = "" Then
MsgBox "Valor ingresado no existe, solicite Ayuda [CTROL A]... ", vbCritical
Range("C" & Aa).Select
End If
End If
'**********************************
If Target.Column = 5 And ActiveCell.Row > 4 Then
Nro = 1
Dir = Worksheets("datos").Range("auxiliar").Offset(Nro, 0).Value
Cc = Target.Value
Aa = Target.Row
Vv = False
Do While Dir <> ""
If Cc = Dir Then
Range("F" & Aa).Select
Target.Offset(0, 1).Value = Worksheets("datos").Range("auxiliar").Offset(Nro, 1).Value
Vv = True
Exit Do
End If
Nro = Nro + 1
Dir = Worksheets("datos").Range("auxiliar").Offset(Nro, 0).Value
Loop
If Vv = True Then
Exit Sub
Else
MsgBox "Valor ingresado no existe, solicite Ayuda [CTROL A]... ", vbCritical
'Range("C" & Aa).Select
End If
End If
'**********************************
End If
End Sub

*******************************************************************

Pregunta : Cmo puedo anular el efecto de la pulsacin de teclas como el RePag, AvPag, Esc o
similares al trabajar con formularios?
Respuesta : Si quieres anular la pulsacin de alguna tecla al trabajar con formularios, primero debes ir a
la ventana de propiedades del formulario y poner la propiedad Tecla de vista previa (KeyPreview) a S.
De esta manera, se fuerza a que el formulario sea el primero en detectar la pulsacin de cualquier tecla,
antes de que lo haga el control activo en ese momento, que, de otra manera, sera el primero en
hacerlo. Despus deberemos utilizar algn tipo de cdigo para detectar la pulsacin de la tecla en el
evento Al bajar una tecla (KeyDown) y anularla. Este evento detecta prcticamente todas las
pulsaciones de teclas, en detrimento del evento Al presionar una tecla (KeyPress) que slo detecta las
teclas tpicas de la escritura como son los caracteres alfanumricos y los smbolos utilizados en los
diferentes idiomas.
En nuestro caso, podemos llamar a una funcin genrica que he construdo y que servir para anular
cualquier tipo de tecla que le pasemos en su segundo parmetro, el cual tiene un nmero de elementos
indeterminado.
La funcin DeleteKeys tiene los siguientes
Argumentos
Nombre
Descripcin
KeyCode Requerido. El valor de la tecla pulsada y que est recogida en el primer argumento del
evento KeyDown, del mismo nombre: KeyCode
Keys

Opcional. Lista separada por comas de los valores ASCII o las constantes Visual Basic (ver
estas constantes en este enlace) de las teclas que se quieren anular.

Esta funcin tambin puede ser utilizada a travs del evento KeyDown de un control. Funcionar de la
misma manera que para un formulario.
Un ejemplo de uso:
' esta llamada a la funcin DeleteKeys anular la pulsacin de las
' teclas RePag y AvPag en el evento KeyDown de un formulario
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Call HelpKeys(KeyCode, vbKeyPageUp, vbKeyPageDown)
End Sub
Pega esta funcin en un mdulo estandar:
'--------------------------------------------------------'
' DeleteKeys
'
' Cdigo escrito originalmente por Juan M Afn de Ribera.
' Ests autorizado a utilizarlo dentro de una aplicacin
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una pgina Web,
' por favor, contactar con el autor en
'
' accessvbafaq@ya.com
'
' Este cdigo se brinda por cortesa de
' Juan M. Afn de Ribera
'
Function DeleteKeys(KeyCode As Integer, ParamArray Keys() As Variant) As Integer
Dim Key As Variant
For Each Key In Keys
If KeyCode = Key Then

KeyCode = 0
Exit Function
End If
Next
End Function

Constantes de tecla Visual Basic


Constante

Valor

Descripcin

vbKeyLButton

botn izquierdo del ratn

vbKeyRButton

botn derecho del ratn

vbKeyCancel

tecla CANCEL

vbKeyMButton

botn central del ratn

vbKeyBack

tecla Retroceso

vbKeyTab

tecla Tabulador

vbKeyClear

12

tecla CLEAR

vbKeyReturn

13

tecla Enter

vbKeyShift

16

tecla Maysculas

vbKeyControl

17

tecla Ctrl

vbKeyMenu

18

tecla Menu

vbKeyPause

19

tecla Pausa

vbKeyCapital

20

tecla Bloq Mays

vbKeyEscape

27

tecla Esc

vbKeySpace

32

tecla Espaciador

vbKeyPageUp

33

tecla RePg

vbKeyPageDown 34

tecla AvPg

vbKeyEnd

35

tecla Fin

vbKeyHome

36

tecla Inicio

vbKeyLeft

37

tecla Flecha Izquierda

vbKeyUp

38

tecla Flecha Arriba

vbKeyRight

39

tecla Flecha Derecha

vbKeyDown

40

tecla Flecha Abajo

vbKeySelect

41

tecla SELECT

vbKeyPrint

42

tecla ImprPant

vbKeyExecute

43

tecla EXECUTE

vbKeySnapshot

44

tecla SNAPSHOT

vbKeyInsert

45

tecla Insertar

vbKeyDelete

46

tecla Supr

vbKeyHelp

47

tecla HELP

vbKey0

48

tecla 0

vbKey1

49

tecla 1

vbKey2

50

tecla 2

vbKey3

51

tecla 3

vbKey4

52

tecla 4

vbKey5

53

tecla 5

vbKey6

54

tecla 6

vbKey7

55

tecla 7

vbKey8

56

tecla 8

vbKey9

57

tecla 9

vbKeyA

65

tecla A

vbKeyB

66

tecla B

vbKeyC

67

tecla C

vbKeyD

68

tecla D

vbKeyE

69

tecla E

vbKeyF

70

tecla F

vbKeyG

71

tecla G

vbKeyH

72

tecla H

vbKeyI

73

tecla I

vbKeyJ

74

tecla J

vbKeyK

75

tecla K

vbKeyL

76

tecla L

vbKeyM

77

tecla M

vbKeyN

78

tecla N

vbKeyO

79

tecla O

vbKeyP

80

tecla P

vbKeyQ

81

tecla Q

vbKeyR

82

tecla R

vbKeyS

83

tecla S

vbKeyT

84

tecla T

vbKeyU

85

tecla U

vbKeyV

86

tecla V

vbKeyW

87

tecla W

vbKeyX

88

tecla X

vbKeyY

89

tecla Y

vbKeyZ

90

tecla Z

vbKeyNumpad0

96

tecla 0 del teclado numrico

vbKeyNumpad1

97

tecla 1 del teclado numrico

vbKeyNumpad2

98

tecla 2 del teclado numrico

vbKeyNumpad3

99

tecla 3 del teclado numrico

vbKeyNumpad4

100

tecla 4 del teclado numrico

vbKeyNumpad5

101

tecla 5 del teclado numrico

vbKeyNumpad6

102

tecla 6 del teclado numrico

vbKeyNumpad7

103

tecla 7 del teclado numrico

vbKeyNumpad8

104

tecla 8 del teclado numrico

vbKeyNumpad9

105

tecla 9 del teclado numrico

vbKeyMultiply

106

tecla Smbolo Multiplicacin (*) del teclado numrico

vbKeyAdd

107

tecla Smbolo Suma (+) del teclado numrico

vbKeySeparator

108

tecla Intro del teclado numrico

vbKeySubtract

109

tecla Smbolo Resta (-) del teclado numrico

vbKeyDecimal

110

tecla Smbolo decimal(.) del teclado numrico

vbKeyDivide

111

tecla Smbolo Divisin (/) del teclado numrico

vbKeyF1

112

tecla F1

vbKeyF2

113

tecla F2

vbKeyF3

114

tecla F3

vbKeyF4

115

tecla F4

vbKeyF5

116

tecla F5

vbKeyF6

117

tecla F6

vbKeyF7

118

tecla F7

vbKeyF8

119

tecla F8

vbKeyF9

120

tecla F9

vbKeyF10

121

tecla F10

vbKeyF11

122

tecla F11

vbKeyF12

123

tecla F12

vbKeyF13

124

tecla F13

vbKeyF14

125

tecla F14

vbKeyF15

126

tecla F15

vbKeyF16

127

tecla F16

vbKeyNumlock

144

tecla BloqNum

Vamos a ello. Te podra dar una API que detecta tal hecho, pero lo mejor y ms sencillo -y
por lo tanto lo ms adecuado- es emplear el evento KeyDown. Crea un formulario con un
Text, y codifica lo siguiente:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyUp
MsgBox "Tecla arriba"
Case vbKeyDown
MsgBox "Tecla abajo"
Case vbKeyRight
MsgBox "Tecla derecha"
Case vbKeyLeft
MsgBox "Tecla izquierda"
End Select
End Sub
Comom vers se trata de capturar las teclas empleando las constantes que Visual Basic
provee. Una vez capturadas las teclas, hacer que se mueva la imagen o cualquier control es
bien sencillito
En cada "CASE" adiciona o resta ms a la propiedad LEFT o TOP del control
en cuestin.

******************************************************************************************************

Validacion de la fecha ingresada en un textbox


Nombre textbox = TxtFechaComp (o el nombre que se asigno al textbox)
If Not IsDate(TxtFechaComp.Text) Then 'validacion fecha
MsgBox "Fecha Incorrecta !!!", vbCritical + vbOKOnly, "Fecha Erronea"
TxtFechaComp.Text = ""

PARA CREAR UN ARCHIVO DE TEXTO, SEPARADO POR TAB


Print # Text1.text & vbTab & Text2.Text

CARGAR COMBOS CON INFORMACION Y SELECCION PARALELA


(se necesita un userform, dos combobox, un boton comando, en la planilla exel dos columnas
con datos la primera columna con nombre asignado al rango plan )

Private Sub <nombrecombo1>_Change()


<nombrecombo2>.ListIndex = <nombrecombo1>.ListIndex
End Sub
Private Sub <nombrecombo2>_Change()
<nombrecombo1>.ListIndex = <nombrecombo2>.ListIndex
End Sub
Private Sub CmdSalir_Click()
End
End Sub
Private Sub UserForm_Initialize()
'Cargamos los nros de cuentas con sus nombres
Dim c As Range
For Each c In Range("plan")
<nombrecombo1>.AddItem c.Value 'Agregamos el nro de cuenta
<nombrecombo2>.AddItem c.Offset(0, 1).Value 'Agregamos el nombre de la cuenta
Next
Set c = Nothing 'Limpiamos el objeto 'c'
End Sub
CAPTURA EN UNA VARIABLE LA SELECCIN DE UN COMBOBOX
<var> = combo.list(combo.listindex)
CAMBIAR FOCO EN UN FORMULARIO
<NombreFormulario>.<NombreControl>..setfocus

CAPTURAR

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


Range("B7").Select
Range("B:B").Select

'selecciona la celda B7
'selecciona toda la columna B

Range("A4:A10, D10, B5:B20").Select


'selecciona rangos discontinuos
Range("A" & variable).Select
'selecciona la celda cuya fila ser el valor de la variable
Si definimos una variable que contiene la ltima fila a considerar:
rango=("B2:E" & variable) , entonces la siguiente instruccin selecciona el rango B2:E hasta la fila
indicada en la variable.
Range(rango).Select
De igual manera puede establecerse el rango de inicio:
rango = "B" & ini & ":E" & fini
Range(rango).Select
*- Ntese que las variables NO llevan comillas
Range("A:A, D:F").Select
Range("2:2, 4:7").Select

'selecciona las columnas A, D, E y F


'selecciona las filas 2 y desde 4 hasta la 7

Nota: 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- Asignar Formato a celdas o rangos:


Range("B2:D10").Select
'selecciona el rango y le aplica los siguientes formatos
With Selection
.Font.Bold=True
'formato negrita
.Font.Italic=True
'formato
cursiva .Font.Underline=xlUnderlineStyleSingle
'subrayado simple
.Font.Color = RGB(255,0,0)
'color de fuente (para estos valores ser rojo) .HorizontalAlignment=xlCenter
'alineacin central (Right=derecha, Left=izquierda)
End With

4- 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

5- 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.

6-Seleccionar celdas y borrarlas:


Range(rango). Select
'previamente se asign a la variable rango una ref
Selection.ClearContents
La expresin Cells.Clearcontents borrar el contenido del total de celdas de la hoja activa

Utilizando solamente Clear se borrarn formatos tambin.

7- Ampliar un rango seleccionado


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

8- Combinar celdas selecccionadas:


Range("B1:E1").Select
Selection.Merge
Para quitar la combinacin: Unmerge

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


Range("B2").CurrentRegion.Select

10- 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
En cambio, para seleccionar solo la ltima celda con datos ser:
Range("A2").End(xlDown).Select
Nota: Esta instruccin dar error si la celda A3 se encuentra vaca. Es preferible en ese caso realizar la
bsqueda de 'abajo hacia arriba', con:
Range("A65536").End(xlup).Select

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


Range("A2").End(xlDown).Row + 1

'o

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

Trabajando con Colecciones


En esta seccin aparecern algunas de las instrucciones 'bsicas' para utilizar con COLECCIONES. Una vez copiada
en el Editor, colocar el cursor sobre la palabra en negrita y presionar F1 para acceder a la Ayuda Excel. All se
encontrarn ms explicaciones y ejemplos para esa instruccin.

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
For Each hoja In Worksheets
MiNombre = InputBox("Ingrese nombre de hoja: ")
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

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
While Activecell.Value <> ""
ActiveCell.Value = ActiveCell.Value + 1
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 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. Ejemplo:
Sub mostrando ()
UserForm1.Show
End Sub

b.

'nombre del Userform que se desea mostrar

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 registrar datos en los textbox dibujados en hoja con la barra '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 'Cuadro de controles'
'pasar datos de un control Textbox a la celda indicada en Cells(fila,col)
Cells(fila, col).Value = 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

4- Asignar rango a un control Listbox y Combobox:


Estos controles han sido dibujados en la hoja con la barra 'Formularios'
'asignar rango de entrada al control Lista
ActiveSheet.Shapes("List Box 1").Select
With Selection
.ListFillRange = "$F$1:$F$4"
End With

'asignar rango de entrada al control Combobox


ActiveSheet.Shapes("Drop Down 1").Select
With Selection
.ListFillRange = "$K$1:$K$7"
End With
* Otra manera de asignar rango. En este caso el control se dibuj con la barra ActiveX o Cuadro de Controles:
ActiveSheet.ListBox1.ListFillRange = "$F$1:$F$4"

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

Trabajando con Libros


En esta seccin aparecern algunas de las instrucciones 'bsicas' para utilizar con LIBROS. Una vez copiada en el
Editor, colocar el cursor sobre la palabra en negrita y presionar F1 para acceder a la Ayuda Excel. All se
encontrarn ms explicaciones y ejemplos para cada instruccin.
Nota: Al inicio de esta seccin Macros hemos visto las distintas maneras de hacer referencia a Libros, Hojas y
Rangos o celdas. A partir de aqu usar solo el objeto activo considerando que puede usarse algunas de las otras
expresiones

1-Abrir un segundo libro:


Workbooks.Open "C:\Mis docu\Libro1.xlsb"
' o tambin: Application.Workbooks.Open "C:\.....\Libro1.xlsb"
Si el nombre se encuentra en una varible NO lleva comillas (aqu se abre un libro que se encuentra en la misma
carpeta que el libro activo. La variable 'libro2' contiene el nombre y la extensin)
Workbooks.Open ThisWorkBook.Path & "\" & libro2

2-Activar un segundo libro:

Workbooks("Libro2.xls").Activate
'o tambin: Workbooks(2).Activate , en este caso Libro2.xls es el 2do libro abierto

3-Cerrar un libro (sin guardar):

Workbooks("Libro1.xls").Close False
ActiveWorkbook.Close False

'o

4-Cerrar un libro (guardando los cambios):


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

5-Guardar un libro con otro nombre:

ActiveWorkbook.SaveAs Filename:="C:\Mis doc\Libro1.xls",


ReadOnlyRecommended:=False

FileFormat:=xlNormal, Password:="clave",

Estas son algunas de las opciones. Si se omiten, escribir la coma, como en el siguiente ejemplo:
ActiveWorkbook.SaveAs Filename:="C:\Mis doc\Libro.xls",,, ReadOnlyRecommended:=False
*- La carpeta y el nombre del libro pueden guardarse en variables, como en este ej:
ruta = ThisWorkbook.Path & "\"
'o quizs: ruta = "C:\"
libro = "LibroCopia.xlsm"
ActiveWorkbook.SaveAs ruta & libro

6-Guardar un libro cuyo nombre ser el valor de una celda:

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

7-No mostrar aviso al salir, al eliminar hoja, o cualquier aviso que queremos omitir:
Application.DisplayAlerts= False

'volverla a True al finalizar la macro

8-Deshabilitar la opcin de actualizar vnculos al abrir un libro:


Application.DisplayAlerts= False
'volverla a True al finalizar la macro
WorkBooks.Open Filename:= "C:\Mis docu\pruebas.xls", UpdateLinks:= 0

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


Application.ScreenUpdating = False

'volverla a True al finalizar la macro

10-Ejecutar una macro al abrir un libro:


Insertar un mdulo y all escribir una rutina:
Ejemplo:
Sub Nuevamacro ()
'instrucciones, por ej:
MsgBox "Bienvenid@"
End Sub
Y agregar esta otra en el objeto ThisWorkbook:
Private Sub Workbook_Open ()
Nuevamacro
'o tambin puede llamarse utilizando la expresin Call
'Call Nuevamacro
End Sub

Trabajando con Hojas


En esta seccin aparecern algunas de las instrucciones 'bsicas' para utilizar con HOJAS. Una vez copiada en el
Editor, colocar el cursor sobre la palabra en negrita y presionar F1 para acceder a la Ayuda Excel. All se
encontrarn ms explicaciones y ejemplos para esa instruccin.

1-Seleccionar la hoja anterior o siguiente:


ActiveSheet.Previous.Select
ActiveSheet.Next.Select

'hoja anterior a la activa


'hoja posterior a la activa

2-Datos de la hoja:
ActiveSheet.Name
ActiveSheet.Index

'nombre de la hoja
'nmero de hoja

3-Copiar datos de una hoja a la siguiente:

Selection.Copy
'previamente se habr seleccionado algo
ActiveSheet.Paste Destination:=ActiveSheet.Next.Range("B2")

4- Ocultar filas o columnas:


ActiveCell.EntireRow.Hidden=True
ActiveCell.EntireColumn.Hidden= True

5-Proteger o desproteger una hoja:


ActiveSheet.Protect "contrasea"
ActiveSheet.Unprotect "contrasea"

' filas
'col

'proteger con contrasea


'quitar la proteccin

6-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.

7-Conocer el nro de columna de cierta referencia:


Cuando utilizamos la expresin: Cells(fila,col) y queremos hacer referencia a la celda AB5 por ej, necesitamos
conocer cul es el nro de columna. Para eso podemos solicitarla en un mensaje con:

Sub nrocol()
Msgbox Range("AB1").Column
End Sub

8-Eliminar filas o columnas:


ActiveSheet.Row(n).Select 'reemplazar n por el nro de fila
Selection.EntireRow.Delete

9-Insertar una imagen en una hoja:

ActiveSheet.Pictures.Insert(ruta).Select
'la ruta va entre comillas, por ej: "C:\Mis docu\Foto1.jpg"

10-Imprimir la hoja seleccionada:


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

'o

Reemplazar PrintOut por PrintPreview para realizar solo una vista preliminar.

Esta pgina intenta ser una gua no solo para el que se inicia en el tema VBA sino tambin para aquellos
que, conociendo el tema, no recuerdan tal o cual instruccin o buscan ampliar sus conocimientos con otros
ejemplos.
Los temas se encuentran separados en categoras, desde un repaso por las instrucciones bsicas, hasta
macros ms desarrolladas, con varios ejemplos en cada una.
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!)
Los temas estn divididos en 2 grupos principales: Conceptos e Instrucciones bsicas (ver ndice de
contenidos en margen izquierdo)

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.
(*) El lenguaje utilizado en Excel es VBA (Visual Basic for Applications)

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.
En versin 2007, activar la opcin Programador de la Cinta de Opciones.
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 ficha Programador
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.
En versin 2007, activar la opcin Programador de la Cinta de Opciones.
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)
*-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 A2 .
*-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
**************************

FUNCIONES DE COMPROBACION

IsNumric(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como numrico.
IsDate(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como tipo fecha.
IsEmpty(Expresin). Comprueba que expresin tenga algn valor, que se haya inicializado.
IsError(Expresin). Comprueba si expresin devuelve algn valor de error.
IsArray(Expresin). Comprueba si expresin (una variable) es un array o no.
IsObject(Expresin). Comprueba si expresin (una variable) representa una variable tipo objeto.
IsNull(Expresin). Comprueba si expresin contiene un valor nulo debido a datos no vlidos.
Funcin IsEmpty
Nos comprueba si una celda o rango est vaco, no hay datos.
Sintaxis
IsEmpty(expresin)
El argumento expresin requerido es un tipo de datos Variant que contiene una expresin de cadena o
una expresin numrica. Sin embargo, ya que la funcin IsEmpty se utiliza para determinar si las

variables individuales estn inicializadas, el argumento expresin es generalmente un nico nombre de


variable.
Ejemplo:
Comprobamos si en la celda B1 de la hoja activa hay datos:
Sub ejemplo()
Dim mensaje As String
If IsEmpty(ActiveSheet.Range(B1)) Then
MsgBox Prompt:=la casilla B1 est vaca, Title:=ERROR
Else
mensaje = ActiveSheet.Range(B1)
MsgBox En la casila B1 hay este dato : & mensaje
End If
End Sub
Es complicado utilizar utilizar IsEmpty con datos recogidos por teclado mediante la funcin InputBox. Y
ello es as porque esta funcin devuelve datos de tipo variant o sea cualquier expresin que se pueda
evaluar a datos numricos, de cadena o de fecha. Para entenderlo mejor modifique el cdigo anterior
por este otro:
Sub ejemplo2()
Dim mensaje
mensaje = InputBox(Usuario)
If IsEmpty(mensaje) Then
MsgBox Prompt:=usuario?, Title:=ERROR
Else
MsgBox Hola & mensaje
End If
End Sub
Como comprobar la funcin IsEmpty no evala la cadena vaca, ya que InputBox en ese caso
devolvera un cero.
Funcin IsNumeric/Funcin IsDate
Nos comprueba si una expresin se evala como un nmero, para IsNumeric o fecha para IsDate Por
ejemplo evaluamos si en la celda activa hay valores numricos:
Sub comprueba()
If Not IsNumeric(ActiveCell.Value) Then
MsgBox Error
Else
MsgBox Los valores son numricos
End If
End Sub
Funcin IsObject
La funcin IsObject es til solamente para determinar si un tipo de datos Variant es de VarType
vbObject. Ejemplo:
Sub Obj()
Dim R As Range
Si la variable R es Nothing es que no ha sido asignada, no se puede trabajar con ella
If R Is Nothing Then
MsgBox Prompt:=La variable Objeto no ha sido asignada, Buttons:=vbOK, _
Title:=Error
Else
R.Value = Hola

End If
End Sub
Aqu un ejemplo resumen:
Sub comprueba()
Dim cadena As Variant
cadena = ActiveCell.Value
If IsEmpty(cadena) Then
MsgBox La celda no contiene datos
ElseIf IsNumeric(cadena) Then
MsgBox La celda contiene datos numricos
ElseIf IsDate(cadena) Then
MsgBox La celda contiene datos tipo fecha
ElseIf Not IsArray(cadena) Then
MsgBox La celda no es un array
Else
MsgBox No hay nada para evaluar
End If
End Sub

Evento OnKey:
El evento OnKey ejecuta un procedimiento especfico cuando una tecla o combinacin de teclas
se pulsan.
A continuacin os relaciono una matriz con los cdigos que representa cada tecla en el teclado.
Clave

Cdigo

RETROCESO

{RETROCESO} o {BS}

BREAK

{PAUSA}

CAPS LOCK

{} BLOQ MAYS

CLEAR

{CLEAR}

SUPR o DEL

{DELETE} o {DEL}

FLECHA ABAJO

{DOWN}

FIN

{END}

ENTER (teclado
numrico)

{ENTER}

ENTER

~ (tilde)

CES

{ Salir} o {ESC}

AYUDA

{AYUDA}

INICIO

{HOME}

INS

{INSERT}

FLECHA A LA
IZQUIERDA

{Left}

BLOQ NUM

{BLOQ NUM}

PG

{} PGDN

PG

{} PGUP

REGRESAR

{Return}

FLECHA A LA DERECHA {Derecha}


SCROLL LOCK

{} ScrollLock

TAB

{TAB}

FLECHA ARRIBA

{UP}

F1 a F15

{F1} a travs {F15}

Tambin se pueden especificar en combinacin con las teclas SHIFT , CTRL y ALT.
Para combinar con las
teclas

Precede el cdigo clave por

SHIFT

+ (signo ms)

CTRL

^ (acento circunflejo)

ALT

% (signo de porcentaje)

Pegue las siguientes instrucciones en un mdulo:


Sub DemoOnKey()
Application.OnKey "{TAB}", "Message"
End Sub
Sub Message()
MsgBox "Hola"
End Sub

You might also like