Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
3. SOLICITA UNO O VARIOS RANGOS DEL MISMO LIBRO U OTROS LIBROS ABIERTOS
Y PROCESAR EL RANGO SELECIONADO [Con Inputbox() ]
[instrucciones]
Next
ActiveCell.FormulaR1C1 = ("=subtotal(9,r7c13:r10000c13)")
Pone la formula en la celda activa
Activecell.end(xldown)
Activecell end(xltoleft)
Activecell end(xltoright)
Activecell end(xlup)
Selection.End(xlDown).Select
Activecell.offset(1,0).select
Range(“A1:B3”).Select
Range(“B2”).Activate
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())
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
Sheets(“Nombre”).Select
Selection.ClearContents
Cells.Select
Selection.EntireColumn.Delete
Selection.EntireRow.Delete
Selection.EntireRow.Insert
Windows (“NombreArchivo”).Activate
26. INSERTA LINEA SI DOS FILAS MAS ABAJO DE CELDA ACTIVA TIENE DATOS
If ActiveCell.Offset(2,0)<>”” then
Selection.EntireRow.Insert
End if
Next a
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
Vnom = Worksheets("menu").Range("nom")
Dim Rg as Range
For Each Rg In Worksheets("menu").Range("nom")
<commandos>
Next
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
End Sub
37. REDONDEAR CELDAS
Set Rr = Selection
For Each Ss In Rr
Zz = Round(Ss, 0)
Ss.Value = Zz
Ss.NumberFormat = "#,##0"
Next Ss
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"
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
'********************************
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
If Cc = Dir Then
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
If Cc = Dir Then
Range("F" & Aa).Select
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.
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:
'---------------------------------------------------------
'
' 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
'
End Function
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
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:
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)
‘End Sub
‘End Sub
50. CAPTURAR
'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
'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 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
Sub ultimaFila1()
'Identifica la última fila que contiene datos
Dim ultimaFila As Long
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)
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.
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
**************************
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}
ENTER ~ (tilde)
CES { Salir} o {ESC}
AYUDA {AYUDA}
INICIO {HOME}
INS {INSERT}
También se pueden especificar en combinación con las teclas SHIFT , CTRL y ALT.
Sub DemoOnKey()
Application.OnKey "{TAB}", "Message"
End Sub
Sub Message()
MsgBox "Hola"
End Sub
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
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.StatusBar = "Iniciando..."
Application.ScreenUpdating = True
Application.StatusBar = "Ejecución terminada."
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.