Ejemplos de Usos de VB en Excel
Ejemplos de Usos de VB en Excel
Ejemplos de Usos de VB en Excel
html
Utilizando la siguiente codificación para cada tipo de fuente, cambiando solo el .Name="Agregar el
tipo de fuente que deseemos":
Sub ARIAL()
' ARIAL Macro
Range("I9:L14").Select
With Selection.Font
.Name = "Arial"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.COLOR = -10477568
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
End Sub
2 Examinemos en este artículo las diversas formas en que se puede proceder a seleccionar un rango
de celdas.
– Celda.MergeArea
La primera identifica si existen celdas combinadas en la hoja activada. La segunda, identifica el
rango al que pertenece la celda combinada y arroja la información de los rangos. En caso la celda
seleccionada no pertenezca a un conjunto de celdas combinadas el valor que arroja es la celda
especifica.
Ejemplo:
En el siguiente ejemplo se tiene una hoja de Excel con algunos conjuntos de celdas combinadas,
según la programación mostrada se busca identificar las celdas que forman parte de algún conjunto
de celdas combinadas y mostrar sus respectivas ubicaciones (columna, fila). Adicionalmente se
muestra un cuadro de texto con los rangos de los diferentes conjuntos de celdas combinadas.
Sub EncontrarCeldasCombinadas()
For Each celda In ActiveSheet.UsedRange
If celda.MergeCells = True Then
mensaje = mensaje & celda.MergeArea.Address & Chr(10)
mensaje2 = mensaje2 & celda.Address & Chr(10)
End If
Next
MsgBox mensaje2
MsgBox mensaje
End Sub
4 Intercalar filas en blanco con Macros o VBA
El Excel no dispone de una manera fácil para realizar la función de intercalar filas en un
rango Sin embargo; existe una solución el cual consiste en realizar una macro que simplifique esta
función o lo ejecute por nosotros. En el caso de VBA Excel Avanzado Macros aplicado a
Intercalar filas alternas en un rango para realizar esta función necesitamos hacer un recorrido por
las filas del rango en sentido contrario al usual lo que significa empezaremos de abajo a arriba de
la última fila a la primera, para ello usaremos el método Insert. Este orden nos asegurara al que
que cuando insertemos nuevas filas no afecte a los siguientes insertados, lo que si pasaría cuando
empezamos de las filas superiores a las inferiores y Dentro del Explorador de proyectos del Editor
de VBA, insertaremos en un Módulo el siguiente código de nuestra macro de Excel ejecutando la
siguiente macro:
Sub intercalado()
Set Rng = Range("A1:A10")
'controlamos la primera y última fila
'donde se encuentra el rango a intercalar
rng1 = Rng.Item(1).Row
rng10 = Rng.Item(Rng.Count).Row
'inhabilitamos la actualización o refresco de pantalla
Application.ScreenUpdating = False
'recorremos en orden inverso las filas del rango
For i = rng10 To rng1 + 1 Step -1
'insertando filas y desplazándolas hacia abajo
'como pretendíamos
Rng.Item(i).Insert Shift:=xlDown
Next i
'reactivamos el refresco de pantalla
Application.ScreenUpdating = True
End Sub
Sub Cambiarcolor()
Range("A1:A6").Interior.Color = RGB(500, 10, 27)
End Sub
6 Combinar dos columnas
Sub unir ()
Dim fila As String
Dim txt As Integer
fila =1
Do Until IsEmpty(Cells(fila,1))
Cells(fila,1) = Cells(fila,1) & “-” & Cells(fila,2)
Cells(fila,2).ClearContents
Range(Cells(fila,1), Cells(fila,2)).Merge
fila = fila + 1
Loop
Columns(1).AutoFit
End Sub
7 CATALOGO DE IMAGENES
Muchas veces cuando trabajamos en Excel se desea agregar palabras al final o al comienzo de
un texto en una celda. Sin embargo, hacerlo de forma manual tomaría mucho tiempo especialmente
si el rango de celdas a los cuales se les desea realizar esa modificación es muy grande. Por ello, en
esta oportunidad desarrollaremos un macros usando fundamentalmente la estructura For each para
realizar dicha acción.
Lo primero que haremos es crear un botón para que al apretarlo podamos acceder a un
formulario que permita agregar texto a una celda numérica.
'Paso2: Lo que hacemos aquí es agregar la opción de poder guardar la base de datos original
antes de modificarla
Select Case MsgBox("¿Desea usted guardar la base de datos antes de modificarla?",
vbYesNoCancel)
Case Is = vbYes
ThisWorkbook.Save
Case Is = vbCancel
Exit Sub
End Select
'Paso 3: Definimos el rango objetivo
Set MyRange = Range(TextBox1)
'Paso 4: Empieza el comando en el rango.
For Each MyCell In MyRange
'Paso 5: Aseguramos que la celda no este vacía
If Not IsEmpty(MyCell) Then
MyCell = TextBox2.Text & " " & MyCell
End If
'Paso 6: Pasar a la siguiente celda del rango
Next MyCell
End If
End Sub
Ejemplo:
En el siguiente caso tenemos una hoja con nombres y edades. Si queremos añadir edades a los
nombres ponemos el rango B2:B7, que este antes del número y como palabra años. Si deseamos
podemos guardar la base que tenemos antes que sea modificada o no . A continuación se agrega el
archivo que contiene todo el macros para que pueda ser revisado.
VER ARCHIVO
En el paso 2, lo que se hace es seleccionar el rango que se encuentre filtrado (en este caso se
ha filtrado las exportaciones hacia Bélgica, "Belgium" en el archivo). Entonces, las filas filtradas se
copian y se abre un nuevo libro de excel.
En el paso 3, en el nuevo libro se ajusta el tamaño de las columnas que se han pegado
En el paso 4, lo que se hace simplemente es eliminar las hojas 2 y 3 que aparecen por default
cuando se abre un nuevo libro, de tal manera que el libro generado para pegar la información
filtrada solo cuente con una hoja (aquella con la información que habíamos filtrado).
En varias ocasiones, al elaborar un libro de Excel, se necesita crear varias hojas para poder
manejar distintos contenidos. Esta macro, ayuda a organizarlas pues permite crearlas a partir de una
lista que contiene los nombres de las hojas de cálculo que se desea generar. Esta macro es
interesante pues se pueden crear varias hojas, con los nombres de los 24 departamentos por
ejemplo, con tan sólo ejecutar esta macro y seleccionar el rango.
De esta manera, se generan las hojas de cálculo con los nombres de la lista.
14 Ocultar todas las hojas excepto la activa y mostrar todas las hojas que estén ocultas:
Estas son dos macros que se complementan y permiten un trabajo efectivo en las hojas de Excel.Durante el
trabajo de bases de datos resulta sumamente útil ocultar algunas hojas del libro de Excel de manera que el movimiento a
lo largo del trabajo resulta más ligero. La primera de ellas, permite ocultar todas las hojas excepto aquella en la que se
está trabajando, para lo cual se usa el comando de visibilidad de hoja (Sheet.Visible ).
Sub Ocultarhojasmenoslaactiva()
For Each Sheet In ActiveWorkbook.Sheets
If Sheet.Name <> ActiveSheet.Name Then
Sheet.Visible = False
End If
Next Sheet
End Sub
Por su parte, la segunda macro permite volver a mostrar las hojas que en algún momento se ocultaron:
Sub macro_mostrar()
Dim numero As Byte
Dim i As Byte
numero = Sheets.Count
For i = 1 To numero
Sheets(i).Visible = True
Next
End Sub
15 Crear un archivo por cada hoja de Excel
Esta macro es sumamente útil cuando los datos se encuentran en un mismo archivo, pero
necesitan ser distribuidos a diferentes áreas o personas, a las cuales solo se les debe dar una porción
de la información que se tiene en el archivo. Para ello, se necesita crear un archivo Excel por cada
hoja que se tiene, y en aquel archivo debe encontrarse toda la información que se encuentra en esa
hoja. Cabe mencionar que estos archivos se guardarán en la misma ruta en la que se encuentra el
archivo original.
A continuación vamos a revisar algunos ejemplos sobre como hacer referencia a rangos
usando Range
Sub ejemplo01()
' Escribir una misma palabra en todo el rango
Worksheets("Hoja2").Range("B15:E33") = "Hola"
' Ahora escriberemos otro texto solo en 2 celdas
Worksheets("Hoja2").Range("D5,G7") = "Excel"
Worksheets("Hoja2").Range("J1,H2,B8") = "Avanzado"
Range("A1").Offset(2, 2) = "Referencia"
End Sub
Como se puede ver el codigo Offset en VBA se basa en la celda, para a partir de esa referencia
emplear otra celda, para conocer mas detalles del offset se puede revisar: Utilidad del Offset
En el siguiente ejemplo observaremos como por medio de una variable (en este caso la
variable se llama "Mirango") se puede hacer referencia a un rango de celdas, y realizar diversas
operaciones sobre el conjunto de celdas.
Sub ejemplo02()
Dim Mirango As Range
Set Mirango = Worksheets("Hoja1").Range("B55:E59")
Mirango.Formula = "Area"
Mirango.Font.Bold = True
End Sub
18 Ejemplo de uso de select case aplicado a una planificacion de la produccion
La función Select Case
Nos permite darle la instrucción al programa que se utilizaran varias condiciones a la vez, a
diferencia de otras funciones que solo permiten el uso de dos condiciones, el programa lo que hace
es encontrar la coincidencia para cada caso y a partir de ahí ejecuta todo el grupo de instrucciones
asociadas a ese caso.
Ejemplo aplicado a un entorno de producción
Dentro de los entornos de producción el planificador debe de trabajar con una serie de
variables para definir el plan de producción del mes, dentro de estas variables tenemos: el histórico
de ventas, políticas de stocks, capacidades, entre otros.
Cada una de estas variables puede comportarse de manera diferente para cada rango de
valores, por ejemplo dentro de la política de ventas si la venta del mes anterior es menor a 100 kilos
se podría definir que no es necesario estimar un pronóstico de ventas sino que más bien es
conveniente la fabricación bajo pedido, para el resto de casos es conveniente la estimación de las
ventas. Por otro lado el caso podría complicarse si para cada rango de valores uno tiene un método
de estimación diferente, de manera que la función select case encaja perfectamente con el problema
propuesto.
EL sistema desarrollado en el archivo adjunto nos solicita el ingreso de cuatro variables y
finalmente nos indicara la cantidad a fabricar y los comentarios relevantes para cada caso.
Ejemplos:
Con esta función igualmente podemos poner valores a la celda activa seleccionada. Por ejemplo, la
siguiente macros:
Sub utilidad_del_offset()
Dim TITULO As Range
Set TITULO = Range("A1")
TITULO.Offset(1, 0).Value = "Utilidad del Offset"
End Sub
Los resultados serán que el título "Utilidad del Offset" será colocado 1 fila debajo de la celda A1:
Otra utilidad es para irse a la primera fila en blanco al final de una tabla completa de datos. La
sentencia sería (considerando que estamos dentro de la tabla):
Sub fin_inferior_de_la_tabla()
ActiveCell.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
End Sub
Sub fin_der_de_la_tabla()
Selection.End(xlToRight).Select
Selection.Offset(0,1).Select
End Sub
He seleccionado algunas celdas de la columna B (rango variable) y quiero pegar un dato en las
mismas filas pero de la columna D, sé que es sencillo pero no logro ajustar el código para que
funcione.”
ActiveCell.Offset(0,2).Value=Tu valor
Range
El objeto Range se refiere a una celda específica , una celda activa, un conjunto de celdas
(separadas o juntas), o una fila entera o una columna.
Es decir, podemos aplicarla para seleccionar, dichas celdas, o bien para darles algún valor, o
aplicarles alguna fórmula.
Primero observemos las formas de poder seleccionarlas :
Range("A1").select 'selecciona la celda A1 en la hoja activa. Esto es porque no
especificamos el "Worksheets"
Range("A1: B10").select 'selecciona todo el rango desde A1 hasta B10 en la hoja activa.
Worksheets(3).Range("A1").select 'selecciona la celda A1 en la hoja 3
Range("A1,A3,C5").select 'selecciona celdas separadas en la hoja activa.
Range("Ingresos").select ' selecciona la celda o conjunto de celdas que tengan como
nombre "ingresos" en la hoja activa
Otra forma de referirse a específicas celdas en un rango de celdas es definir el rango de celda como
una variable, y después seleccionar ciertas celdas dentro de dicho rango
Por ejemplo :
Dim mirango as range
Set mirango = Range("B1:B11")
mirango.range("A1").select
mirango.range("B1").select ' Es importante saber que al seleccionar una celda dentro del
rango B1 : B11, la nominación A1 corresponde a la celda que se ubica en la esquina superior
izquierda, en este caso B1, y a partir de esa celda se ubican las demás.
Ahora veamos como darle valor a un rango:
Si se quiere que aparezca un valor como un número simplemente se hace lo siguiente :
Range("A1") = 35 'Hace que el número 35 aparezca en el la celda A1, en la hoja activa
Worksheets(3).Range("A1:B10").value = 1 'Hace que el valor de todas las celdas del rango
sean 1, en la hoja 3.
Una importante propiedad es OFFSET. Esta propiedad define a la celda activa con el valor de (0,0)
y al desplazarse una cada fila o columna se tiene que adicionar 1 o restar -1 a la posición inicial. El
primer carácter se refiere a las filas y el segundo a las columnas.
Por ejemplo :
Activecell.offset(1,0) = 35 'Si la posición inicial era la celda D5, entonces, esta propiedad
asigna el valor de 35 a la celda D6, ya que se desplaza una fila hacia abajo
Entonces, se puede observar que el objeto range, es muy útil para asignar valores y seleccionar
celdas, grupo de celdas, filas o columnas, ya sea en una hoja específica o en la hoja actual.
Realizar una acción en un rango de celdas
En esta ocasión, les daré un ejemplo de cómo aplicar un formato condicional con macros en el
programa Visual Basic, eligiendo un rango y poniéndole una condición y verificar si las celdas
dentro de ese rango cumplen con esta.
En este ejemplo se identifica que notas cumplen con la condición de ser aprobatorias y cuales no y
dependiendo de esto se les aplica un formato: fondo y letra de color rojo para los desaprobados y
azul para los aprobados.
A continuación explicare a más detalle la macro:
El primer paso es definir las variables:
La primera variable se refiere a todo el rango que el usuario elige donde están ubicadas las notas, a
diferencia del segundo, que se refiere a cada una de las celdas, es decir a la celda activa.
En esta ocasión, decidí poner un UserForm para que el usuario decidiera en que rango se aplicara la
macro.
Después, se crea la variable “contador” que se utilizara después para contar cuantas personas
desaprobadas hay.
Nos ayudamos con las funciones FOR e IF de la siguiente manera:
La función FOR como se puede ver sirve en este caso para analizar cada celda y ver si cumple con
la condición dada. En este caso, verificara si cada celda cumple con ser menor que 10.5 y si es asi,
colorea el fondo de color rojo, de otra forma, se coloreara de color azul. Y asi sucesivamente con
cada celda del rango dado. Además, en caso de cumplirse la condición, va contándolo para al final
saber cuántos desaprobados hay.
También incluí un MSGBOX para que diga cuantas personas están desaprobadas y también cual es la
nota promedio.
Ejemplo archivo 9
Ejemplo Práctico:
1ro – En la siguiente compañía, se busca asignar las bonificaciones correspondientes de Fiestas
Patrias
a sus trabajadores. La bonificación es distinta entre labores, pero la misma dentro de las áreas.
Es decir, todos los trabajadores en ventas (la misma área) reciben la misma bonificación.
2do – A continuación, se procede a digitar la Macros correspondiente, es decir, la mencionada
"Asignación_de_bonos".
La Macros sigue la estructura siguiente:
Sub Asignación_de_bonos()
ult01 = Cells(Rows.Count, 1).End(xlUp).Row
For j = 1 To ult01
rubro = Cells(j, 2)
If rubro = "ventas" Then
Cells(j, 3) = Cells(2, 8)
Cells(j, 4) = "Bonificación mayor de Fiestas Patrias"
End If
If rubro = "caja" Then
Cells(j, 3) = Cells(3, 8)
End If
If rubro = "logistica" Then
Cells(j, 3) = Cells(3, 8)
End If
If rubro = "contabilidad" Then
Cells(j, 3) = Cells(4, 8)
End If
Next
End Sub
3ra – Una vez introducida la Macros, al aplicarla obtenemos una adecuada asignación de las
bonificaciones que otorga
la compañia, teniendo ahora una tabla de bonificaciones que distribuye a cada empleado su cuota
correspondiente.
Conclusión:
Así se consigue asignar la bonificación correspondiente a cada empleado según su rubro o
especialización.
Luego, solicita las notas para cada rubro (Cada InputBox solicita el dato de una sola nota y en el
título del recuadro aparece el número correspondiente al alumno), por ejemplo:
FIG2
Se obtiene como respuesta el promedio que obtuvo cada
alumno y además señala qué alumnos obtendrán el
certificado debido a que consiguieron una nota aprobatoria.
Por otro lado, brinda información acerca del promedio de
toda la clase y el número de alumnos desaprobados en el
curso.
Aquí se puede apreciar las notas para 5 alumnos del curso, con los cálculos respectivos utilizando la
estructura de control For… Next desarrollada previamente.
FIG4
(Para mayor visualización de la imagen, hacer click en la misma)
Para poder ejecutarlo, se ha colocado un botón “Calcular promedio”
que al darle click comienza a solicitar la información.
FIG5
Asimismo, se ha colocado un botón “Limpiar celdas” para poder
utilizar el archivo en otra oportunidad.
Range("D10").Select
Selection.Resize(10, 4).Select
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
'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
'Seleccionar desde la celda E2 hasta la última celda con datos hacia la izquierda, similar a ctrl + shift + flecha
hacia la izquierda Range("E2", Range("E2").End(xlToLeft)).Select
'Otra forma de seleccionar
'Seleccionar la última celda con datos hacia abajo, similar a ctrl + flecha hacia abajo
Range("E2").End(xlDown).Select
'Seleccionar la última celda con datos hacia la derecha, similar a ctrl + flecha
hacia la derecha Range("E2").End(xlToRight).Select
'Seleccionar la última celda con datos hacia la izquierda, similar a ctrl + flecha hacia la izquierda
Range("E2").End(xlToLeft).Select
'Seleccionar desde la celda E1048576 la primer celda con datos hacia arriba, similar a ctrl + flecha hacia arriba
Range("E1048576").End(xlUp).Select
'Hacer referencia a la ultima celda sin datos
ActiveSheet.Range("a1").End(xlDown).Offset(1, 0).Select
'Crear un objeto con las celdas visibles solamente copiarlo y pegarlo en otra hoja Set RG =
Sheets("ARTI").Range("C21",
Sheets("ARTI").Range("C21").End(xlDown)).SpecialCells(xlCellTypeVisible)
RG.CurrentRegion.Copy Sheets("BY879VbDAYRA10iBTOMYIUYT").Range("a1").PasteSpecial
Referencia Significado
Range(“A1”) Celda A1
Range(“A1:B5”) Celdas de la A1 a la B5
Range(“C5:D9,G9:H16”) Selección de varias áreas
Range(“A:A”) Columna A
Range(“1:1”) Fila uno
Range(“A:C”) Columnas de la A a la C
Range(“1:5”) Filas de la uno a la cinco
Range(“1:1,3:3,8:8”) Filas uno, tres y ocho
Range(“A:A,C:C,F:F”) Columnas A, C y F
De todas las propiedades descritas tal vez una de las más usadas sea Offset, que nos permite
seleccionar celdas contiguas a la celda activa según una determinada posición de filas y columnas:
expresión.Offset(RowOffset, RowOffset)
Sub ejemplo()
‘ejemplos del empleo de range y cells
‘escribo Hola en varias celdas de la hoja 2
Worksheets(“Hoja2”).Range(“A1:B5”) = “Hola”
‘lo mismo pero en celdas discontinuas
Worksheets(1).Range(“F1”, “G5”) = “Hi”
‘ahora en la hoja 2
Worksheets(“Hoja2”).Range(“J1, K3, H5”) = “AAA”
ActiveCell.Offset(2, 2) = “Me desplazo”
End Sub
Si establece una variable de objeto para un objeto Range, puede manipular fácilmente el rango
utilizando el nombre de la variable.
El siguiente procedimiento crea la variable de objeto miRango y, a continuación, asigna la variable
al rango A1:D5 de la Hoja1 del libro activo. Las instrucciones posteriores modifican las
propiedades del rango, sustituyendo el nombre de la variable por el objeto del rango.
Sub Aleatorio()
Dim miRango As Range
Set miRango = Worksheets(“Hoja1”).Range(“A1:D5”)
miRango.Formula = “=ALEATORIO()”
miRango.Font.Bold = True
End Sub
Utilice la función Array para identificar un grupo de hojas. El siguiente ejemplo selecciona tres
hojas del libro activo.
Sub Varias()
Worksheets(Array(“Hoja1”, “Hoja2”, “Hoja4”)).Select
End Sub
Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras. Estas propiedades
devuelven un objeto Range que representa un rango de celdas. En el siguiente ejemplo, Rows(1)
devuelve la fila uno de la Hoja1. A continuación, la propiedad Bold del objeto Font del rango se
establece en True.
Sub FilaNegrita()
Worksheets(“Hoja1”).Rows(1).Font.Bold = True
End Sub
La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y
Columns.
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de cálculo
Columns(1) Columna uno
Columns(“A”) Columna uno
Columns Todas las columnas de la hoja de cálculo
Excel protegidos por password
https://www.rankia.com/blog/comstar/1021298-trucos-tretas-excel-vba-para-programadores
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.
Si quieres generar un correo y pegarle un archivo adjunto, puedes usar el siguiente código:
Dim oLook As Object
Dim oMail As Object
Este código buscará el archivo MiArchivo.xlsx ubicado en C:\, construirá el mensaje y lo enviará a
la dirección [email protected]. 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.
Esta instrucción mostrará el título del cuadro de diálogo como “Mensaje especial” y ya no se
mostrará el nombre de la aplicación. Observa el resultado:
ARGUMENTO BUTTONS