5 Trucos de Vba Necesarios
5 Trucos de Vba Necesarios
5 Trucos de Vba Necesarios
Sub Buscar_Ultima_Fila()
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()
End Sub
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
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
Range(A1:D5).Select
Cells(i, j).Value = i * j
Next j
Next i
End Sub
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
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.
ColumnFields:=Array("HIJOS"),
proyectos estratgicos evaluando los montos y los precios unitarios que sern registrados
en la base de datos.
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
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
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 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
= 50 Else precio = 45
= 40 Else precio = 35
= 150 Else precio = 135
= 200 Else precio = 185
= 350 Else precio = 335
= 300 Else precio = 285
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.
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.
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:
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.
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.
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
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