You are on page 1of 33

INDICE

1. USO DE MSGBOX (para capturar el botón pulsado)


2. CAPTURA SELECCIÓN ACTUAL PARA TRABAJAR CON ELLA en la Macro (21)
3. SOLICITA UNO O VARIOS RANGOS DEL MISMO LIBRO U OTROS LIBROS ABIERTOS Y
PROCESAR EL RANGO SELECIONADO [Con Inputbox() ]
4. VERIFICA QUE EL RANGO SELECCIONADO SEA DE LA COLUMNA A
5. PONE UNA FORMULA EN LA CELDA ACTIVA
6. PONE UNA FORMULA A PARTIR DE LA CELDA ACTIVA 5 COLUMNAS A LA DERECHA (SUMA
HACIA ARRIBA)
7. SELECCIONA FINAL DE LA CELDA ACTIVA, ABAJO, IZQUIERDA, DERECHA Y ARRIBA
7a. PRIMERA CELDA VACIA EN LA COLUMNA DE DATOS

8. SELECCIONA LA LINEA SIGUIENTE


9. PARA RECORRER UN RANGO ESTABLECIDO POR EL USUARIO A TRAVES DE REFEDIT
10. SELECCIONA UNA CELDA O RANGO DE CELDAS
11. AGREGAR NUEVA HOJA Y ESTABLECE NOMBRE DE LA HOJA
11A. COPIA UNA HOJA Y LA RENOMBRA DE ACUERDO AL DIA DE LA FECHA ACTUAL
12. GRABAR ARCHIVO
13. PONE NOMBRE DE RANGO A CELDA ACTIVA BAJA 5 LINEAS, COLOCA “HOLA”, VUELVE A
CELDA “NOMBRE” Y ELIMINA “NOMBRE”
14. SELECCIONAR UNA CELDA EN OTRA HOJA DEL MISMO LIBRO
15. SELECCIONAR HOJA DENTRO DEL LIBRO
16. BORRAR CONTENIDO DE LA CELDA
17. SELECCIONAR TODA LA HOJA
18. ELIMINA COLUMNA, FILA, CELDA
19. INSERTAR COLUMNA, FILA, CELDA
20. ACTIVAR UN ARCHIVO ABIERTO
21. CAPTURA SELECCIÓN ACTUAL PARA TRABAJO EN LA MACRO (2)
22. SELECCIONA UNA CARPETA DE UN LIBRO ABIERTO
23. SELECCIONA UN RANGO
24. INSERTA UNA LINEA SI LA FILA SIGUIENTE CUMPLE LA CONDICION
25. IR AL FINAL DE LA SELECCION Y POSESIONARSE EN LA LINEA SIGUIENTE
26. INSERTA LINEA SI DOS FILAS MAS ABAJO DE CELDA ACTIVA TIENE DATOS
27. INGRESA DATOS DE UN LISTVIEW A LA PLANILLA EXCEL
28. SOLICITA RANGO DE OTRO LIBRO QUE NO SEA EL ACTUAL
29. PARA EVITAR QUE LA RUTINA PARE CUANDO HAY UN ERROR EN TIEMPO
30. AL EJECUTAR LA MACRO QUE INVOLUCRA OTRAS HOJAS DEL LIBRO SE FIJE EN LA
PANTALLA A LA VISTA
31. CAPTURA EN LA VARIABLE EL CONTENIDO DEL NOMBRE DE LA CELDA
32. CAPTURA EN LA VARIABLE EL CONTENIDO DEL NOMBRE DE UN RANGO DE CELDAS
PARA UTILIZAR EN UN FOR EACH en hoja excel
33. SELECCIONA PRIMERA CELDA EN OTRA UBICACION PARA LLENAR UN COMBO O
PROCESO DE DATOS COMPARATIVOS
34. CAPTURA LA SELECCIÓN ACTUAL Y LA TRANSFORMA EN UN RANGO PARA TRABAJAR
CELDA A CELDA
35. 'DESPLIEGA TODOS LOS NOMBRES DE LAS HOJAS QUE CONTIENE EL LIBRO
35a. OBTENER EL NOMBRE DE LA HOJA ACTIVA
35b. CAMBIAR NOMBRE DE LA HOJA ACTIVA
36. SUMA COLUMNAS 2 A 9 QUE ESTAN A LA DERECHA DE LA CELDA ACTIVA
Y ELIMINA LA LINEA QUE SU SUMA ES CERO
37. REDONDEAR CELDAS
38. FORMATEAR FUENTE
39. LÍNEAS DE DIVISIÓN
40. INDICE DE COLORES
41. CAMBIAR ENTRE ESTILOS A1 / RC
42. SELECCIONAR UNA HOJA DEL LIBRO, PONER UNA FORMULA, DARLE
43. PARA TRABAJAR DIRECTO EN LA HOJA EXCEL
44. Pregunta : ¿Cómo puedo anular el efecto de la pulsación de teclas como el RePag, AvPag,
45. Validacion de la fecha ingresada en un textbox
46. PARA CREAR UN ARCHIVO DE TEXTO, SEPARADO POR TAB
47. CARGAR COMBOS CON INFORMACION Y SELECCION PARALELA
48. CAPTURA EN UNA VARIABLE LA SELECCIÓN DE UN COMBOBOX
49. CAMBIAR FOCO EN UN FORMULARIO
50. CAPTURAR
51. Trabajando con Colecciones
52. Trabajando con Objetos
53. Trabajando con Libros
54. Trabajando con Hojas
54a. TRABAJANDO CON RANGOS
55. MACRO:
56. FUNCIONES DE COMPROBACION
57. Evento OnKey:
58. ARREGLO (ARRAY)
58a COMPARANDO DOS ARREGLOS
1. USO DE MSGBOX (para capturar el botón pulsado)
resultado = MsgBox("Hola Mundo", vbAbortRetryIgnore + vbQuestion, "Mensaje especial")

Dim N As Integer
Dim Msg As Integer
Msg = MsgBox("Esta seguro de eliminar caracter 160 al final del texto", vbYesNo)
If Msg = 7 Then
Exit Sub
Else
{instrucciones} ‘si la opcion es distinta de 7 NO
End if

2. CAPTURA SELECCIÓN ACTUAL PARA TRABAJAR CON ELLA en la Macro


Dim MiC As String
Dim MiP As Range
MiC = ActiveWindow.RangeSelection.Address(False, False)
For Each MiP In Range(MiC)
{instrucciones}
Next

3. SOLICITA UNO O VARIOS RANGOS DEL MISMO LIBRO U OTROS LIBROS ABIERTOS
Y PROCESAR EL RANGO SELECIONADO [Con Inputbox() ]

Dim MiCelda, MiProc as Range

Set MiCelda = Application.InputBox(prompt:=”Ingrese Rango “,Type:=8)

For Each MiProc In MiCelda

[instrucciones]
Next

4. VERIFICA QUE EL RANGO SELECCIONADO SEA DE LA COLUMNA A


Dim VeriCol as integer
If VeriCol.column <> 1 Then
Msgbox “El Rango Seleccionado NO es Valido”, VbCritical
Exit Sub
End if
5. 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 posición actual

ActiveCell.FormulaR1C1 = ("=subtotal(9,r7c13:r10000c13)")
Pone la formula en la celda activa

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

7. SELECCIONA FINAL DE LA CELDA ACTIVA, ABAJO, IZQUIERDA, DERECHA Y


ARRIBA

Activecell.end(xldown)
Activecell end(xltoleft)
Activecell end(xltoright)
Activecell end(xlup)

7a. PRIMERA CELDA VACIA EN LA COLUMNA DE DATOS


Range(“A1”).End(xlDown).Offset(1,0).Select
http://trucosycursos.es/ir-a-la-ultima-celda-con-datos-o-primera-celda-vacia-en-excel/

8. SELECCIONA LA LINEA SIGUIENTE

Activecell.offset(1,0).select

9. PARA RECORRER UN RANGO ESTABLECIDO POR EL USUARIO A TRAVES DE


REFEDIT

Dim <variable> As Range


Set <variable> = Range(Refedit.value)

10. SELECCIONA UNA CELDA O RANGO DE CELDAS

Range(“A1:B3”).Select
Range(“B2”).Activate

11. AGREGAR NUEVA HOJA Y ESTABLECE NOMBRE DE LA HOJA

Dim NuevaHoja as Objeto


Set NuevaHoja = Worksheets.Add
NuevaHoja.Name = “Presupuesto”

11ª. 'Hacer referencia a una hoja guardando en una variable el nombre de la hoja activa,
previa a la activa y posterior a la activa
Dim sheetnom As String
'Se guarda el nombre de la hoja activa, previa a la activa y posterior a la activa
sheetnom = ActiveSheet.Name
sheetnom = ActiveSheet.Previous.Name
sheetnom = ActiveSheet.Next.Nam
11A. COPIA UNA HOJA Y LA RENOMBRA DE ACUERDO AL DIA DE LA FECHA ACTUAL
Sheets("molde").Copy After:=Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = Day(Now())

12. GRABAR ARCHIVO

Active.Workbook.Save

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

14. SELECCIONAR UNA CELDA EN OTRA HOJA DEL MISMO LIBRO


Opcion 1
Application.Goto ActiveWorkbook.Sheets(“nombrehoja”).Cells(fila,col)
Opcion 2
Application.Goto (ActiveWorkbook.Sheets(“nombrehoja”).Range(“E1”))
Opcion 3
Sheets(“nombrehoja”).Activate
ActiveSheets.Cells(fila,col).Select

15. SELECCIONAR HOJA DENTRO DEL LIBRO

Sheets(“Nombre”).Select

16. BORRAR CONTENIDO DE LA CELDA

Selection.ClearContents

17. SELECCIONAR TODA LA HOJA

Cells.Select

18. ELIMINA COLUMNA, FILA, CELDA

Selection.EntireColumn.Delete

Selection.EntireRow.Delete

Selection.Delete shift := xlup

19. INSERTAR COLUMNA, FILA, CELDA

Selection.Entirecolumn.Insert
Selection.EntireRow.Insert

Selection.Insert shift := XlDown

20. ACTIVAR UN ARCHIVO ABIERTO

Windows (“NombreArchivo”).Activate

21. CAPTURA SELECCIÓN 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

22. SELECCIONA UNA CARPETA DE UN LIBRO ABIERTO


Worksheets(“nombre carpeta”).Activate

23. SELECCIONA UN RANGO


Range(“nombre rango”).Activate

24. INSERTA UNA LINEA SI LA FILA SIGUIENTE CUMPLE LA CONDICION


If ActiveCell.Offset(1,0).Value=”contenido celda” then ActiveCell.EntireRow.Insert

25. IR AL FINAL DE LA SELECCION Y POSESIONARSE EN LA LINEA SIGUIENTE


ActiveCell.End(xlDown).Select

26. INSERTA LINEA SI DOS FILAS MAS ABAJO DE CELDA ACTIVA TIENE DATOS
If ActiveCell.Offset(2,0)<>”” then
Selection.EntireRow.Insert
End if

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

28. 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)

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

30. AL EJECUTAR LA MACRO QUE INVOLUCRA OTRAS HOJAS DEL LIBRO SE FIJE EN
LA PANTALLA A LA VISTA
Application.ScreenUpdating = False

31. 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")

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

33. 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
34. CAPTURA LA SELECCIÓN 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

35. '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

35a. OBTENER EL NOMBRE DE LA HOJA ACTIVA


Dim Nom as String
Nom= ActiveSheet.Name

35b. CAMBIAR NOMBRE DE LA HOJA ACTIVA


ActiveSheet.Name=”nuevonombre”

36. 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
37. 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

38. FORMATEAR FUENTE


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

39. LÍNEAS DE DIVISIÓN


ActiveWindow.DisplayGridlines = False

40. INDICE DE COLORES


ActiveWorkbook.Colors(44) = RGB(236, 235, 194) 'verde
COLOREAR RANGO
Range("A1:B10").Interior.ColorIndex = 44

41. CAMBIAR ENTRE ESTILOS A1 / RC


Application.ReferenceStyle = xlA1Application.ReferenceStyle = xlR1C1

42. 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"

43. 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
*******************************************************************
 44.   Pregunta : ¿Cómo puedo anular el efecto de la pulsación de teclas como el RePag, AvPag, 
Esc o similares al trabajar con formularios?

Respuesta : Si quieres anular la pulsación 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 pulsación de cualquier tecla,
antes de que lo haga el control activo en ese momento, que, de otra manera, sería el primero en
hacerlo. Después deberemos utilizar algún tipo de código para detectar la pulsación de la tecla en el
evento Al bajar una tecla (KeyDown) y anularla. Este evento detecta prácticamente todas las
pulsaciones de teclas, en detrimento del evento Al presionar una tecla (KeyPress) que sólo detecta las
teclas típicas de la escritura como son los caracteres alfanuméricos y los símbolos utilizados en los
diferentes idiomas.

En nuestro caso, podemos llamar a una función genérica que he construído y que servirá para anular
cualquier tipo de tecla que le pasemos en su segundo parámetro, el cual tiene un número de elementos
indeterminado.

La función DeleteKeys tiene los siguientes

Argumentos
Nombre Descripción
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 función también puede ser utilizada a través del evento KeyDown de un control. Funcionará de la
misma manera que para un formulario.

Un ejemplo de uso:

' esta llamada a la función DeleteKeys anulará la pulsación 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 función en un módulo estandar:

'---------------------------------------------------------
'
' DeleteKeys
'
' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
' accessvbafaq@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán 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 Descripción

vbKeyLButton 1 botón izquierdo del ratón

vbKeyRButton 2 botón derecho del ratón

vbKeyCancel 3 tecla CANCEL

vbKeyMButton 4 botón central del ratón

vbKeyBack 8 tecla Retroceso

vbKeyTab 9 tecla Tabulador

vbKeyClear 12 tecla CLEAR

vbKeyReturn 13 tecla Enter

vbKeyShift 16 tecla Mayúsculas

vbKeyControl 17 tecla Ctrl

vbKeyMenu 18 tecla Menu

vbKeyPause 19 tecla Pausa

vbKeyCapital 20 tecla Bloq Mayús

vbKeyEscape 27 tecla Esc

vbKeySpace 32 tecla Espaciador

vbKeyPageUp 33 tecla RePág

vbKeyPageDown 34 tecla AvPág

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 numérico

vbKeyNumpad1 97 tecla 1 del teclado numérico


vbKeyNumpad2 98 tecla 2 del teclado numérico

vbKeyNumpad3 99 tecla 3 del teclado numérico

vbKeyNumpad4 100 tecla 4 del teclado numérico

vbKeyNumpad5 101 tecla 5 del teclado numérico

vbKeyNumpad6 102 tecla 6 del teclado numérico

vbKeyNumpad7 103 tecla 7 del teclado numérico

vbKeyNumpad8 104 tecla 8 del teclado numérico

vbKeyNumpad9 105 tecla 9 del teclado numérico

vbKeyMultiply 106 tecla Símbolo Multiplicación (*) del teclado numérico

vbKeyAdd 107 tecla Símbolo Suma (+) del teclado numérico

vbKeySeparator 108 tecla Intro del teclado numérico

vbKeySubtract 109 tecla Símbolo Resta (-) del teclado numérico

vbKeyDecimal 110 tecla Símbolo decimal(.) del teclado numérico

vbKeyDivide 111 tecla Símbolo División (/) del teclado numérico

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 podría dar una API que detecta tal hecho, pero lo mejor y más sencillo -y
por lo tanto lo más 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 verás 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 más a la propiedad LEFT o TOP del control
en cuestión.

******************************************************************************************************
45. 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 = ""

46. PARA CREAR UN ARCHIVO DE TEXTO, SEPARADO POR TAB


Print # Text1.text & vbTab & Text2.Text

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

47a LIMPIAR EL COMBOBOX


<Nombre del combobox>.Clear

47b BLOQUEAR ESCRITURA EN COMBOBOX


Usar la propiedad: Style = 2-fmstyleDropDownList

48. CAPTURA EN UNA VARIABLE LA SELECCIÓN DE UN COMBOBOX


<var> = combo.list(combo.listindex)

49. CAMBIAR FOCO EN UN FORMULARIO


<NombreFormulario>.<NombreControl>..setfocus

50. CAPTURAR

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" & 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 instrucción 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

*- Nótese que las variables NO llevan comillas

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

Nota: al inicio de la sección Macros se encuentran otras instrucciones de selección

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
'alineación central (Right=derecha, Left=izquierda)
End With

4- Guardar la dirección 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 expresión Cells.Clearcontents borrará el contenido del total de celdas de la hoja activa


Utilizando solamente Clear se borrarán formatos también.

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 combinación: Unmerge

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


Range("B2").CurrentRegion.Select

10- Seleccionar hasta la última celda no vacía:


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 instrucción dará error si la celda A3 se encuentra vacía. Es preferible en ese caso realizar la
búsqueda de 'abajo hacia arriba', con:
Range("A65536").End(xlup).Select

11- Obtener la primer celda vacía, en col A:


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

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

51. Trabajando con Colecciones

En esta sección aparecerán algunas de las instrucciones 'básicas' 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
encontrarán más explicaciones y ejemplos para esa instrucción.

Una colección es un conjunto de objetos del mismo tipo: hojas, celdas, controles o Shapes, imágenes.
Para trabajar con una colección se programa un bucle: es decir repetir la misma instrucción para cada
elemento de la colección.

A continuación algunos ejemplos del bucle: For Each....Next

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

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 módulo)

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 módulo)

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 acción por cada valor que tome una variable i (se coloca en un módulo)

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 acción mientras se cumpla una condición (se coloca en un módulo)

Sub recorreRango()
'Se recorre la col A a partir de la fila 2 hasta encontrar una celda vacía.
'El valor de cada celda se incrementa en 1
Range("A2").Select
While Activecell.Value <> ""
ActiveCell.Value = ActiveCell.Value + 1
Wend
End Sub

52. Trabajando con Objetos

A continuación algunos ejemplos de cómo llamar a objetos insertados en hoja, como ser Cuadros de texto, Listas
o Cuadros combinados y también un Userform.
1- Llamando a un Userform, desde un botón:
En una hoja de Excel, los botones que lanzan una acción, pueden ser colocados con la barra de
Formularios o Cuadro de Controles.
a. Botón de formulario: se asigna una macro, como la del ejemplo, que previamente se escribió
en un módulo en el Editor de Visual Basic. Ejemplo:
Sub mostrando ()
UserForm1.Show 'nombre del Userform que se desea mostrar
End Sub
b. Botón del Cuadro de controles: una vez dibujado en la hoja, clic derecho, opción Ver código 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 cómo 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 botón 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 expresión '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
53. Trabajando con Libros

En esta sección aparecerán algunas de las instrucciones 'básicas' 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
encontrarán más explicaciones y ejemplos para cada instrucción.

Nota: Al inicio de esta sección 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 también: 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 extensión)

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

2-Activar un segundo libro:


Workbooks("Libro2.xls").Activate

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

3-Cerrar un libro (sin guardar):


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

4-Cerrar un libro (guardando los cambios):


ActiveWorkbook.Save
ActiveWorkbook.Close

'o en 1 sola línea: ActiveWorkBook.Close True

5-Guardar un libro con otro nombre:


ActiveWorkbook.SaveAs Filename:="C:\Mis doc\Libro1.xls", FileFormat:=xlNormal, Password:="clave",
ReadOnlyRecommended:=False

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 quizás: 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 opción de actualizar vínculos 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 ejecución 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 módulo 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 también puede llamarse utilizando la expresión Call
'Call Nuevamacro
End Sub
11- Capturar en una variable el nombre del archivo activo
<variable string> = activeworkbook.name

54. Trabajando con Hojas

En esta sección aparecerán algunas de las instrucciones 'básicas' 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
encontrarán más explicaciones y ejemplos para esa instrucción.

1-Seleccionar la hoja anterior o siguiente:


ActiveSheet.Previous.Select 'hoja anterior a la activa
ActiveSheet.Next.Select 'hoja posterior a la activa

2-Datos de la hoja:
ActiveSheet.Name 'nombre de la hoja
ActiveSheet.Index 'número 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 ' filas
ActiveCell.EntireColumn.Hidden= True 'col

5-Proteger o desproteger una hoja:


ActiveSheet.Protect "contraseña" 'proteger con contraseña
ActiveSheet.Unprotect "contraseña" 'quitar la protección

6-Insertar filas o columnas a partir de cierta ubicación:


'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 expresión: Cells(fila,col) y queremos hacer referencia a la celda AB5 por ej, necesitamos
conocer cuál 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 'o
ActiveSheet.PrintOut

Reemplazar PrintOut por PrintPreview para realizar solo una vista preliminar.

Esta página intenta ser una guía no solo para el que se inicia en el tema VBA sino también para aquellos
que, conociendo el tema, no recuerdan tal o cual instrucción o buscan ampliar sus conocimientos con otros
ejemplos.

Los temas se encuentran separados en categorías, desde un repaso por las instrucciones básicas, hasta
macros más desarrolladas, con varios ejemplos en cada una.

Como casi siempre hay más de una forma de programar un evento, podrán observar que a veces se
escribe una línea O la otra. Quiere decir que puedo utilizar cualquiera de las 2. (¡Nunca las 2 juntas!)

Los temas están divididos en 2 grupos principales: Conceptos e Instrucciones básicas (ver índice de
contenidos en margen izquierdo)

11 –Pasar a una variable la cantidad de hojas en el libro activo


Dim <Variable> as Integer
<variable> = Sheets.Count

54a. TRABAJANDO CON RANGOS


'Hacer referencia a todas las hojas del libro activo
ActiveWorkbook.Sheets.Select
http://share.payoneer-affiliates.com/a/clk/2mhvGX

'Hacer referencia a la hoja2


Sheets("Hoja2").Select

'Hacer referencia a la hoja que se encuentra en la posición 2 sin importar el nombre


Sheets(2).Select

'Hacer referencia a la hoja de la pestaña anterior a la activa


ActiveSheet.Previous.Select

'Hacer referencia a la hoja de la pestaña posterior a la activa


ActiveSheet.Next.Select

'Hacer referencia a una celda de otro libro


Application.Goto Workbooks("Libro1.xlsm").Sheets("Sheet1").Cells(7, 6)

'Hacer referencia a una hoja guardando en una variable el nombre de la hoja activa, previa a la
activa y posterior a la activa
Dim sheetnom As String
'Se guarda el nombre de la hoja activa, previa a la activa y posterior a la activa
sheetnom = ActiveSheet.Name
sheetnom = ActiveSheet.Previous.Name
sheetnom = ActiveSheet.Next.Name

'Hacer referencia a una hoja guardando en una variable el número de hoja, actual, previa a la
actual y siguiente
Dim sheetnumb As Byte
sheetnumb = ActiveSheet.Index
sheetnumb = ActiveSheet.Previous.Index
sheetnumb = ActiveSheet.Next.Index

'Selecciona la celda b8 de la hoja 1


Sheets("hoja1").Select
Range("C8").Select

'Hacer referencia de otra forma a la misma celda c8


Cells(8, 3).Select

'También podemos hacer referencia a la celda C8 pero de la hoja 2


Sheets("hoja2").Select
Cells(8, 3).Select

‘Amplia selección actual (1) hast columna 2 (2) y ennegrecer


Selection.Resize(1, 2).Select
Selection.Font.Bold = True

'Se puede seleccionar la celda c8 de la hoja activa mediante


ActiveSheet.Cells(8, 3).Select

'ActiveSheet.Cells(ActiveCell.Row, 1).Select

'Selecciona el rango continuo c2 a d10


Range("C2:D10").Select

'Selecciona todas las celdas de la hoja


Cells.Select

'Copiar todas las celdas de la hoja1 a la hoja2


Sheets("hoja1").Cells.Copy Destination:=Sheets("hoja1").Range("A1")

'Referencia de otra forma el rango c2:d10


Range(Cells(2, 3), Cells(10, 4)).Select

'Referenciar de otra forma el rango c2:c10


Range("C2", "D10").Select

'Seleccionar toda la columna B


Range("A:A").Select

'Seleccionar todas las columnas desde la columna A hasta la columna C


Range("A:C").Select

'Seleccionar toda la fila 4


Range("4:4").Select

'Seleccionar todas las filas desde la fila 1 hasta la fila 5


Range("1:5").Select

'Fijarse porque no funciona


'Selecciona el rango discontinuo c5 a g5; a6; f3 a h3 y c24
Range("C5:G5,A6,F3:H3,C24").Select

'Seleccionar la unión de dos o más rangos especificados, similar a seleccionar y tener apretado tecla ctrl
Application.Union(Range("A2: C5"), Range("F6: H12")).Select

'Seleccionar dos más columnas de columnas no contiguas de longitud variable


Set a = Range("A1", Range("A1").End(xlDown))
Set b = Range("E1", Range("E1").End(xlDown))
Union(a, b).Select

'Seleccionar un rango mayor al anteriormente seleccionado, el rango se amplía a 10 filas, 4 columnas


Range("D10").Select
Selection.Resize(10, 4).Select
'Seleccionar un rango mayor al anteriormente seleccionado, estableciendo la cantidad de fila y columnas
adicionales a seleccionar
Range("C2:D10").Select
Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count + 4).Select

'Seleccionar desde la celda E2 hasta la última celda con datos hacia abajo, similar a ctrl + shift
+ flecha hacia abajo
Range("E2", Range("E2").End(xlDown)).Select
'Otra forma de seleccionar
Range("E2:" & Range("E2").End(xlDown).Address).Select

'Seleccionar desde la celda E2 hasta la última celda con datos hacia la derecha, similar a ctrl +
shift + flecha hacia la derecha
Range("E2", Range("E2").End(xlToRight)).Select
'Otra forma de seleccionar
Range("E2:" & Range("E2").End(xlToRight).Address).Select

Identificar la última fila que contiene datos (i)

Sub ultimaFila1()
'Identifica la última fila que contiene datos
Dim ultimaFila As Long

ultimaFila = Range("A" & Rows.Count).End(xlUp).Row


MsgBox ultimaFila

End Sub

Para seleccionar la celda F7 en una hoja de cálculo de un libro diferente, puede utilizar
cualquiera de los ejemplos siguientes:
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Cells(7, 6)

21: Seleccionar un rango rectangular de celdas

Para seleccionar un rango de celdas rectangular alrededor de una celda, utilice el método
CurrentRegion. El rango seleccionado mediante el método CurrentRegion es un área limitada
por cualquier combinación de filas en blanco y columnas vacías. A continuación se muestra un
ejemplo de cómo utilizar el método CurrentRegion:
ActiveSheet.Range("a1").CurrentRegion.Select
Este código seleccionará las celdas A1 a C4. A continuación se enumeran más ejemplos de selección de
celdas del mismo rango:
ActiveSheet.Range("a1", _
ActiveSheet.Range("a1").End(xlDown).End(xlToRight)).Select

o bien

ActiveSheet.Range("a1:" & _
ActiveSheet.Range("a1").End(xlDown).End(xlToRight).Address).Select

55. MACRO: Una macro es un conjunto de instrucciones escritas en lenguaje Visual Basic (*), que nos
permite automatizar ciertas tareas que la aplicación no contempla desde las herramientas de la hoja.

Por ejemplo, si necesitamos que se inserten automáticamente 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)

Cómo se crea una macro: para automatizar una tarea mediante una macro básicamente se necesitan
los siguientes elementos:

1- un espacio de trabajo donde escribir las instrucciones o rutinas que harán 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 versión 2007, activar la opción 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 módulos
c- o insertando formularios personales o Userforms.
2- una acción 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
selección de celdas, antes de imprimir o guardar, el 'clic' en un botón de comando, al presionar
un atajo de teclado, y otros más.
3- un lenguaje de programación. En Excel utilizamos VBA (Visual Basic para Aplicaciones)
4- Ocasionalmente un formulario donde trabajar para luego volcar los resultados en las hojas:
llamados Userforms.

Dónde 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 según la versión).
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 botón, atajo de teclado o desde otra rutina, se colocará en
un módulo (estando en el Editor, menú Insertar, Módulo).
Las instrucciones para los controles de un formulario o Userforms se colocan en la sección
Código del mismo formulario.

Cómo ejecutar una macro: En el punto anterior se menciona que se necesita una 'acción' que dispare
o ejecute una macro grabada.
Veamos los distintos casos:

1- Una acción automática 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 botón dibujado en la hoja. Podemos utilizar botones de la barra 'Cuadro de
controles o ActiveX' o de la barra 'Formularios'. En versión 2003 se encuentra en Menú Ver,
Barras de Herramientas. En versión 2007 desde la ficha Programador
Dibujamos el control en la hoja, ajustamos algunas propiedades como texto, tamaño, ubicación.
Al hacer clic derecho sobre el control optamos por 'Ver código' o 'Asignar macro' según qué
barra de herramientas hemos utilizado.
a- Cuadro de controles: al optar por 'Ver código' nos llevará al Editor, al objeto HOJA
donde se generará automáticamente 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 módulo 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 módulo del Editor.
Desde la hoja Excel, menú Herramientas, Macros, Macros seleccionarla de la lista. Presionar
el botón 'Avanzadas' e ingresar una letra, por ejemplo 't' (sin las comillas)
Nota: Si Excel ya tiene asignada esta letra la reemplazará por Ctrl+Mayúsc +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 módulo
a ningún botón ni a atajo de teclado, la ejecutaremos desde este menú de Excel.
En versión 2007, activar la opción 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) : Número de hoja según el orden de las pestañas.
[Hoja2] : La 2da hoja según orden de las pestañas
Range o Cells : rango o celda
Activecell : la celda activa
Range("A2") : la celda A2
Cells(2,1) : la celda A2 .
*-Nótese 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 según valor de variable

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

56. FUNCIONES DE COMPROBACION


IsNuméric(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como numérico.
IsDate(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como tipo fecha.
IsEmpty(Expresión). Comprueba que expresión tenga algún valor, que se haya inicializado.
IsError(Expresión). Comprueba si expresión devuelve algún valor de error.
IsArray(Expresión). Comprueba si expresión (una variable) es un array o no.
IsObject(Expresión). Comprueba si expresión (una variable) representa una variable tipo objeto.
IsNull(Expresión). Comprueba si expresión contiene un valor nulo debido a datos no válidos.
Función IsEmpty
Nos comprueba si una celda o rango está vacío, no hay datos.
Sintaxis
IsEmpty(expresión)
El argumento expresión requerido es un tipo de datos Variant que contiene una expresión de cadena o
una expresión numérica. Sin embargo, ya que la función IsEmpty se utiliza para determinar si las
variables individuales están inicializadas, el argumento expresión 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á vacía”, 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 función InputBox. Y
ello es así porque esta función devuelve datos de tipo variant o sea cualquier expresión que se pueda
evaluar a datos numéricos, de cadena o de fecha. Para entenderlo mejor modifique el código 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 función IsEmpty no evalúa la cadena vacía, ya que InputBox en ese caso
devolvería un cero.
Función IsNumeric/Función IsDate
Nos comprueba si una expresión se evalúa como un número, para IsNumeric o fecha para IsDate Por
ejemplo evaluamos si en la celda activa hay valores numéricos:
Sub comprueba()
If Not IsNumeric(ActiveCell.Value) Then
MsgBox “Error”
Else
MsgBox “Los valores son numéricos”
End If
End Sub
Función IsObject
La función 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 numéricos”
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

57. Evento OnKey:

El evento OnKey ejecuta un procedimiento específico cuando una tecla o combinación de teclas
se pulsan.
A continuación os relaciono una matriz con los códigos que representa cada tecla en el teclado.

Clave Código

RETROCESO {RETROCESO} o {BS}

BREAK {PAUSA}

CAPS LOCK {} BLOQ MAYÚS

CLEAR {CLEAR}

SUPR o DEL {DELETE} o {DEL}

FLECHA ABAJO {DOWN}

FIN {END}

ENTER (teclado numérico) {ENTER}

ENTER ~ (tilde)
CES { Salir} o {ESC}
AYUDA {AYUDA}

INICIO {HOME}

INS {INSERT}

FLECHA A LA IZQUIERDA {Left}

BLOQ NUM {BLOQ NUM}

PÁG {} PGDN

PÁG {} PGUP

REGRESAR {Return}

FLECHA A LA DERECHA {Derecha}

SCROLL LOCK {} ScrollLock

TAB {TAB}

FLECHA ARRIBA {UP}

F1 a F15 {F1} a través {F15}

También se pueden especificar en combinación con las teclas SHIFT , CTRL y ALT.

Para combinar con las teclas Precede el código clave por

SHIFT + (signo más)

CTRL ^ (acento circunflejo)

ALT % (signo de porcentaje)

Pegue las siguientes instrucciones en un módulo:

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

Sub Message()
MsgBox "Hola"
End Sub

58. ARREGLO (ARRAY)


Rutina de un arreglo variable del contenido en hoja1 celda A2 (A1 Titulo colulmna) y
traspasa los datos a un combobox

Private Sub ComboBox1_gotfocus()


Dim clientes As Long
'cuenta el número de elementos en la Hoja1
clientes = Sheets("Hoja1").Range(Range("A2"), Range("A2").End(xlDown)).Rows.Count
'definimos una Matriz sin dimensiones determinadas
Dim MyArray() As Variant
'sabiendo el número de elementos a incluir, redimensionamos nuestra Matriz
ReDim MyArray(1 To clientes, 1) As Variant
'En caso de error, que continúe
On Error Resume Next
'limpiamos el ComboBox
ComboBox1.Clear
'añadimos cada valor del rango definido de la Hoja1 como elemento de la Matriz
For i = 1 To clientes
MyArray(i, 1) = Worksheets("Hoja1").Cells(i + 1, 1).Value
'incluímos cada elemento de la Matriz dentro del Cuadro combinado
ComboBox1.AddItem MyArray(i, 1)
Next i
End Sub

58a COMPARANDO DOS ARREGLOS

Sub compare_two_array()
Dim thisarray As Variant
Dim thatarray As Variant

thisarray = Range("range1").Value
thatarray = Range("range2").Value
counter = 1
While counter <= UBound(thisarray)
x = thisarray(counter, 1)
y = thatarray(counter, 1)
If x = y Then
MsgBox "yes"
Else MsgBox "no"
End If
counter = counter + 1
Wend
End Sub

58b ARREGLO MULTIDIMENSIONAL

59. Acelerar la ejecución


Cuando un programa corre, todo lo que tiene que ver con actualización de
pantalla es sumamente lento, y lo mejor es desconectar toda actualización de
video. Para ello debes agregar el siguiente código al inicio de la macro.

Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.StatusBar = "Iniciando..."

Y este código al final.

Application.ScreenUpdating = True
Application.StatusBar = "Ejecución terminada."
Application.ScreenUpdating se encarga de encender y apagar la actualización
de video. Application.DisplayStatusBar = True habilita la barra de estado que
está en la parte inferior de la ventana de Excel, y allí despliegas mensajes
asignando una hilera a Application.StatusBar. La idea de usar la barra de estado
es que si la ejecución de la macro tarda mucho, es bueno que el usuario sepa
que la macro está trabajando, y que no se ha quedado atascada.
No hay nada que fastidie más que tener un programa atascado frente a uno. Por
eso sería bueno que dentro de la macro agregues otros mensajes donde el
usuario pueda ver que la macro va caminando, pero si pones mensajes con
demasiada frecuencia eso ralentizará la ejecución, porque como dijimos, la
actualización de video consume mucho tiempo de la máquina.

Esto es especialmente útil cuando vas a correr una macro que pasa de un libro
de Excel a otro o que se mueve mucho a lo largo de las páginas o celdas de
manera muy intensiva.

60.

You might also like