You are on page 1of 30

1.

- DETERMINAR CON VBA SI UN ARCHIVO SE ENCUENTRA ABIERTO


Me parece muy til y as uno no podr perder algn trabajo que se est realizando, cuando
vuelves a abrir el archivo, lo he comprobado y si funciona aqu dejo el ejemplo.

Function abierto_cerrado(targetworkbook As String) As Boolean


' Esta macro permite si un libro ya esta abierto para que no cierre y se actualiza
Dim libro_prueba As Workbook
On Error Resume Next
Set libro_prueba = Workbooks(targetworkbook)
If Err.Number = 0 Then
prueba_abierta_cerrado = True
Else
prueba_abierta_cerrado = False
End If
End Function
Sub Archivo()
Dim targetworkbook As String
If prueba_abierta_cerrado(targetworkbook) = True Then
MsgBox nomb_archivo & " abierto"
Else
MsgBox nomb_archivo & " cerrado"
End If
End Sub

2.- ORDENAR DATOS CON MACROS VBA EXCEL


Sub Desactivar_Filtro()
'DESACTIVA LOS FILTROS
Range("A1:D1").Select
If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter
If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
End Sub
-----------------------------------------------------------------------------------------------Sub Ordenar_Datos_Ascendente()
'ORDENA DE A Z
Range("C1").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlYes
End Sub
---------------------------------------------------------------------------------------------------------Sub Ordenar_Datos_Desecendente()
'ORDENA DE Z A
Range("C1").Sort Key1:=Range("C1"), Order1:=xlDescending, Header:=xlYes
End Sub
-------------------------------------------------------------------------------------------------------------Sub Ordenar_tres_campos()
'ORDENA TRES CAMPOS DIFERENTES
Range("A2").Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2"),
Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:=xlYes
End Sub

3.- CAMBIAR LOS COLORES DE FONDO CON VBA


Es aplicable para cualquier trabajo que se realiza, por lo prctico, por lo til que es para
cualquier persona
Pasos para cambiar los colores de fondo de las celdas con VBA
Podemos citar dos formas frecuentes en las que se puede realizar este cambio de color.
Debe utilizar la propiedad Interior de la celda y, a continuacin:
Puede usar ColorIndex (para utilizar uno de los 56 colores preestablecidos de Excel): De
esta forma se cambiara el color de la celda activa.
Sub Cambiar_Color_de_Fondo()
ActiveCell.Interior.ColorIndex = 26
End Sub
De esta forma se cambiara el color de la celda activa.
Podemos cambiar de color a todo un rango de celdas.O bien, puede utilizar Color:
De esta forma le podemos cambiar de color a todo un rango de celdas.
Sub Cambiar_color_de_un_Rango()
Range("A1:A6").Interior.Color = RGB(55, 120, 27)
End Sub

4.- IDENTIFICAR LA LTIMA FILA EN USO CON VBA


Me pare muy importante esta macro nos ayuda a ubicar la ltima fila que tiene contenido,
muy prctico, se adapta a mi trabajo.

Sub Buscar_Ultima_Fila()

'CUENTA CUANTAS FILAS ESTAN EN USO


Dim ult As Integer
ult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox ult

End Sub

Sub Buscar_Ultima_Fila_2()
'SE SELECCIONA LA ULTIMA FILA
Dim n As Long
countult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox countult
Cells(Rows.Count, 1).End(xlUp).Select

End Sub

Sub Buscar_Ultima_Fila_3()

'SELECCIONA DE LA ULTIMA FILA LA VACIA


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

DIFERENCIA ENTRE RANGE Y CELLS

Los objetos range y cells en la mayora de casos pueden ser utilizados sin distincin
alguna, sin embargo hay casos puntuales donde se recomienda el uso de uno de los dos.
USO COMN
Para seleccionar una celda
Ejemplo:
Si se quiere seleccionar la celda C2, se tiene dos opciones.
Range(C2).select o Cells(2,3).select
* cells(i,j) , donde i=fila i ;
j=columna j.
Para dar valor a una celda
Ejemplo:
-Si se desea darle valor a la celda C2 =620, se tiene dos opciones
Range(C2).value=620 o Cells(2,3).value=620
PARTICULARIDADES
Objeto Range
Permite seleccionar mas de una celda.
Ejemplo:
range(A1:B5).select
*El objeto cells , no permite seleccionar mas de una celda.
Objeto Cells
Es compatible con seleccin de celdas bajo un patrn de formula. La ventaja del uso del
objeto cells, es permitir vincular funciones numricas al uso de las celdas y/o a su
seleccin.
Ejemplo:
Se desea conocer la suma que de la combinacin de una fila y columna, entonces se
establece el siguiente programa:
Sub celdasuma()
For i = 1 To 10 For j = 1 To 10
Cells(i, j).Value = i + j
Next i
Next j
End Sub

COMPACIN ENTRE RANGE Y CELLS

Existe un par de maneras para acceder las celdas de nuestras hojas utilizando VBA.
Podemos utilizar el objeto Range y tambin podemos utilizar el objeto Cells.
El objeto Cells tiene como primer argumento el nmero de fila y como segundo argumento
el nmero 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 ms conveniente es utilizar el objeto Range de la


siguiente manera:

Range(A1:D5).Select

Establecer valor a las celdas con los 2 objetos sealados, 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 programtico por varias celdas ya que ser muy sencillo especificar las filas y
columnas utilizando una variable numrica.
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

DIFERENCIAS Y EJEMPLOS ENTRE RANGE(A1).TEXT Y RANGE(A1).


VALUE
Una de las preguntas que frecuentemente nos podemos realizar es cul es la diferencia
que existe entre las propiedades Text y Value del objeto Range.
La funcin value se utiliza para asignar o escribir o tomar el valor de un objeto ya sea una
celda, un botn comandbutton, etc.
Si se desea asignar un valor a la Celda 5 del libro abierto se coloca siguiente:
ActiveSheet.range(A5).value=La Casa Verde 5
La funcin text toma el valor de un objeto pero que est reflejado directamente
en la pantalla.

ActiveSheet.Range[A1].Text = La Casa Verde

A continuacin un ejemplo que permitir entender la diferencia entre ambos:


Range(C1).Value = 0.49999999
Range(C1).NumberFormat = 0.00
Debug.Print The Value property is: & Range(C1).Value
Debug.Print The Text property is: & Range(C1).Text
En este caso se ve que Text de un Range mostrar el valor que est reflejado en la
pantalla o en los reportes, mientras que Value retornar el valor real de la celda, ser lo
que el Excel almacena para sus frmulas y clcuos.. La respuesta inmediata ser:
The Value property is: 0.49999999
The Text property is: 0.50
EJEMPLO DE WITH-END WITH APLICADO A FORMATO DE CELDAS
La Funcin With End With permite realizar mltiples acciones en un mismo objeto. En
este ejemplo, se ha utilizado la funcin para darle un formato determinado a una celda:
letra Arial Narrow, tamao: 20, estilo de fuente: italic y subrayado. Para esto se usa
With Selection.Font y luego las instrucciones sobre el estilo de fuente:
With Selection.Font
.Name = Arial Narrow
.Size = 20
.Italic = True
.Underline = True
End With
La utilidad de esta funcin es que el cdigo es menos extenso, ya que no se tiene que
repetir innecesariamente la funcin selection en cada instruccin, como se
muestra a continuacin:
Sub Promedio()
Selection.Font.Name = Arial Narrow
Selection.Font.Size = 20
Selection.Font.Italic = True
Selection.Font.Underline= True
End Sub

EJEMPLO DE USO DE WITH- END WITH APLICADO A DAR FORMATO A REPORTES


El uso de With- end With para aplicar diversos formatos a los reportes de una manera
mucho ms rpida.
Sintaxis:Ejemplo:
Sub formato()
With Selection.Font
.Name = Calibri
.Size = 16
.Color = -16777024
Cells.Select
Cells.EntireColumn.AutoFit
End With
End Sub
Descripcin
Este proceso aplica un determinado formato a las celdas que sean previamente
seleccionadas por el usuario, esto puede ser empleado cuando es necesario generar
reportes diarios o en periodos muy cortos donde la aplicacin manual repetitiva de un
determinado formato de texto o celdas genera un tiempo de proceso demasiado alto.
A continuacin se muestra la pantalla de datos iniciales:

Luego de ejecutar la macro:

ALGUNOS TRUCOS PARA OPTIMIZAR MACROS EN EXCEL

Al trabajar con macros sencillas (generalmente de pocas lneas), su ejecucin no es


complicada, por lo que puede trabajarse simplemente grabando una macro desde Excel, o
creando la macro directamente en Visual Basic, detallando paso a paso lo que har la
macro. Al hacer esto, el cdigo que se genera es bastante detallado y en algunos casos,
contiene ms lneas de las que realmente son necesarias para hacer que la macro realice
aquello que se desea.
Sin embargo, cuando la macro es ms complicada, es til conocer ciertos trucos que
podran reducir las lneas en la macro, permitiendo que su ejecucin y revisin sea ms
rpida.

1) DESHABILITAR EL CLCULO AUTOMTICO

Cuando se tienen muchas celdas con frmulas, cada vez que se realiza un cambio en los
valores de una hoja, Excel recalcula los valores de todas las frmulas. Para evitar esto, se
puede insertar un cdigo, que hace que los clculos se realicen al final de la ejecucin de
la macro, acelerando la misma.
Al inicio de la macro, luego del Sub NombreMacro se coloca el siguiente cdigo:
Application.Calculation = xlCalculationManual
Y al final de la macro antes del End Sub, colocamos:
Application.Calculation = xlCalculationAutomatic
Application.Calculate

2) NO AGREGAR LA SELECCIN DE LA CELDA COMO UN PASO MS, DE NO


SER NECESARIO.

Se podra trabajar de la siguiente manera:


Range (A1).Select
ActiveCell.FormulaR1C1 = Hola
Range(A1).Select
Selection.Font.Bold = True
O reducir la cantidad de lneas, trabajando as:
Range(A1).Value = Hola
Range(A1).Font Bold = True

3) UTILIZAR WITH END WITH PARA NO HACER REFERENCIA AL MISMO


OBJETO O COMANDO VARIAS VECES.

Esto:
Sheets(Hoja1).Range(A1).Font.Bold = True
Sheets(Hoja1).Range(A1).Font.Color = RGB(125,125,80)
Sheets(Hoja1).Range(A1).Font.Underline= True
Puede ser reemplazado por esto:
With Sheets(Hoja1).Range(A1).Font
.Bold = True
.Color = RGB(125, 125, 80)
.Underline = True
End With
4) NO UTILIZAR PALABRAS RESERVADAS: PARA ESTO, LO MS CONVENIENTE ES
NO UTILIZAR PALABRAS EN INGLS, as no se corre el riesgo de estar utilizando una
palabra reservada.
5) DECLARAR LAS VARIABLES
Si bien podemos declarar todas las variables como Variant, esto produce una mayor
demora al ejecutar la macro. Es preferible declarar la variable segn corresponda (si es
fecha, usar Date, si es texto, usar String).
6) COMENTAR DE MANERA ADECUADA LAS MACROS
De esta forma se podr recordar con claridad que hace cada macro y se podr contar con
los comentarios que facilitarn la utilizacin de la macro por terceras personas, que
podran no estar tan familiarizadas con su sintaxis.
7) SI SE DESEA QUE LA MACRO EJECUTE UNA GRAN CANTIDAD DE TAREAS
Es preferible crear varias macros ms pequeas y luego mediante una nueva macro,
llamarlas para unir todos los procesos. Esto puede ser til incluso, si en algn momento se
desea omitir alguno de los procesos, no es necesario crear una macro enteramente nueva,
sino que basta con no llamar a la macro que se desea omitir.
Por ejemplo:
Sub BorrarDatos()
cdigo
End Sub
Sub InsertarData()
cdigo
End Sub
Sub DarFormato()
cdigo
End Sub
Sub ProcesoCompleto()
BorrarDatos
InsertarData
DarFormato
End Sub
En caso se desee un proceso que solo borre datos e inserte data, pero sin dar formato,
bastar con omitir la ltima lnea de la macro ProcesoCompleto.

TABLA DINMICA PARA CUANTIFICAR EL SALDO DE CLIENTES POR


CRITERIO
Mediante esta tabla podemos ver la cantidad total de dinero que disponen los clientes a la
vez que podemos distinguirlos por gnero, distrito , y estado civil .Es una herramienta muy
efectiva para darte cuenta hasta donde estn dispuestos a gastar las personas y a la vez
de distinguir y agrupar a que sector son los que mas esta dirigido tu servicio o producto
,es decir gracias a que distinguimos el monto con respecto a distrito gnero y estado civil ,
podemos saber quien o quienes son los que mas gastan con respecto a los grupos ya
nombrados anteriormente .
Para la creacin de esta macro , lo que se a hizo primero es adquirir una base de datos en
la cual trabajaremos a continuacin , luego de esto se codifica la hoja donde se va a poner
la tabla dinmica , a su vez la plantilla y el contenido que queremos que la tabla nos
muestre . Esto nos va a permtiir reducir tiempos a la hora de hacer una tabla dinamica sin
necesidad de crearla una y otra vez .
Si bien la tabla dinamica es muy facil de crear ,esta duplica la facilidad por lo que es una
herramienta a considerar .
Sub CrearTabla()
Dim WSD1 As Worksheet
Dim WSD2 As Worksheet
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim PRange As Range
Dim FinalRow As Long
'Se define la hoja de trabajo
Set WSD1 = Worksheets("Hoja3")
'Borrar las tablas dinamicas que se encuentran en la hoja
For Each PT In WSD1.PivotTables
PT.TableRange2.Clear
Next PT
'Definir el rea de entrada y establecer un cach dinamico
Set WSD2 = Worksheets("CLIENTES")
FinalRow = WSD2.Cells(65536, 1).End(xlUp).Row
Set PRange = WSD2.Cells(1, 1).Resize(FinalRow, 13)
'Nos situamos en la hoja con los datos
Sheets("CLIENTES").Select
Set
PTCache
=
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase,
SourceData:=PRange.Address)
'Se crea una tabla dinamica en blanco, especiificando la ubicacin de salida y nombre de
la tabla
Set PT = PTCache.CreatePivotTable(TableDestination:=Worksheets("Hoja3").Range("B3"),
TableName:="PivotTable3")
PT.Format xlReport6
'Actualizacion automatica
PT.ManualUpdate = True
PT.AddFields
RowFields:=Array("DISTRITO"),
PageFields:=Array("SEXO", "CIVIL")

ColumnFields:=Array("HIJOS"),

'Establecer los campos de datos


With PT.PivotFields("SALDO")
.Orientation = xlDataField
.Function = xlSum
.Position = 1
.NumberFormat = "#,##0"
.Name = "Cantidad Fisica"
End With
'Calcular la tabla dinamica
PT.ManualUpdate = False
'PT.ManualUpdate = True
Sheets("Hoja3").Select
End Sub

Private Sub CommandButton1_Click()


Sheets("Formulario").Select
t = Cells(Rows.Count, 1).End(xlUp).Row
Cells(t + 1, 1) = TextBox1.Text
Cells(t + 1, 2) = TextBox2.Text
Cells(t + 1, 3) = TextBox3.Text
Cells(t + 1, 4) = TextBox4.Text
Cells(t + 1, 5) = TextBox5.Text
Cells(t + 1, 6) = TextBox6.Text
Cells(t + 1, 7) = TextBox7.Text
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox7.Text = " "
End Sub
FORMULARIO DE EXCEL AVANZADO PARA EL REGISTRO DE DATOS RELEVANTES
PARA PROYECTOS
Este formulario consiste en la creacin de una interfaz que me permita registrar los datos
relevantes y ms significativos de un proyecto, el cual contiene los siguientes campos:
El formulario permitir actualizar la base cada vez que se desee, con el objeto de usar slo
una base de datos. El registro de datos relevantes permiten evaluar dichos datos
ingresados para mejorar la gestin interna de cada proyecto y establecer cuales son los

proyectos estratgicos evaluando los montos y los precios unitarios que sern registrados
en la base de datos.

Private Sub CommandButton1_Click()


If TextBox1.Text <> "" And TextBox3.Text <> "" And TextBox4.Text <> ""
TextBox5.Text <> "" And TextBox6.Text <> "" And TextBox7.Text <> ""
TextBox8.Text <> "" And TextBox9.Text <> "" And TextBox10.Text <> ""
TextBox11.Text <> "" And ComboBox1.Text <> "" And ComboBox2.Text <> ""
ComboBox3.Text <> "" Then
Graba
Else
MsgBox "Debe llenar todos los datos"
End If
End Sub
Private Sub UserForm_Initialize()
ComboBox1.AddItem ("SOLES")
ComboBox1.AddItem ("DOLARES")
ComboBox2.AddItem ("Kg")
ComboBox2.AddItem ("m2")

And
And
And
And

ComboBox3.AddItem
ComboBox3.AddItem
ComboBox3.AddItem
ComboBox3.AddItem
ComboBox3.AddItem
ComboBox3.AddItem
ComboBox3.AddItem
End Sub

Sub Graba()

("Fabricacicn estructural")
("Fabricacin calderera")
("Equipo")
("Miscelaneo")
("Montaje estructural")
("Montaje electromecnico")
("Obra civil")

Sheets("Hoja1").Select
t = Cells(Rows.Count, 1).End(xlUp).Row
'nombre
Cells(t + 1, 1).Value = TextBox1.Text
'nmero de OT
Cells(t + 1, 2).Value = "OT " & TextBox8.Text & " - " & TextBox9.Text
'Ao
Cells(t + 1, 3).Value = TextBox9.Text
'tipo de proyecto
Cells(t + 1, 4).Value = ComboBox3.Text
'cliente
Cells(t + 1, 5).Value = TextBox7.Text
'Responsable
Cells(t + 1, 6).Value = TextBox3.Text
'Fecha firma
Cells(t + 1, 7).Value = TextBox6.Text & "/" & Val(TextBox5.Text) & "/" &
Val(TextBox4.Text)
'Monto
Cells(t + 1, 8).Value = Val(TextBox10.Text)
Cells(t + 1, 8).Select
If ComboBox1.Text = "DOLARES" Then
Selection.NumberFormat = "[$$-409]#,##0.00"
Else
Selection.NumberFormat = "$ #,##0.00"
End If
'Peso rea
Cells(t + 1, 9).Value = Val(TextBox11.Text)
'Unidad de Medida
Cells(t + 1, 10).Value = ComboBox2.Text
'Tipo de moneda
Cells(t + 1, 11).Value = ComboBox1.Text
'Precio
Cells(t + 1, 12).Value = Val(TextBox10.Text) / Val(TextBox11.Text)
t=t+1
TextBox1.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
TextBox9.Text = ""
TextBox10.Text = ""
TextBox11.Text = ""
ComboBox1.Text = ""

ComboBox2.Text = ""
ComboBox3.Text = ""
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
MODULO 1
Sub fecha()
' fecha Macro
ActiveCell.FormulaR1C1 = "=DATE(2014,5,20)"
Range("A6").Select
End Sub
------------------------------------------------------------------Sub Macro2()
' Macro2 Macro
Range("D17").Select
Selection.NumberFormat = "[$$-409]#,##0.00"
End Sub
------------------------------------------------------------------Sub Macro3()
' Macro3 Macro
Selection.NumberFormat = "$ #,##0.00"
End Sub
EJEMPLO DE USO DE FOR-NEXT APLICADO AL CLCULO DE LA SUMA DE
CUADRADOS
Aplicacin de ForNext
El uso de esta estructura permite repetir un grupo de instrucciones un nmero de veces
determinado. El bucle For hace uso de un contador cuyo valor se modifica desde el Vo
hasta el Vf en una cantidad constante en cada repeticin.
Sintaxis
For contador = Vo To Vf [Step C]
Donde:
Contador: Variable numrica que sirve de control para el bucle.
Vo: Valor inicial del contador.
Vf: Valor final del contador.
C: Incremento o decremento del contador en cada iteracin.
Adicionalmente, se puede definir una variable Acumulador el cual cumple la funcin de
almacenar resultados parciales obtenidos en cada repeticin.
A continuacin se realizar un ejemplo aplicativo de la estructura ForNext para el clculo
de la suma de cuadrados hasta un valor X definido en una celda
Las instrucciones estn definidas para calcular la suma de cuadrados hasta el nmero
colocado en la celda B2.
Al finalizar las operaciones un cuadro de texto indicar el resultado correspondiente.
Para hacer uso de la macro nos dirigimos a la barra de men y seleccionamos la ficha
Programador. Desde el icono Macros ubicamos la instruccin Suma_Cuadrados y
ejecutamos
Sub Suma_Cuadrados()
Dim a As Integer
Dim Suma As Integer
Dim Cuadrado As Integer
Suma = 0

For a = 1 To Cells(2, 2) Step 1


Cuadrado = a * a
Suma = Suma + Cuadrado
Next a
MsgBox "Suma de Cuadrados hasta " & Cells(2, 2) & "=" & Suma
End Sub

EJEMPLO DE LA FUNCIN FOR-NEXT


La funcin FOR se utiliza para repetir una instruccin por ms de una vez. Esta cantidad
de veces debe ser conocida.
Sintaxis
FOR VARIABLE = VALOR INICIAL TO VALOR FINAL STEP (INCREMENTO)
INSTRUCCIONES
NEXT
STEP es opcional, si no se coloca se considera que el incremento es de 1
Ejemplo
Se crea una lista de profesiones de la cual se debe escoger unicamente uno. Luego se da
la instruccin para que esta lista desplegable tome los valores de las celdas indicadas en
excel

Para que se tomen los valores indicados de forma rpida podemos usar FOR TO de esta
forma:
Esta macro aadir 5 elementos obtenidos desde la hoja activa, una posible mejora a este
ejemplo podra ser que se defina la hoja activa antes de proceder a ejecutar el programa,
as siempre se obtendra el mismo resultado independientemente de la hoja en que se
encuentre en el momento de la ejecucin.
Luego podemos ver la lista desplegable con totas las opciones

QU ES CALL EN VBA Y COMO SE USA?

Call en VBA nos permite invocar la macro desde otro procedimiento (Sub o Function) como
si fuera un procedimiento cualquiera.
Al utilizar Call para llamar a tal procedimiento requerir que los argumentos estn
encerrados en parntesis, si este procedimiento no tuviera argumentos no se colocaran.
Ejemplo del modo de uso, tenemos dos procedimientos diferentes pero que cumplen la
misma funcin, Proc1 uno no recibe parmetros mientras que Proc2 si recibe parmetros.

Sub Proc1()

MsgBox Hola mundo


End Sub

Sub Proc2(mensaje As String)

MsgBox mensaje
End Sub
En el caso del Proc1
Si se desea llamar el procedimiento con Call se realizara de la siguiente forma:
Sub principal1()
Call Proc1
End Sub
Si se obviara Call simplemente se llamara de la siguiente forma:
Sub principal2()
Proc1
End Sub
En el caso del Proc2
Si se desea llamar el procedimiento con Call se realizara de la siguiente forma ya que
requiere de un argumento y este deber estar entre parntesis.
Sub principal3()
Call Proc2(Hola mundo)
End Sub
Si se obviara Call simplemente se llamara de la siguiente forma y en este caso no se
colocaran los parntesis simplemente el argumento:
Sub principal4()
Proc2 Hola mundo
End Sub
Para todas las formas de llamar en estos casos el resultado ser una ventana con el
mensaje: hola mundo

Documento: Qu es Call en VBA y como se usa?


En el archivo de Excel anexado se podr probar los diferentes procedimientos cuando se
acceda al VB de la pestaa programador, ubicndose en el macro que desea ejecutar y
presionando F5
Nota: No es requerido usar Call cuando se llama a un procedimiento ya que no hace nada
adicional que otras formas de mtodos de llamado; esta a quedado es del antiguo VB en
donde siempre deba haber una keyword antes de una sentencia algo que ya no sucede
ahora.En pocas palabras podramos escribir simplemente el nombre de la macro y obviar
la palabra Call, salvo que el proceso use 2 o ms parmetros en cuyo caso es obligatorio
el uso de call.
EJEMPLO DE SELECT CASE APLICADO AL CLCULO DEL MONTO A PAGAR POR
ENTRADAS
Private Sub CommandButton1_Click()
Dim Tribuna As String
Dim numtickets As Byte
Dim precio As Single
Dim montopagar As Integer
Dim respuesta As String
Dim answer As String
Tribuna = Cells(9, 4)
numtickets = Cells(13, 4)
Select Case Tribuna
Case "Norte"
If numtickets <= 3 Then precio
Case "Sur"
If numtickets <= 3 Then precio
Case "Oriente Lateral"
If numtickets <= 3 Then precio
Case "Oriente Central"
If numtickets <= 3 Then precio
Case "Occidente central"
If numtickets <= 3 Then precio
Case "Occidente Lateral"
If numtickets <= 3 Then precio
Case "palco"
precio = 5000
End Select

= 50 Else precio = 45
= 40 Else precio = 35
= 150 Else precio = 135
= 200 Else precio = 185
= 350 Else precio = 335
= 300 Else precio = 285

respuesta = InputBox("Tiene tarjeta Macros?", "DESCUENTO", "answer")


If respuesta = "si" Then montopagar = 0.9 * precio * numtickets Else montopagar =
precio * numtickets
Cells(19, 4) = montopagar
End Sub
El clculo de monto totales a pagar puede resultar una tarea sencilla cuando se manejan
un nmero pequeo o nico de productos; sin embargo, cuando se comienza a
incrementar el nmero de productos o de unidades a vender, as como la de una oferta, el
clculo se vuelve ms complicado. Para ello se cuenta con herramientas como la
realizacin de pequeos aplicativos que nos permita facilitar la labor del clculo.

En este ejemplo, se desarroll un aplicativo para determinar el monto total a pagar por un
nmero de entradas a una destinada tribuna. El precio unitario de las entradas vara si se
compra ms de 3 o no, as como tambin con un descuento adicional si el cliente cuenta
con una tarjeta de crdito.
El siguiente grfico muestra la plantilla de ingreso de datos:

En la tabla el usuario puede introducir mediante una lista desplegable el tipo de tribuna
que desea el cliente, as como tambin como el nmero de tickets que desea comprar.
Antes de que se realice la compra, se le preguntar al cliente si tiene la tarjeta de crdito
MACROS para aplicarle un descuento, tal y como se muestra en la siguiente imagen:
Si el cliente responde que s, se entregar un precio final con descuento, caso contrario se
entregar el precio original.

FUNCIN SELECT CASE APLICADO A LAS HORAS DEL DA


La funcin Select Case se utiliza para evaluar una variable y realizar acciones
dependiendo del valor de sta. La diferencia con la funcin If radica en el nmero de
acciones a realizar luego de evaluar la variable. Mientras que en el Select Case se pueden
realizar indeterminadas acciones, con la funcin IF, slo dos posibilidades (una accin si
el resultado es verdadero y otra si es falso).
A continuacin aplicaremos la funcin select case para el siguiente ejemplo:

Paso 1: Vamos a crear una macro que contenga un formulario donde ingresaremos una
hora del da (del 0 a 24) y nos arrojar en que horario del da nos encontramos (maana,
tarde, noche y madrugada).

Paso 2: Configurar la macro con la funcin Select Case para que ejecuten las acciones
descritas en el Paso 1.

Paso 3: Correr la macro y observar los resultados


En este caso, si no se ingresa una hora del da correcta, aparecer un mensaje Hora no
vlida como se puede observar en la imagen insertada.

Por otro lado, si ingresamos una hora comprendida entre las 0 y las 6 horas, aparecer
Madrugada; entre las 7 y las 12 horas, Maana; entre las 13 y 18 horas, Tarde; y por
ltimo, entre las 19 y 24, Noche.
A continuacin, se presenta un ejemplo sobre lo comentado anteriormente:

EJEMPLO DE SELECT CASE APLICADO A LA DETECCIN DE RETENCIN DE 5TA


CATEGORA

Se requiere detectar el nivel mximo de porcentaje de retencin de quinta categora que


se tendr por trabajador segn sus ingresos proyectados anuales.
Segn la norma tributaria se tienen los siguientes 3 niveles:

Para esto se tendr un cuadro con los ingresos proyectados anuales que se requieren
evaluar.
Se estara definiendo en la aplicacin como constantes los 3 valores. Tambin combinando
la orden con la aplicacin Do While. .. Loop para poder llenar el cuadro.

La orden escrita en la macro es la siguiente:


Const a = 15
Const b = 21
Const c = 30

Sub Principal2()
Dim X As Variant, I As Byte
I=2
Do While Cells(I, 2) <>
X = Cells(I, 2)
Select Case X
Case 0 To 98550: Cells(I, 3) = a
Case 98551 To 197100: Cells(I, 3) = b
Case Is > 197100: Cells(I, 3) = c

End Select
I=I+1
Loop

End Sub
Cabe indicar que el ltimo tramo tiene como tope un nmero infinito. La tabla inicial tena
llenado slo los importes proyectados en la columna B donde se colocaba la base
imponible de retencin de quinta categora proyectada por el ao.

SELECT CASE APLICADO A BENEFICIOS POR PAGO PUNTUAL


En est aplicacin el Select Case puede ser utilizado para el clculo de beneficios que una

municipalidad por ejemplo, otorga a los buenos pagadores de autoevalo al final del ao.
Supongamos que una poltica de incentivo de una municipalidad, es que al final del ao
otorgue a los vecinos descuentos en el pago de su cuota final de autoevalo, de acuerdo
al nmero de meses que este pago puntualmente durante el ao.
En nuestro ejemplo, hemos considerado que los incentivos sern un porcentaje del pago

de la cuota N 12 (cuota en el mes de diciembre).


Un primer caso, es que el vecino 1 pago entre 1 a 4 meses puntualmente, por lo
que su descuento de pago ser un 10% de su cuota N12.
El segundo caso, es que el vecino 1 pago entre 5 a 8 meses puntualmente, por lo
que su descuento de pago ser un 20% de su cuota N12.
Por ltimo, el tercer caso es que el vecino 1 pago entre 9 a 11 meses puntualmente,
por lo que su descuento de pago ser un 30% de su cuota N12.
En nuestro cuadro, se puede apreciar que por ejemplo nuestro Municipio es conformado
por 7 vecinos, los cuales pagan un autoevalo distinto y tienen un nmero de meses que
pagaron puntualmente.

Cuadro N 1

Con dichos datos, nuestra macro calcular los descuentos de pago y el pago de
autoevalo en funcin a los incentivos establecidos anteriormente. A continuacin se
muestra como nuestra funcin con Select Case:
Sub Pago()
n = Cells(Rows.Count, 1).End(xlUp).Row
For x = 1 To n 6
Tiempo = Cells(6 + x, 3).Value
Select Case Tiempo
Case 1 To 4
Cells(6 + x, 4).Value = Cells(6 + x, 2).Value * 0.1
Case 5 To 8
Cells(6 + x, 4).Value = Cells(6 + x, 2).Value * 0.2
Case 9 To 11
Cells(6 + x, 4).Value = Cells(6 + x, 2).Value * 0.3
End Select
Cells(6 + x, 5).Value = Cells(6 + x, 2).Value Cells(6 + x, 4).Value
Next
End Sub
Cabe resaltar, que si bien nuestro ejemplo considera solo a 7 vecinos, nuestra
municipalidad puede contar con una cantidad mucho mayor; por lo que en la
programacin del VBA no hemos limitado el nmero de celdas que puedan contener datos.
Para ello, hemos definido un valor n como n = Cells(Rows.Count, 1).End(xlUp).Row con
la finalidad de que nos halle el nmero total de celdas que contienen informacin en
nuestra hoja de datos. Con ello, podemos definir mediante la funcin For que nuestra
macro se aplique desde la celda 7 ( que en nuestro ejemplo es el que contiene el primer
dato) hasta la ltima celda con informacin.

En el cuadro N 2 se muestran los resultados de descuento y pago de cuota, una vez que
hemos aplicado nuestra macro Select Case:
Cuadro N2

You might also like