Sie sind auf Seite 1von 52

ACCEDER CELDAS CON

VBA
Existe un par de maneras para acceder las celdas de nuestras
hojas utilizando VBA. Podemos utilizar el objeto Range y
también podemos utilizar el objeto Cells. A continuación
revisaremos ambos objetos.
SELECCIONAR UNA CELDA
Si deseamos seleccionar la celda B5 podemos utilizar
cualquiera de las dos instrucciones siguientes:

Range("B5").Select

Cells(5, 2).Select

El objeto Cells tiene como primer argumento el número de fila y


como segundo argumento el número de columna.

SELECCIONAR UN RANGO
Para seleccionar un rango de celdas lo más conveniente es
utilizar el objeto Range de la siguiente manera:

Range("A1:D5").Select

El objeto Cells no nos permite seleccionar un rango porque


solamente podemos especificar una celda a la vez.

ESTABLECER EL VALOR DE UNA CELDA


Para establecer el valor de una celda podemos utilizar alguna
de las siguientes instrucciones:
Range("B5").Value = 500

Cells(5, 2).Value = 600

VENTAJA DEL OBJETO CELLS


Es mucho más común encontrarse el objeto Range en las
aplicaciones VBA, sin embargo el objeto Cells ofrece una
ventaja que debemos considerar cuando necesitamos hacer un
recorrido programático por varias celdas ya que será muy
sencillo especificar las filas y columnas utilizando una variable
numérica.

For i = 1 To 10

For j = 1 To 5

Cells(i, j).Value = i * j

Next j

Next i

Compación entre Range y Cells


19/11/2012 por Editor | 2 comentarios
Compación entre Range y  Cells
Existe un par de maneras para acceder las celdas de nuestras hojas utilizando
VBA. Podemos utilizar el objeto Range y también podemos utilizar el objeto Cells.
El objeto Cells tiene como primer argumento el número de fila y como segundo
argumento el número de columna, el objeto no nos permite seleccionar un rango
porque solamente podemos especificar una celda a la vez.
Cells(5, 2).Select
Para seleccionar un rango de celdas lo más conveniente es utilizar el objeto Range
de la siguiente manera:
Range("A1:D5").Select
Establecer valor a las celdas con los 2 objetos señalados, ejemplo:
Range("B5").Value = 100
Cells(5, 2).Value = 200
Ventaja del objeto cell
El objeto Cells ofrece una ventaja que debemos considerar cuando necesitamos
hacer un recorrido programático por varias celdas ya que será muy sencillo
especificar las filas y columnas utilizando una variable numérica.
Ejemplo
Sub AZUL()
For i = 4 To 40
For j = 2 To 10
Cells(i, j).Value = i * j
Next j
Next i
End Sub

INSERTAR FÓRMULA
DESDE VBA EN EXCEL
Al programar en VBA constantemente interactuamos con los
datos de las celdas en nuestras hojas y accedemos fácilmente
a ellos a través de la propiedad Value sin embargo, cuando
llega el momento de insertar una fórmula desde VBA dicha
propiedad deja de ser funcional. En esta ocasión revisaremos
las alternativas que tenemos para insertar una fórmula de Excel
desde una macro.
LA PROPIEDAD FORMULA DE UNA CELDA
Además de la propiedad Value que tienen todas las celdas en
Excel, cada una de ellas también tendrá la
propiedad Formula la cual almacenará la fórmula asociada.
Para mostrar el uso de esta propiedad supondremos un
escenario en el que la celda A1 de nuestra hoja tiene el valor 5
y la celda B1 tiene el valor 3. Para insertar una fórmula en la
celda C1 que haga la suma de las dos celdas anteriores,
insertaré un botón de comando con el siguiente código:
1 Private Sub CommandButton1_Click()
2     Range("C1").Formula = "=A1+B1"
3 End Sub

Al pulsar el botón de comando obtendremos el resultado


deseado en la celda C1:
Para dejar en claro la diferencia entre las
propiedades Value y Formula de una celda, crearé un nuevo
botón de comando que mostrará un cuadro de diálogo con
ambas propiedades. El código será el siguiente:
1 Private Sub CommandButton2_Click()
2     MsgBox "Value: " & Range("C1").Value & vbCrLf & _
3             "Formula: " & Range("C1").Formula
End Sub
4
Al pulsar el botón obtendré un mensaje como el siguiente:

El valor de la celda mostrado en pantalla está almacenado en


la propiedad Value mientras que la fórmula asociada a la
misma celda se encuentra en la propiedad Formula. Con esto
queda clara la diferencia entre ambas propiedades.
INSERTAR FUNCIONES DE EXCEL DESDE
VBA
Como bien sabemos, las fórmulas de Excel pueden contener
funciones que facilitarán nuestros  cálculos. Si
queremos insertar una fórmula desde VBA en Excel que
utilice alguna función debemos utilizar su nombre en inglés. Por
ejemplo, si en lugar de hacer la suma de las celdas A1+B1 del
ejemplo anterior queremos utilizar la función SUMA debemos
utilizar el siguiente código:
1 Private Sub CommandButton1_Click()
2     Range("C1").Formula = "=SUM(A1, B1)"
3 End Sub

Al pulsar el botón obtendremos el resultado esperado en la


celda C1:
Aun cuando la celda C1 en la hoja muestra la función SUMA, la
propiedad Formula en VBA espera recibir el nombre de
cualquier función en inglés. Si hacemos caso omiso de esta
advertencia nuestra celda desplegará el error #¿NOMBRE?
Para comprobar esta aseveración agregaré un nuevo botón,
con un código similar al anterior pero solamente cambiaré el
nombre de la función SUM (en inglés) por el nombre SUMA (en
español). Observa lo que sucede en la celda C1 al pulsar este
nuevo botón:

Esto podría convertirse en un problema si no conoces el


nombre de las funciones en inglés. De manera personal,
siempre recomiendo a cualquier usuario avanzado de Excel
que conozca el nombre de las funciones tanto en español como
en inglés, pero si eso se dificulta, Excel nos ofrece una solución
alterna con la propiedad FormulaLocal.
LA PROPIEDAD FORMULALOCAL DE UNA
CELDA
Si al momento de insertar una fórmula desde VBA deseas
utilizar una función de Excel pero no recuerdas su nombre en
inglés, ni tampoco lo puedes buscar en Internet, entonces
tienes la opción de utilizar la propiedad FormulaLocal que te
permitirá utilizar el nombre de la función en el idioma que
corresponde a la instalación de Excel.
Para demostrar el comportamiento de esta propiedad crearé el
mismo ejemplo de la sección anterior que utiliza la función
SUMA, pero ahora asignaré la fórmula a la
propiedad FormulaLocal de la siguiente manera:
1 Private Sub CommandButton1_Click()
2     Range("C1").FormulaLocal = "=SUMA(A1, B1)"
3 End Sub

Al pulsar el botón de comando se insertará correctamente la


fórmula requerida y no veremos el error #¿NOMBRE? como
sucedió con la propiedad Formula.

Como puedes ver en la imagen anterior, la función SUMA hace


uso de la coma (,) como el separador de argumentos. Esto se
debe a la configuración regional de mi equipo y por tal motivo
en el código VBA he colocado también la coma para separar
los argumentos de la función. Sin embargo, si te encuentras en
una región donde el separador de argumentos es el punto y
coma (;) entonces deberás modificar el código para incluir dicho
carácter o de lo contrario se desplegará un error al momento de
pulsar el botón de comando.
EL SEPARADOR DE ARGUMENTOS DE
UNA FUNCIÓN
Cada vez es más común el compartir información entre
diferentes países y el hecho de que tengamos diferencias en el
separador de argumentos en diferentes regiones puede llegar a
causar un problema ya que aquellos usuarios que utilicen un
separador de argumentos diferente al nuestro recibirán un
mensaje de error.
Este problema lo podemos resolver si dejamos que Excel
descubra el separador de argumentos para posteriormente
utilizarlo en la construcción de nuestra fórmula. En el siguiente
código utilizo la variable Separador para obtener dicho carácter:
1 Private Sub CommandButton1_Click()
2     Separador = Application.International(xlListSeparator)
3     Range("C1").FormulaLocal = "=SUMA(A1" & Separador & "B1)"
End Sub
4
De esta manera Excel insertará la fórmula utilizando el
separador de argumentos utilizado en el equipo local y no
habrá problema alguno en las diferentes regiones que utilicen
nuestro archivo.

Es muy importante mencionar que el problema del separador


de argumentos se presenta solamente si utilizas la
propiedad FormulaLocal. Si utilizas la
propiedad Formula siempre deberás utilizar la coma (,) y no
tendrás que preocuparte de las posibles diferencias en el
separador de argumentos ya que Excel se encargará de
adecuar la fórmula para utilizar el carácter adecuado en base a
la región donde se utilice el archivo.
LA PROPIEDAD FORMULAR1C1 Y
FORMULAR1C1LOCAL
Finalmente hablaré de las
propiedades FormulaR1C1 y FormulaR1C1Local que son
equivalentes a las propiedades Formula y FormulaLocal pero
con la diferencia de que utilizan el estilo de referencia R1C1,
que en español es conocido como el estilo de referencia F1C1.
Si queremos insertar una fórmula desde VBA en la celda C1 tal
como en los ejemplos anteriores, pero utilizando un estilo de
referencia F1C1, entonces debemos utilizar el siguiente código:
1 Private Sub CommandButton1_Click()
2     Range("C1").FormulaR1C1 = "=SUM(R1C1, R1C2)"
3 End Sub
4  
5 Private Sub CommandButton2_Click()
6     Separador = Application.International(xlListSeparator)
    Range("C1").FormulaR1C1Local = "=SUMA(F1C1" & Separador & "F1C2)"
7 End Sub
8
En el código del primer botón utilizo el nombre de la función en
inglés ya que utilizo la propiedad FormulaR1C1 pero para el
segundo botón, que hace uso de la
propiedad FormulaR1C1Local, puedo indicar el nombre de la
función en español. Esto no es extraño ya que lo hemos hecho
de la misma manera en los ejemplos anteriores, pero lo que es
diferente en esta ocasión es la manera en que se indican las
referencias en los argumentos de la función.
En el caso de la propiedad FormulaR1C1 se espera la
información de la fórmula en inglés y por lo tanto la referencia
se crea utilizando la nomenclatura R1C1 (R para Row), pero al
utilizar la propiedad FormulaR1C1Local se espera la
información en español y por lo tanto es necesario utilizar la
nomenclatura F1C1 (F para Fila) de manera que la fórmula sea
creada correctamente.

Nuestra hoja de Excel no reflejará la nomenclatura F1C1


porque está configurada con el estilo de referencia A1, la única
manera de ver el mismo estilo de referencia en la barra de
fórmulas sería cambiar el estilo de referencia de las
fórmulas de nuestro libro de Excel. Aun así es posible utilizar el
estilo de referencia F1C1 (R1C1) desde nuestro código VBA
para crear fórmulas que hagan referencia a las celdas por su
número de columna y de fila.
Con las propiedades que hemos revisado en este artículo
tendrás las herramientas necesarias para insertar una fórmula
desde VBA sin mayor dificultad. Descarga el libro de
trabajo que he utilizado y comprueba por ti mismo cada uno de
los métodos presentados en esta publicación.
Userform aplicado al registro de facturas
03/12/2012 por Editor | 12 comentarios
EJEMPLO DE USERFORM PARA REGISTRO DE FACTURAS
Los formularios en Excel son un método para ingresar datos a nuestras hojas
y son de mucha utilidad porque nos ayudan a evitar errores en la captura de
información
En este caso elaboraremos  un userform que nos permita registrar facturas de los
proveedores de un
Supermercado,  teniendo en cuenta los siguientes variables:
1. Tipo de proveedor
2. Nombre del proveedor
3. Número de factura
4. Moneda en que se pagará la factura.
5. Monto de la factura
En cuanto al tipo de proveedor, la persona que ingresará la factura tendrá para
elegir dos opciones: proveedor nacional  o proveedor extranjero.
Para el caso del nombre de proveedor, éste podrá ser elegido de una lista de
proveedores ya ingresados en el sistema.
La moneda en que se pagará la factura también estará predeterminada, pudiendo
elegir entre soles, dólares y euros.
Comencemos con el desarrollo del formulario:
Lo primero que hacemos es crear en el archivo un botón de comando que esté
asignado al formulario a ser llenado.
Para esto es necesario ir a PROGRAMADOR/INSERTAR/CONTROLES ACTIVEx/
BOTÓN DE COMANDO

(Para mayor visualización de la imagen, hacer click en la misma)


Luego ingresamos un código en el Botón de comando que permita que al hacer
click sobre éste se muestre el Formulario.
(Para mayor visualización de la imagen, hacer click en la misma)
El código a ingresar es el siguiente:
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
También insertamos códigos que permitan mostrar mensajes de bienvenida y de
salida:
Private Sub registrodedatos_Open()
MsgBox "Supermercados Eroski le da la bienvenida, por favor ingrese los datos."
End Sub
Private Sub registrodedatos_Deactivate()
MsgBox "Supermercados Eroski,precios más bajos siempre."
End Sub
El formulario  a  utilizarse tiene un aspecto así:

(Para mayor visualización de la imagen, hacer click en la misma)


Tengamos en cuenta que:
CommandButton1 ---> Actualizar tipo de proveedor
OptionButton1 ---> Nacional
OptionButton2 ---> Extranjero
TextBox1 ---> Almacena Tipo de Proveedor seleccionado
ComboBox1---> Almacena lista de proveedores
CommandButton2---> Actualizar Proveedor
TextBox2 ---> Almacena  Proveedor seleccionado
TExtBox3 ---> Almacena número de factura.
ComboBox2---> Muestra moneda en que se puede pagar la factura (soles, dólares,
euros).
TextBox4---> Almacena monto de la factura a registrar
CommandButton3 ---> Graba todos los datos registrados en la hoja Base de Datos
CommandButton4 --> SALIR
Los códigos de programación utilizados son los siguientes:
Private Sub CommandButton1_Click()
If OptionButton1.Value = True Then
TextBox1.Text = OptionButton1.Caption
End If
If OptionButton2.Value = True Then
TextBox1.Text = OptionButton2.Caption
End If
End Sub
Private Sub CommandButton2_Click()
TextBox2.Text = ComboBox1.Text
End Sub
Private Sub userform_activate()
ComboBox1.Clear
ComboBox1.AddItem ("LAIVE")
ComboBox1.AddItem ("SHEARVAN")
ComboBox1.AddItem ("BACKUS")
ComboBox1.AddItem ("NESTLE")
ComboBox1.AddItem ("REDFIELD")
ComboBox1.AddItem ("BIMBO")
ComboBox1.AddItem ("COLGATE PALMOLIVE")
ComboBox1.AddItem ("PROCTER&GAMBLE")
ComboBox1.AddItem ("FLORIDA")
ComboBox1.AddItem ("GLORIA")
ComboBox1.AddItem ("SUAVE")
ComboBox1.AddItem ("IPHOIDEAS")
ComboBox1.AddItem ("QUIRCH FOODS")
ComboBox1.AddItem ("KRAFT FOODS")
ComboBox1.AddItem ("LINDLEY")
ComboBox1.AddItem ("CLOROX")
ComboBox2.Clear
ComboBox2.AddItem ("PEN")
ComboBox2.AddItem ("USD")
ComboBox2.AddItem ("EUR")
End Sub
Private Sub CommandButton3_enter()
Sheets("Base de datos").Select
Range("A2").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = TextBox1
ActiveCell.Offset(0, 1).Select
ActiveCell = TextBox2
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = ComboBox2.Value
ActiveCell.Offset(0, 1).Select
ActiveCell = TextBox3
ActiveCell.Offset(0, 1).Select
ActiveCell = TextBox4
ActiveCell.Offset(0, 1).Select
TextBox1 = Empty 'textbox1, dejar en blanco
TextBox2 = Empty
TextBox3 = Empty
TextBox4 = Empty
TextBox5 = Empty
MsgBox "REGISTRO FINALIZADO" 'mostrar el mensaje "REGISTRO
FINALIZADO"
End Sub
Private Sub CommandButton4_Click()
Sheets("Principal").Select
UserForm1.Hide
End Sub
Uso y Propiedades del Combobox
21/04/2012 por Editor | 33 comentarios
El COMBOBOX es una herramienta que se presenta al crear un UserForm dentro
VisualBasic.

ESTE ES UN EJEMPLO DE UN COMBOBOX.


El COMBOBOX es una herramienta muy importante dentro del EXCEL
especialmente en la creacion e implementacion de formularios.
La principal tarea del COMBOBOX es el despliegue de información, esto se logra
dando click en la flechita de la figura anterior, habiendo sido insertada la
informacion con anterioridad.
A continuación se mostrara dos formas de insertar información en un
COMBOBOX.
PRIMERA FORMA:
Esta forma es la más útil , ya que no se tiene que estar accediendo al código para
insertar algún elemento dentro del COMBOBOX . Por el contrario la información es
agregada en ciertas celdas del excel, la cual con un código pertinente sera
insertada dentro del COMBOBOX.
Por ejemplo:
El programa busca apartir de la celda (2,1) hacia abajo y empieza a insertar los
elementos dentro del COMBOBOX hasta que ya no encuentre elementos en las
celdas.

Se despliega la información .
SEGUNDA FORMA:
Esta segunda forma consiste en insertar los elementos en el COMBOBOX desde
el código.
Por ejemplo:
Los elementos son insertados al COMBOBOX desde el código del programa

Se despliegan los elementos en el COMBOBOX


PROPIEDADES DEL COMBOBOX:
El COMBOBOX presenta muchas propiedades dentro de las cuales están:
Apariencia
Comportamiento
Dato
Fuente
Posición
Otros
Formularios VBA – Uso y propiedades del OptionButton
17/06/2012 por Editor | 2 comentarios
La función OptionButton es útil para elegirá UNA SOLA OPCIÓN frente a varias
opciones (son mutuamente excluyentes), por ende deben presentarse al menos 2
opciones para que sea válido. Asimismo, cuando se selecciona dicha única opción,
se inicia alguna función u operación previamente establecida.
Las siguientes son todas las propiedades que el VBA tiene respecto al
OptionButton, ordenado por categorías:
 Apariencia:
 Alignment (alineación): determina si la descripción del botón
estará a la derecha o izquierda del botón.
 BackColor: cambia el color (según paleta predeterminada)
del campo del cuadro del optionbutton.
 BackStyle: determina si el campo del cuadro del
optionbutton tendrá fondo o sea transparente.
 Caption: modifica la descripción (texto) del optionbutton
 ControlTipText: Muestra un recuadro con información
adicional cuando el mouse está encima del control
 ForeColor:  cambia el color (según paleta predeterminada)
del texto de la descripción del optionbutton
 SpecialEffect: existen 0 – para un efecto de sombreado al
botón del optionbutton o 1 – para un efecto simple (sin sombreado)
 Value: los valores que puede tener son Verdadero/True o
Falso/False si se selecciona o no el botón asociado (respectivamente).
Como ejemplo, se generará un botón comando que muestre un msgbox
dependiendo del optionbutton seleccionado (que tendrá de value “true”):
Private Sub CommandButton1_Click()
If OptionButton1.Value = True Then
   MsgBox "Seleccionaste Stat Cases"
End If
If OptionButton2.Value = True Then
   MsgBox "Seleccionaste Actual Cases"
End If
End Sub
o Visible: existe la opción falso/false o verdadero/true para
ocultar o no (respectivamente)  el cuadro del optionbutton en el
userform
 Comportamiento:
 AutoSize: permite que el control se autoajuste al texto
contenido (opciones true o false)
 Enabled: para habilitar o deshabilitar el control
 Locked: determina si un control puede ser editador o no
(true o false)
 TextAlign: alinear el texto de la descripción del optionbutton
en 1 – izquierda, 2 – centrado y 3 - derecha
 TripleState:  “true” si el control permite 3 estados, “false” si
el control solo soporta 2 estados (true y false, por defecto)
 WorldWrap: determina si el contenido de un control se
mantendrá automáticamente al final de una línea y el control se
expandirá para que quepa el texto.
         Dato:
o   ControlSource: se puede usar para especificar que data
aparecerá en un control. Se puede mostrar y editar data
asociada a una table, query o sentencia de SQL. También se
puede mostrar el resultado de una expresión.
         Fuente:
o   Font: para configurar la fuente del texto en el optionbutton
(fuente, estilo de fuente, tamaño, efectos, alfabeto)
         Imagen:
o   Picture: para que la descripción del optionbutton sea una
imagen en vez de texto
o   PicturePosition: para elegir entre 12 opciones de ubicación de
la imagen dentro del cuadro de optionbutton
          Posición:
 o   Height: tamaño del optionbutton
 o   Left: posición a la izquierda del optionbutton
 o   Top: alineación vertical del optionbutton
 o   Width: para configurar el largo del control
          Varias:
 o   Accelerator: Establece o recupera la tecla de aceleración para un
control
 o   GroupName: útil cuando existen varios cuadros de control de
optionbutton para agruparlos distintamente y no sean excluyentes
entre sí.
 o   HelpContextID: Este número se aplica para determinar la ayuda
interactiva asociada al formulario
 o   MouseIcon: esta opción es válida cuando el MousePointer está
configurado en 99. El puntero del mouse a mostrarse
 o   MousePointer: para seleccionar entre 16 opciones el tipo de cursor al
estar dentro del cuadro del optionbutton
 o   TabIndex: correlatividad para la selección de los objetos dentro del
userform con la pulsación de la tecla tab
 o   TabStop: tiene valores true o false; se pone este último para que no
sea considerado en el enfoque mediante la pulsación de la tecla tab
 o   Tag: se puede usar para asignar un texto de identificación a un
objeto sin afectar ninguna de sus otras propiedades configuradas o
causando otro efecto secundario. Esta propiedad es útil cuando se
necesita verificar la identidad en un formulario, reporte, sección o
control que ha pasado de una variable a un procedimiento. También
es útil para sumar valores de distintos grupos de optionbuttons.
A continuación un ejemplo gráfico de las distintas opciones/selecciones en un
userform con optionbutton:

Propiedades y eventos del Textbox


16/06/2012 por Editor | 14 comentarios
Definición:
Es un control sumamente básico en VBA (Macros de Excel), usado para mostrar o
editar textos, pero con la particularidad de no tener formato. Permite realizar
entrada y/o la salida de datos en nuestras aplicaciones; presenta el texto en una
forma determinada cuyo contenido podemos cambiarlo durante la constitución del
proyecto.
Reconocido como elemento típico en las interfaces gráficas en donde es posible
insertar textos, los cuales suelen ser rectangulares, vacios de textos y con fondo
blanco, con el objetivo de poder escribir sobre estos.
Suelen utilizarse en: formularios, herramientas y aplicaciones, donde se muestra
textos editables (entrada de datos “input”) las cuales tienen barras de
desplazamiento para que el usuario pueda moverse dentro del texto, no pudiendo
salir de estos ya que cuenta con componentes encapsuladores.
Propiedades:
Cuando estemos editando un TextBox y queremos las propiedades de esta, solo
pulsemos (botón derecho y con esto obtenemos el menú contextual, luego
seleccionar propiedades; con esta acción obtendremos el cuadro de propiedades
del TextBox y desde aquí podemos editar sus generalidades. A continuación
presentaremos las propiedades más resaltantes:
TEXT: en esta propiedad se indica el texto que aparecerá en el control (en el
TextBox). El usuario puede introducir cualquier texto el cual es tratado durante la
ejecución.
NAME: propiedad importante que ya viene con un nombre por defecto (Text1),
este nombre controla al TextBox cuando se utilice en la arquitectura del VBA
(código). Dato importante es que en un mismo formulario no puede haber 2
controles con el mismo nombre.
MULTILINE: Para que funcione esta propiedad debe estar con el valor true. Nos
permite como su nombre lo dice, trabajar con varias líneas de texto en el TextBox.
TEXTALIGN: su importancia radica en que nos permite alinear el texto del control
(TextBox) en la izquierda, centro o derecha.
LOCKED: sirve para bloquear el control (TextBox), es decir si esta activada con
valor “true”, entonces  se bloquea el control automática no permitiendo introducir ni
modificar el texto que contenga.
BACKCOLOR: nos indica el color de fondo.
FORECOLOR: nos indica el color de letra.
FONT: manifiesta el tipo y tamaño de letra.
Eventos (TextBox):
Son todas las acciones que se pueden realizar con el TextBox: click, doble click,
movimiento del mouse. Estas acciones se les pueden relacionar o asociar códigos
para que se ejecute al producir el evento.
MOUSEMOVE: se mueve el mouse por encima del TextBox.
MOUSEDOWN: se ejecuta al pulsar cualquier botón del mouse.
CHANGE: se ejecuta al cambiar el contenido del TextBox.
CLICK: se ejecuta al hacer click con el botón izquierdo del mouse sobre el
TextBox.
DBLCLICK: se ejecuta al hacer doble click con él con el botón izquierdo del
mouse sobre el TextBox.
Ejemplo para editar un TextBox
Una de las tantas formas de rellenar el cuadro de texto es ejecutar los siguientes
pasos:
 Hacer clic en el botón de comando (insertar).
 Hacer clic secundario (Ver código).
 En VBA (Macros/Excel), Agregue la línea siguiente código:
 TextBox1.Text = "Ejemplo para PUCP"
 El resultado será el siguiente::

Identificar la última fila en uso con VBA


09/06/2012 por Editor | 44 comentarios
¿En qué nos ayudaría identificar la última fila en uso?
Usualmente las bases de datos en Excel tienen mucha información; por eso,
perderíamos tiempo buscando el último dato con la barra de desplazamiento.
Sin embargo, esto se puede solucionar, haciendo uso de las macros.
¿Qué código podemos usar para buscar la última fila?
Sub BuscarUltimaFila()
Dim ult As Integer
ult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox ult
End Sub
Ahora entendamos el código:
Cells(Rows.Count,1) = Al usar Rows.Count estamos contando todas las filas
disponibles en excel cuyo valor seria 1048576. Como lo usamos en un
Cells, estaremos seleccionando la fila 1048576. El "1" indica la columna en la cuál
se esta trabajando ("A") .
End(xlUp) = Estamos indicando que desde la fila indicada (1048576), "suba"
hasta que encuentre un valor.
Row = Indicamos que grabe el número de la fila ocupada encontrada.
MsgBox ult = Mostramos ese valor en un cuadro de texto.
 

Seleccionar la última fila en VBA


Ahora, si queremos seleccionar esa celda podemos agregar el siguiente código:
Sub BuscarUltimaFila()
Dim n As Long
countult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox countult
Cells(Rows.Count, 1).End(xlUp).Select
End Sub
Como podemos observar, en vez de .Row , le ponemos .Select
Última fila libre en VBA
Alternativamente, si queremos buscar la última fila libre, haremos uso del Offset:
Sub BuscarUltimaFila()
Dim n As Long
countult = Cells(Rows.Count, 1).End(xlUp).Offset(1,0).Row
MsgBox countult
Cells(Rows.Count, 1).End(xlUp).Offset(1,0).Select
End Sub
Con Offset(1,0) , al encontrar la última fila en uso, saltamos 1 fila más la cual sería
la última fila libre.
Generar números primos en Excel
25/04/2017 por Editor | 1 comentario
A veces nos preguntamos ¿Cómo sacar los números primos en Excel?,
o si ¿Existe una fórmula para sacar los números primos?, en nuestro
artículo Números Primos mostramos en que consisten estos números, y
colocamos algunos ejemplos de números primos previamente generados, en este
artículo mostraremos como generar los números primos.
Descargue el siguiente archivo Generar números primos en excel,  el cual contiene
el programa mostrado a continuación, para poder emplearlo solo debe indicar
el número límite hasta el cual realizar la generación de números primos.

Sub numeroprimo()
Application.ScreenUpdating = False
'Cells(1, 1) = 1
Cells(2, 1) = 2
celda = 3
numero = InputBox("ingrese un número entre 3 y 10000")
If numero >= 3 And numero < 10000 Then
For x = 3 To numero Step 2
cantidad = 0
For y = 2 To (x - 1)
Z = x Mod y
If Z = 0 Then
cantidad = cantidad + 1
Exit For
End If
Next
If cantidad = 0 Then
Cells(celda, 1) = x
celda = celda + 1
End If
Next
End If
Application.ScreenUpdating = True
MsgBox "Finalizó"
End Sub
Sumar solo celdas en Negritas
16/03/2015 por Editor | 1 comentario
A veces solo queremos resaltar algunos números dentro de un conjunto de datos
que tenemos en Excel para luego sumarlos, pero Excel no tiene la función de
sumar lo que sea que resaltemos. Por eso a continuación se mostrara cómo sumar
un conjunto de números que esté en negritas.
 
Primero abrimos VBA para introducir la siguiente función

Lo que se está haciendo es definir un rango de celdas dentro de las cuales las que
estén en negritas se sumaran utilizando la función sumabold
Para probarlo tenemos el siguiente conjunto de números

(Para mayor visualización de la imagen, hacer click en la misma)


Damos clic, y los números en negrita serán sumados con esta función

Función para Sumar Datos por Color


20/03/2015 por Editor | 6 comentarios
La presente UDF, nos permitirá sumar datos, los cuales los diferenciaremos por
color. A continuación crearé una breve base de datos, en donde se diferenciarán a
los clientes por su género (hombre y mujer), en este caso particular los hombres
serán de color verde y las mujeres serán de color naranja. Así se evidencia en la
base de datos:

(Para mayor visualización de la imagen, hacer click en la misma)


Como se puede observar, los diversos ingresos de los clientes están entre S/1,000
y S/10,000. Como queremos hallar los ingresos totales por los hombres y las
mujeres. Se puede hallar por medio de filtros, pero como podemos tener bases de
datos más grandes o diversas, es más útil utilizar la próxima función, la cual se
programa de la siguiente forma:

(Para mayor visualización de la imagen, hacer click en la misma)


La programación se puede interpretar de la siguiente manera:
Function sumacolor(Color As Range, Range As Range) As Long
Dim celda As Range
Dim colornumeros As Integer
Dim sumcol
colornumeros = Color.Interior.ColorIndex
Primero definimos los campos que tomarán la función, primero definimos que el
primer campo tomará los colores de dicha celda, y el segundo campo solo
escogerá los valores de un rango de datos, los cuales deberán coincidir con el
primer campo.
Luego definimos a las variables que utilizaremos, y le diremos al Excel que la
variable "colornumeros" será igual a los color que se encuentren en la respectiva
celda que escogeremos.
For Each celda In Range
If celda.Interior.ColorIndex = colornumeros Then
sumcol = WorksheetFunction.Sum(celda.Value) + sumcol
End If
Next celda
sumacolor = sumcol
End Function
Una vez que ya definimos la celda a escoger, decimos que si la celda coincide con
el color que estamos buscando, la incluya en la sumatoria, luego con "next"
indicamos que busque a la siguiente celda y si esta coincide la agrega a la
sumatoria, de esta forma se seleccionarán a todas las celdas del mismo color que
se encuentren en el rango seleccionado.

(Para mayor visualización de la imagen, hacer click en la misma)


En nuestro caso en color, seleccionamos la celda que usaremos como referencia,
en este caso la "F3", luego en Range seleccionamos todo el campo que queremos
sumar, en este caso los ingresos de los clientes. De esta forma encontramos los
siguientes resultados, los cuales son la sumatoria de los ingresos por mujeres y
hombres.
Para mayor información o si el lector desea agregar nuevos campos, adjunto el
presente archivo: UDF - SumaColor

Sumar por color de Celda  (alternativo)


De forma alternativa podemos usar COLOR en lugar de COLORINDEX, con
ello tendríamos que cambiar:
Dim colornumeros As Integer
colornumeros = Color.Interior.ColorIndex
Por:
Dim colornumeros2 As String
colornumeros2 = Color.Interior.Color
Esto se produce por que COLORINDEX reconoce una limitada cantidad de colores
(56)
El código quedaría de la siguiente forma:
Function sumacolor(Color As Range, Range As Range) As Long
Dim celda As Range
Dim colornumeros2 As String
Dim sumcol
colornumeros2 = Color.Interior.Color
For Each celda In Range
If celda.Interior.Color = colornumeros2 Then
sumcol = WorksheetFunction.Sum(celda.Value) + sumcol
End If
Next celda
sumacolor = sumcol
End Function
Ideas para concatenar celdas con VBA o Macros
14/07/2013 por Editor | 5 comentarios
Usualmente se concatena la data con pocas celdas.
Entonces que pasaria si deseo concatenar muchas mas celdas??
Para ello se creó la Función CONCATENARCELDAS HECHOS EN VBA:
Con esta función se logrará concatenar a grandes rangos de data de manera mas
rápida.
A continuación se muestra el VBA:
Function ConcatenarCeldas(rango As Range)
For Each celda In rango.Cells
If celda.Value " " Then
resultado = resultado & "; " & celda.Value
End If
Next
resultado = Right(resultado, Len(resultado) - 2)
ConcatenarCeldas = resultado
End Function

(Para mayor visualización de la imagen, hacer click en la misma)


EL SIGUIENTE EJEMPLO ESTA AL FINAL DE LA HOJA CON LINK DE
DESCARGA DEL EXCEL

Colecciones de objetos en excel


14/10/2016 por Editor | Sin comentarios
Una colección es un objeto que puede ser utilizado para agrupar y administrar
objetos relacionados, en otras palabras, se utiliza un conjunto de elementos
ordenados a los que se puede hacer referencia como unidad.
En Excel podemos encontrar colecciones ya predeterminadas como la colección
de celdas, hojas, libros, gráficos, controles, etc. Una colección es similar a una
matriz de objetos pues también se puede acceder a sus elementos mediante un
índice.
En síntesis, la definición del objeto colecciones en Excel se puede resumir en los
siguientes puntos:
Una colección es un objeto que contiene otros objetos.
Una colección proporciona una forma de acceso a los miembros que forman parte
de la colección .

Métodos de las colecciones en VBA


Add, método que consiste, o permite, agregar un elemento a un objeto Collection
de VBA.
Remove, permite retirar o quitar un elemento de un objeto Collection de VBA.

Propiedades de las colecciones en VBA


Count, devuelve un valor de tipo Integer (entero) que contiene el número de
elementos que se encuentra en una colección.
Item, devuelve un elemento concreto de un objeto Collection de VBA por medio
de la posición o clave que tiene el elemento en la colección.

Ejemplos de colecciones en VBA


Estos son ejemplos de algunas colecciones en excel:
CustomViews: Colección de las vistas personalizadas de un libro
PivotTables: Colección de tablas dinámicas contenidas en un libro
SlicerCaches: Colección de los objetos SlicerCaches asociados a un libro.
Connections: Colección de las conexiones a orígenes de datos para el libro.
Charts: Colección de los gráficos de un libro.
objetos, propiedades y métodos de macros en excel
30/08/2016 por Editor | 1 comentario
Objetos
En el mundo de la programación el concepto de objeto tiene un significado
diferente al usual. En este ámbito los objetos no son cosas materiales, sino existen
en forma de bytes y bits y es en general todo lo que vamos a poder manipular en el
Excel. Por ejemplo: una celda, una hoja y un libro son objetos y de esta manera
existen muchos más objetos en Excel. Además es importante mencionar que todos
los objetos tienen propiedades (características) y métodos (acciones), los cuales
serán explicados más adelante.
Propiedades de los objetos
En este caso, como todos los objetos tienen propiedades, podemos denominarlas
como atributos que van a  describir al objeto. Estas propiedades describen como
se ve el objeto, como se comporta, si puede observarse, etc.
En el uso del VBA, nosotros podemos hacer dos cosas con las propiedades de los
objetos: la primera es examinar la configuración de la propiedad, mientras que la
segunda es cambiar esta configuración.
Por ejemplo, las celdas tienen una propiedad llamada valor, la cual es el contenido
que tiene cada celda. Nosotros podemos escribir un código VBA para mostrar el
valor específico de cada celda, esto se podría hacer de la siguiente manera:
Sub mostrarvalor()
contenido= Worksheets(“Hoja1”).Range(“A1”).Value
MsgBox contenido
End Sub
Por otro lado, suponiendo que quieres cambiar la opción o valor de esa propiedad
de la celda puedes aplicar también otra macro, ejemplo:
Sub cambiarvalor()
Worksheets(“Hoja1”).Range(“A1”).Value = 94.21
End Sub
Finalmente no hay que olvidarnos que la colección también es un objeto, y como
tal tiene sus respectivas propiedades. Por ejemplo, si queremos determinar
cuántos libros tenemos abiertos podemos usar la siguiente VBA que nos mostrara
con un mensaje lo que queremos saber:
Sub contarlibros()
MsgBox Workbooks.Count
End Sub
 
Métodos
Así como los objetos tienen propiedades también cuentan con métodos. Un
método es una acción que puedes realizar con un objeto, por decir, puede cambiar
las propiedades de un objeto o indicarle al objeto que realice algo específico.
En el primer ejemplo, veremos el método ClearContents, el cual hará que se
elimine el contenido de la celda A1 de la hoja que está activa:
 
Sub borrarrango()
Range(“A1”).ClearContents
End Sub
Además los métodos pueden tener uno o más argumentos -un argumento es un
valor que le añade especificaciones a la acción a realizar, se escribe luego de los
métodos separado por un espacio y entre ellos se separan por una coma- para
obtener un mejor resultado.
En el siguiente ejemplo, activamos la hoja 1 y luego copiamos el contenido de la
celda A1 a la B1, usando el método de copiado (Copy Range).
Sub copiar()
Worksheets(“Hoja1”).Activate Range(“A1”).Copy Range(“B1”)
End Sub
Finalmente, como es de esperarse, como una colección es un objeto entonces
también tiene métodos. Por ejemplo, la siguiente macro usa el método  Add para
añadir otro libro a la colección:
Sub nuevolibro()
Workbooks.Add
End Sub
VBA – Objeto WORKBOOKS
13/02/2013 por Editor | 1 comentario
VBA - OBJETO WORKBOOKS
El objeto que se realiza por VBA, se puede contenerse sobre otro objeto. La raíz o
la procedencia de los objetos por VBA vienen de una aplicación, llamada “objetos
de workbooks”. Los objetos que son Workbook  representa a los libros del propio
Excel y a su vez este se puede desplegar en varias hojas.
Las propiedades que podemos encontrar en los objetos Workbooks son las
siguientes:
   Hoja activa (Activesheet)
   Name          (MsgboxActiveworkbook.Name)
   Saved          (Activesavedworkbook.saved=true/False)
  ReadOnly
Así también podemos encontrar aquellos métodos que se pueden aplicar en los
objetos workbooks:
  Save   (Activeworkbook.save)
  Close (Activeworkbook.close)
 Print Out
  Protect /unprotect (Permite proteger un libro /desproteger, para
que lo las personas o usuarios no hagan modificaciones en las hojas).
Algunos Ejemplos:
1).
Sub Close_wbk_excel()
Workbooks(1).Close True 'cerrar el libro guardando cambios
Workbooks("5").Close 'cerrar el libro sin guardar cambios
Workbooks(2).Save 'Guarda el libro
Workbooks(3).SaveAs "C:\Documents and Settings\JesusMartin\Escritorio\Excel
ejemplo.xls"
'guarda una copia
Workbooks(4).SaveCopyAs "C:\Documents and
Settings\JesusMartin\Escritorio\Copia de ejemplo Excel.xls"
End Sub
2) Abrir el libro Trabajo. xls que se posiciona en una carpeta y unidad de uso.
Solución: Workbooks.Open FileName:=”Trabajo.xls”
3)  También podemos hacer una referencia en un libro de VBA.
Solución : Primero necesitamos tener abiertos aquellos archivos los cuales
necesitamos para luego  hacer referencia a cada uno de ellos , a través de la
colección de objetos workbooks
Application.Workbooks(1).Activate
Es importante mencionar que el (1) en paréntesis indica el índice del objeto
workbook dentro de la colección de objetos workbooks. A partir de ello se contará
la numeración de conforme se vaya abriendo los archivos.
Por otro lado también se tiene objeto que se puede representar a las hojas de un
libro (worksheet). Ambos tipos de objeto se junta en una colección conocida como
workbook.
VBA – Objeto Worksheets
10/11/2012 por Editor | 6 comentarios
VBA - Objeto Worksheets
La colección Worksheets es el conjunto de todos los objetos Worksheet de
un libro especificado o activo. Las colecciones son objetos por sí mismos.
El objeto WorkSheet  representa una hoja de cálculo. El objeto Worksheet también
es un miembro de la colección Sheets. La colección Sheets contiene todas las
hojas del libro (hojas de gráficos y hojas de cálculo).
En la jerarquía de objetos de Excel los objetos pueden actuar como recipientes de
otros objetos. Un objeto Workbook puede contener otros objetos como Worksheet
y Chart. Un objeto Worksheet puede contener objetos como Range, Pivot Table
entre otros. Así, se puede hacer referencia a la  Hoja1 del Libro1 del siguiente
modo:
Aplication.Worbooks(“Libro1.xlsx”).Worksheets(“Hoja1”)   
Se usa Worksheets(índice), donde índice es el nombre o número índice de la hoja
de cálculo, para obtener un solo objeto Worksheet.  El número de índice de la hoja
de cálculo representa la posición de la hoja en la barra de fichas del libro.
Worksheets(1) es la primera hoja (en el extremo izquierdo) del libro y
Worksheets(Worksheets.Count) es la última.
Propiedades del objeto Worksheets
Las principales propiedades y su descripción se encuentran en la Ayuda Excel y
son: Aplication, Count, HpageBreaks, Item, Parent, Visible y VpageBreaks
Detalle de uso de:
Worksheets.Visible (propiedad)
Devuelve o establece un valor de tipo Variant que determina si el objeto es visible.
Sintaxis
expresión.Visible
expresión:   Variable que representa un objeto Worksheet.
Ejemplo: Con el  siguiente código se oculta la hoja de cálculo 1 de un libro activo:
   Worksheets(1).Visible=False
Métodos del objeto Worksheets
Las principales métodos y su descripción se encuentran en la Ayuda Excel y
son: Add, Copy, Delete, FillAcrossSheets, Move, PrintOut, PrintPreview y Select.
Detalle de uso de :
Worksheets.Add (método)
Crea una hoja de cálculo, un gráfico o una hoja de macros. La nueva hoja de
cálculo se convierte en la hoja activa.
Sintaxis
expresión.Add(Before, After, Count, Type)
expresión :  Variable que representa un objeto Worksheets.
Los parámetros son opcionales (Before/After especifica las hoja antes/después de
la cual se agregará la hoja, Count por default es 1 y Type por default es una hoja
de cálculo)
Ejemplo: Se creará una nueva hoja en el libro activo y que será colocada a la
derecha de todas las demás hojas, mediante la siguiente sintaxis:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
End Sub
Esta macro crea una nueva hoja y la coloca después de la última hoja, a la cual
hacemos mención con "Sheets(Worksheets.Count)".

Trucos y tretas en Excel VBA para


programadores
Comstar
13/12/2011
25 comentarios
Este post no está hecho para novatos que no sepan nada del
macros de Excel, sino aquellos que saben algo de programación
de Visual Basic. Si eres neófito en macros de Excel en Visual
Basic, deberías ver mi post Excel VBA y macros: Una
herramienta muy útil para trabajar hojas de cálculo (1).  Me han
de perdonar la manera en que aparece el código, pero es un
problema en la manera en que aparece el código HTML para
desplegar código con indentación en este sitio.

Especialmente en finanzas o en bolsa, pero también en


negocios de todo tipo, programar macros de Excel suele ser
sumemante útil y por eso he querido deicar este post a
transmitir algunos trucos para ahorrarte tiempo.  Cuando
programamos código para macros de Excel VBA a menudo nos
encontramos con que los detalles de cómo invocar tal o cual
cosa de Excel termina siendo muy críptica y debes navegar por
foros, tutoriales o incontables páginas ininteligibles de
Microsoft que no te responden lo que andas buscando.

Si sabes Visual Basic, lo más lógico es que para elaborar


macros, trates de grabar una macro primero, y luego empiezas a
ver el código de muestra para ver cómo hacer determinadas
cosas.  En este post se pretende proveer trucos de
programación en Excel VBA para efectuar tareas que no se
pueden derivar del código grabado en una macro en Excel. 
Estos trucos son el resultado de resolver una serie de
problemas que en su momento significaron un dolor de cabeza.

Obtener valor de una celda


Cells(4,5)=23
x = Cells(4,5)+1

Este ejemplo inserta el valor 23 en la celda de la fila 4 y


columna 5.  Luego la variable x toma ese valor y le suma 1. 
Cabe añadir que cada vez que llamamos una celda, una
cantidad muy grande de código de Excel es invocada, de modo
que si piensas trabajar con muchas celdas o muchas veces con
la misma celda, es mejor que pases los valores a variables, en
lugar de llamar a la celda en sí misma.
Cells(2,3).Select
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter

En este ejemplo, la celda de la fila 2 columna 3 es seleccionada,


y la selección luego es objeto de centrado vertical y horizontal
usando Selection.

Usando rangos
Pasar de la notación de fila y columna a la de celdas suele ser
un poco incómodo.  Normalmente para seleccionar un rango
usaríamos algo como esto:

Range("A5:B8").Select
Como has visto, lo que está procesando la
función Range()  entre comillas es una hilera de caracteres.
Para efectos de escribir código, podemos usar esta expresión
equivalente:
Range(Cells(5,1),Cells(8,2)).Select

Convertir números en letras (pasar de la notación fila 5 columna


1 a "A5") suele ser sumamente incómodo. Para ello he
construido una función que hace el trabajo.

Private Function GetColumnLetter(index) As String


Dim FL, LL As Long

GetColumnLetter = ""
LL = (index - 1) Mod 26 + 65
If LL > 63 Then GetColumnLetter = Chr(LL)
If index > 26 Then
FL = Int((index - 1) / 26) + 64
GetColumnLetter = Chr(FL) & GetColumnLetter
End If

End Function

La función convierte el número en letras, en caracteres. Cabe


anotar que sólo sirve para llegar hasta columna ZZ, de modo
que si se pasa de esa columna, esta función no te servirá. Para
llamar esta función con las mismas coordenadas (5,1) y (8,2)
harías algo como esto para convertir en hilera:

Range(GetColumnLetter(5) & Format(1,"0") & ":" & GetColumnLetter(8)


& Format(2,"0")).Select
Como habrás notado he usado la función Format()  que evita
que se agreguen espacios al convertir de número a hilera, como
pasaría con la función Str().

Ventana emergente para que el


usuario ingrese un rango
 
Si quieres que aparezca una ventana emergente con la cual
puedas pedir al usuario que seleccione un rango de datos,
puedes usar el código que se muestra a continuación.  Lo que
se hace es declarar un objeto de
tipo Range  llamado celdasSeleccionadas.  A ese objeto se le
asigna el resultado de la función Application.InputBox que
despliega la ventana emergente que solicita la información al
usuario.  Si el usuario no ingresa ningún rango, el valor que
tendrá el objeto es Nothing.
El comando On Error Resume Next indica que si ocurre un
error, entonces ignore el error y proceda conla siguiente
instrucción. El comando On Error Goto 0 indica que se cancela
la detección de errores.  El comando Msgbox despliega
información en una ventana emergente.

He aquí el código:

Dim celdasSeleccionadas As Range

On Error Resume Next


Set celdasSeleccionadas = Application.InputBox(prompt:="Seleccione
un rango de celdas", Type:=8)
On Error GoTo 0
If celdasSeleccionadas Is Nothing Then
'Aquí va el código que se ejecuta si no se selecciona ninguna
celda.
'En este caso se despliega una ventana emergente con un
mensaje.
MsgBox "No se ha seleccionado ninguna celda."
Else
'Aquí va el código que se ejecuta si se se seleccionó celdas.
'En este caso se despliega una ventana emergente con el
resultado de la suma de celdas.
MsgBox
Application.WorksheetFunction.Sum(celdasSeleccionadas.Cells)
End If

Como habrás notado en este código lo que se hace si el usuario


digita un código es desplegar el valor de la suma de todos los
valores del rango usando la
función Application.WorksheetFunction.Sum, pero tú puedes
hacer que haga algo distinto.

Si quisieras obtener el valor contenido en el rango seleccionado


puedes usar este código.

MiVariable = celdasSeleccionadas.Value

En este caso el contenido del rango se almacena en una


variable llamada MiVariable.

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.

Obtener posición de la última


celda
Cuando tienes hojas de Excel de tamaño variable y necesitas
ubicar la última celda ocupada (la que está más abajo y más a
la derecha), puedes usar lo siguiente:

ActiveCell.SpecialCells(xlLastCell).Select
UltimaFila = ActiveCell.Row
UltimaColumna = ActiveCell.Column

Si buscas en Internet acerca de cómo obtener posición de la


última celda, encontrarás maneras muy diversas.  Sin embargo,
esta es la mejor que he encontrado.  Si agregas valores más
allá de la última celda, el valor se actualiza.  El único problema
es que si borras filas o columnas, este número no cambiará,
sino hasta que abras de nuevo el archivo de Excel.  Sin
embargo eso es mejor que nada, y puedes verificar si
encuentras celdas en blanco, así que eso no debería ser
problema.

Obtener los nombres de libros de


Excel abiertos.
En ocasiones ocupas una lista de los libros de Excel que están
abiertos.  Para ello te vales del objeto Workbooks  de Excel.
Dim NombreDeArchivo() as String

Redim NombreDeArchivo(Workbooks.Count-1)
For i = 1 To Workbooks.Count
NombreDeArchivo(i-1) = Workbooks.Item(i).Name
Next i
El arreglo NombreDeArchivo  almacenará los nombres de los
archivos de Excel que están abiertos en un momento dado.

Obtener la lista de páginas del


libro de Excel
Puedes usar el siguiente código.

Dim NombreDePagina()
Dim Cantidad as Long

Cantidad = Sheets.Count
redim NombreDePagina(n)
For i = 1 To Cantidad
NombreDePagina(i) = Sheets(i).Name
Next i
Los nombres se almacenan en el arreglo NombreDePagina.

Obtener los nombres de las


gráficas (charts) que hay en una
página de Excel
Hay ocasiones en que ocupas buscar todas las gráficas
contenidas en una página de Excel.  para ello te vales de
ActiveSheet.ChartObjects

Dim NombreDeChart()

Redim NombreDeChart(ActiveSheet.ChartObjects.Count-1)
For i = 1 To ActiveSheet.ChartObjects.Count
NombreDeChart(i-1) = ActiveSheet.ChartObjects(i).Name
Next i
El arreglo NombreDeChart  contendrá los nombres de las
gráficas de la hoja de Excel en que nos encontramos.

Obtener el nombre del libro de


Excel en que te encuentras
actualmente
Existen algunas situaciones donde ocupas saber el nombre del
libro de Excel en que te encuentras actualmente.

LibroActual = ActiveWorkbook.Name
El nombre de la hoja actual será guardado en la
variable LibroActual.

Cambiar de libro o de hoja


Si deseas pasarte a otro libro abierto u otra hoja, puedes usar el
siguiente código.

Workbooks("MiLibro.xls").Activate
Sheets("Sheet1").Select
Este código hará que te pases al libro de Excel MiLibro.xls y a la
página Sheet1 de ese libro. Como ves, el valor entre comillas
puede ser reemplazado por una variable tipo String  si lo
deseas.

Cómo lidiar con libros de


Excel protegidos por password
If ActiveSheet.ProtectContents Then
ActiveSheet.Unprotect Password:="XYZ"
End If
Este código se encargará de eliminar la protección contra
password.  En este caso el password es XYZ.  Cuando trabajas
con hojas protegidas con password, obtendrás errores al tratar
de acceder a material protegido y por eso debes desproteger la
hoja para trabajar en ella.

Enviar un correo con archivo


adjunto
Si quieres generar un correo y pegarle un archivo adjunto,
puedes usar el siguiente código:

   Dim oLook As Object


    Dim oMail As Object
    
    Set oLook = CreateObject("Outlook.Application")
    Set oMail = oLook.createitem(0)
    With oMail
        .To = "mipersona@dominio.com"
        .body = "Este es el cuerpo del mensaje. Ver archivo adjunto"
        .Subject = "Asunto. Envio de archivo adjunto"
        .Attachments.Add ("C:\MiArchivo.xlsx")
        .Send
    End With
   
    Set oMail = Nothing
    Set oLook = Nothing

Este código buscará el archivo MiArchivo.xlsx ubicado en C:\,


construirá el mensaje y lo enviará a la
dirección mipersona@dominio.com.  La lógica de este código
usa un poco de programación orientada a objetos.  oLook es un
objeto que se encarga de manejar la aplicación Outlook, y oMail
es un objeto que se encarga de manejar el correo.

Ocultar una hoja e impedir que


el usuario la vea
Si quieres ocultar una hoja de Excel para que el usuario no la
pueda ver, y no pueda mostrar su contenido usa este código:

    Set hide_sheet = Sheet1


    hide_sheet.Columns.Hidden = True
    hide_sheet.Visible = False
El código lo que hace es ocultar todas las columnas de la hoja
Sheet1 y luego oculta la hoja.  Cabe notar que Sheet1 no es el
nombre de la hoja visible para el usuario, sino el nombre del
objeto que aparece en el editor de código de Excel VBA fuera de
los paréntesis.

Crear un botón en una hoja de


cálculo
Si quieres crear un botón:

ActiveSheet.Buttons.Add ActiveCell.Left, ActiveCell.Top,


ActiveCell.Width, ActiveCell.Height

El código crea un botón sobre la celda en la que estás ubicado


actualmente.

Cargar, refrescar, salvar y


cerrar una hoja de cálculo
Si quieres efectuar esas tareas:

    Workbooks.Open Filename:="C:\MiArchivo.xlsx", UpdateLinks:=3


    Workbooks("MiArchivo.xlsx").RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close

El código efectúa las cuatro tareas descritas en ese orden.

Cómo usar el portapapeles


El portapapeles no viene incluido en la versión básica de Excel
VBA, así que primero tenemos que configurar algunas cosas.  

 Ve al editor de Visual Basic (Alt F11).


 Selecciona Tools > References

 
 Activa Microsoft Forms Object Library y presiona Ok.

Si no aparece Microsoft Forms 2.0 Object Library en la lista,


quizás quieras usar el botón Browse para buscar el archivo
FM20.DLL que se encuentra en la ubicación en disco duro que
se muestra en la imagen.

Ahora que ya configuramos todo, veamos el código.


Primero deberías declarar el objeto de portapapeles (en este
caso le llamaremos doClip)
    Dim doClip As DataObject

Este sería el método para crear el portapapeles en memoria.


    Sub CrearClipboard()
        Set doClip = New DataObject
    End Sub
 

Con este método puedes destruir el objeto portapapeles en


memoria para liberar espacio.
    Sub DestruirClipboard()
        Set doClip = Nothing
    End Sub
 

Con este método copias un texto al portapapeles.


Sub CopiarAlClipboard(sTexto As String)
doClip.Clear
doClip.SetText sTexto
doClip.PutInClipboard
End Sub

Con esta función extraes el texto del portapapeles. 

Function ClipboardTexto() As String


doClip.GetFromClipboard
ClipboardTexto = doClip.GetText
End Function

Cómo configurar área de
impresión
Para configurar el área de impresión ocupas la orientación
portrait o landscape.  He puesto las muestras de las líneas para
ambos casos, aunque tú sólo ocuparías una.  Si vas a ajustar a
una o más páginas horizontal o verticamente, primero necesitas
poner el modo Zoom en apagado y luego puedes configurar los
ajustes.  Y también debes delimitar el área de impresión que
en este ejemplo es desde A1 hasta H25.

ActiveSheet.PageSetup.Orientation = xlPortrait
ActiveSheet.PageSetup.Orientation = xlLandscape

ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.FitToPagesWide = 1
ActiveSheet.PageSetup.FitToPagesTall = 1
ActiveSheet.PageSetup.PrintArea = "A1:H25"

Cómo crear una lista de archivos


y directorios
Para obtener una lista de archivos, ve al siguiente sitio:  List
all files in a directory.
Para listar archivos y subdirectorios ve al sitio List folders and
subdirectories.

Otros trucos
Existen trucos para optimizar el desempeño de Visual Basic,
tales como:
 Evitar al máximo el uso de propiedades de controles.  Las
celdas de Excel son controles. Los forms (formulario,
ventana) y los controles sobre un form son controles. Usar
propiedades de controles agrega mucha carga de
procesamiento innecesario.  Por ejemplo, el valor de una celda
es una propiedad del control llamado celda.  El texto de un
control de texto es una propiedad. Hay que minimizar la
referencia a controles hasta donde sea posible, pasando los
valores de los controles a una variable, se trabaja todo en la
variable, y al final se actualiza la propiedad del control con el
valor final de la variable.
 Apaga la actualización de video, porque el tiempo de
actualizar la pantalla innecesariamente consume enormes
cantidades de tiempo de procesamiento.
 Evitar el uso de variables tipo Variant.  Estas variables
generalmente aparecen cuando no se declaran las variables. 
Para hacer que el Visual Basic muestre un error cuando vea
variables no declaradas, puedes poner esto al inicio de cada
módulo.
Option Explicit

 Espero que estos trucos te sirvan, porque a mí me han servido


mucho.
https://docs.microsoft.com/es-mx/office/vba/language/concepts/getting-
started/understanding-objects-properties-methods-and-events

OBJETOS, PROPIEDADES
Y MÉTODOS
Los objetos en Excel (VBA) son cosas. Una celda es un
objeto, una hoja es un objeto, un libro es un objeto y de esta
manera existen muchos más objetos en Excel. A esto lo
conocemos como el modelo de objetos de Excel.
Cada uno de los objetos de Excel
tiene propiedades y métodos. Las propiedades son las
características del objeto y los métodos son las acciones que el
objeto puede hacer.
PROPIEDADES DE UN OBJETO
Si una persona fuera un objeto de Excel sus propiedades
serían el color de sus ojos, el color de su cabello, su estatura,
su peso. De la misma manera, un objeto de Excel tiene
propiedades por ejemplos, una celda (Range) tiene las
propiedades valor (Value) y dirección (Address) entre muchas
otras. Estas propiedades describen mejor al objeto.
MÉTODOS DE UN OBJETO
Siguiendo con el ejemplo de una persona, si fuera un objeto de
Excel sus métodos serían correr, caminar, hablar, dormir. Los
métodos son las actividades o acciones que el objeto puede
realizar. Los objetos de Excel se comportan de la misma
manera que el ejemplo de una persona. Una celda (Range)
tiene los métodos activar (Activate), calcular (Calculate), borrar
(Clear) entre muchos más.
UTILIZANDO LAS PROPIEDADES Y LOS
MÉTODOS
Para acceder a las propiedades y métodos de un objeto lo
hacemos a través de una nomenclatura especial. Justo
después del nombre del objeto colocamos un punto seguido del
nombre de la propiedad o del método. Observa este ejemplo
donde hacemos uso de la propiedad Value para la celda A1:
Range("A1").Value = "Hola"

De esta manera asignamos una cadena de texto al valor de la


celda A1. Ahora bien, si queremos borrar ese valor que
acabamos de colocar en la celda podemos utilizar el
método Clear de la siguiente manera:
Range("A1").Clear
VER TODAS LAS PROPIEDADES Y
MÉTODOS
Los objetos tienen muchas propiedades y métodos y a veces
es difícil pensar que los llegaremos a memorizar todos por
completo. Sin embargo, el Editor de Visual Basic es de gran
ayuda porque justamente al momento de escribir nuestro
código nos proporciona la lista completa de propiedades y
métodos para un objeto.

Esto sucede al momento de introducir el punto después del


nombre del objeto. Puedes distinguir entre las propiedades y
métodos porque tienen iconos diferentes. En la imagen de
arriba los métodos son los que tienen el icono de color verde.

Recuerda, los objetos son cosas en Excel y sus características


las llamamos propiedades las cuales  nos ayudan a definir al
objeto. Los métodos son las acciones que cada objeto puede
realizar.
Cómo usar la propiedad
RANGE.OFFSET

Excel > VBA > Propiedades > Propiedad RANGE.OFFSET > Cómo usar la


propiedad RANGE.OFFSET


 Share
 Guardar

Autor: Oscar Cronquist Artículo actualizado en Agosto 31, 2018

La propiedad OFFSET devuelve un objeto Range basado en un


número de fila y columna. La imagen de arriba muestra una macro
que usa la celda E7 y aplica un desplazamiento con filas 6 y
columnas 4. Msgbox muestra la dirección del objeto Range.
Sintaxis de propiedades de Excel
Expresión. Offset (RowOffset, ColumnOffset)

Argumentos
expresión Necesario. Objeto de rango.
RowOffset Opcional. Cuántas filas debe compensar el objeto de rango.
Si se omite, se utiliza 0 (cero). El argumento puede ser un
valor positivo o negativo.
ColumnOffset Opcional. Cuántas columnas debe compensar el objeto de
rango. Si se omite, se utiliza 0 (cero). El argumento puede
ser un valor positivo o negativo.

Comentarios
También es posible compensar un rango de celdas que contiene
varias celdas. La siguiente imagen muestra la propiedad OFFSET
con un argumento ColumnOffset de -2.
Cómo utilizar el método RANGE.FIND
Excel > VBA > Métodos > Método de rango.find > Cómo utilizar el
método RANGE.FIND


 Share
 Guardar

 Autor: Oscar Cronquist Artículo actualizado en Agosto 28, 2018


El método Range.Find devuelve un objeto de rango para la primera
celda que coincide con el valor de búsqueda.
Macro utilizada en el libro de trabajo anterior
Sub Macro1()
 
MsgBox Range("B3:B8").Find(Range("D3")).Address
 
End Sub

La macro anterior utiliza el método Range.Find para buscar el rango


de celdas B3: B8 para el valor de búsqueda en la celda D3. Un
cuadro de mensaje muestra la dirección de la celda encontrada.

Sintaxis del método de Excel


expresión. Qué, después, LookIn, LookAt, SearchOrder,
SearchDirection, MatchCase, MatchByte, SearchFormat )
Argumentos
expresión Necesario. Objeto de
rango.
qué Necesario. El valor de
búsqueda.
después Opcional. Donde desea
que comience la
búsqueda. Tenga en
cuenta que comienza a
buscar la celda
después de esta celda.
Debe ser una sola
célula. La celda
predeterminada es A1.
pase a ver Opcional. Constantes
de XlFindLookIn:
Fórmulas xl
xlValues -
xlNotes -
mirar Opcional. Constantes
XlLookat:
xlWhole
xlPart
buscador Opcional.
XlSearchOrder
constantes:
xlByRows
xlByColumns
direccion de Opcional. Constantes
busqueda de XlSearchDirection:
xlNext (1): busca el
siguiente valor
coincidente en el
rango.
xlPrevious (2): busca
el valor de
coincidencia anterior
en el rango.
maleta Opcional. Verdadero -
Búsqueda de
mayúsculas y
minúsculas. El valor
predeterminado es
falso.
matchbyte Opcional. Para soporte
de caracteres de doble
byte.
Verdadero: los
caracteres de doble
byte coinciden con los
caracteres de doble
byte.
Falso: los caracteres de
doble byte coinciden
con los caracteres de
un solo byte. Valor por
defecto.
formato de
Opcional.
búsqueda

Comentarios
El método Find no va a cambiar la selección o la celda activa, solo
devuelve el objeto de rango del valor encontrado.
LookIn, LookAt, SearchOrder y MatchByte se guardan
automáticamente cada vez que utiliza el método Find. Los valores
guardados se usan si no especifica estos argumentos. El cuadro de
diálogo Buscar también cambia esta configuración y viceversa, lo
que significa que el método Buscar cambia la configuración del
cuadro de diálogo Buscar. Asegúrese de especificar estos
argumentos cada vez que use el método Find para evitar
comportamientos impredecibles.
También parece que la qué argumento también se guarda en el
cuadro de diálogo Buscar.

Ejemplo 1 - Valor no encontrado

La macro devuelve un error si no se encuentra el valor. Error en


tiempo de ejecución '91': variable de objeto o con variable de bloque
no establecida. Para manejar el error, vea la siguiente macro.
Sub Macro2()
 
If Range("B3:B8").Find(Range("D3")) Is Nothing Then
    MsgBox "Value not found"
Else
    MsgBox Range("B3:B8").Find(Range("D3")).Address
End If
 
End Sub
Ejemplo 2 - Encuentra valores múltiples

La siguiente macro itera a través de cada valor encontrado y guarda


la dirección de la celda en una variable, luego el msgbox muestra la
variable.
Sub Macro3()
With Range("B3:B8")
    If .Find(Range("D3")) Is Nothing Then
        MsgBox "Value not found"
    Else
        Set a = .Find(Range("D3"))
        Set b = a
        c = a.Address
        Do While Not .FindNext(b) Is Nothing And a.Address <>
.FindNext(b).Address
            c = c & vbNewLine & .FindNext(b).Address
            Set b = .FindNext(b)
        Loop
    End If
End With
MsgBox c
End Sub

Ejemplo 3 - Devolver valor adyacente

La imagen de arriba muestra la macro a continuación, guarda los


valores adyacentes a cada valor encontrado en el rango de celdas
B3: B8 usando el valor de búsqueda en la celda E3 en una variable.
El msgbox luego muestra el contenido de la variable.
Sub Macro4()
With Range("B3:B8")
    If .Find(Range("E3")) Is Nothing Then
        MsgBox "Value not found"
    Else
        Set a = .Find(Range("E3"))
        Set b = a
        c = a.Offset(, 1).Value
        Do While Not .FindNext(b) Is Nothing And a.Address <>
.FindNext(b).Address
            c = c & vbNewLine & .FindNext(b).Offset(, 1).Value
            Set b = .FindNext(b)
        Loop
    End If
End With
MsgBox c
End Sub

https://www.get-digital-help.com/es/C%C3%B3mo-utilizar-el-m%C3%A9todo-de-b
%C3%BAsqueda-de-rango./