Macros Excel
Macros Excel
Macros Excel
personalizadas en
Excel
Sub Saludo()
Worksheets("Hoja2")
Worksheets( Hoja2 ).Activate
Activate
ActiveSheet.Range("C5").Value = "¿Cómo esta usted?"
ActiveSheet.Range("C5").Font.Bold = True
ActiveSheet.Range("C5").Font.Color = RGB(255, 0, 0)
End Sub
Sub Escribe_bis()
With ActiveSheet.Range("C7")
.Value = "Cta. Resultados"
.Font.Bold = True
.Font.Color = RGB(0, 255, 0)
End With
End Sub
Option Explicit
Sub Entrar_Valor()
Dim Texto As String
T
Texto = InputBox("Introducir
I B ("I d i un texto"" & Ch
Chr(13)
(13) & "P
"Para lla C
Casilla
ill D10"
D10", "E
"Entrada
d dde
Datos")
ActiveSheet.Range("D10").Value = Texto
End Sub
Sub Entrar_Valor_Bis()
'Este procedimiento es igual que el anterior pero no utiliza variables
ActiveSheet.Range("D11").Value _
= InputBox("Introducir un texto " & Chr(10) & "Para la casilla D11", "Entrada de datos")
'El guión bajo permite partir una línea de código demasiado larga. Ver Chr(10)
End Sub
Sub Entrar_Valor_Tris()
Entrar Valor Tris()
'En este caso se pide al usuario que entre la casilla donde se introducirá el texto
Dim Casilla As String 'Casilla puede ser por ejemplo D12
Dim Texto As String
Casilla = InputBox(
InputBox("EnEn que casilla quiere entrar el valor"
valor , "Entrar
Entrar Casilla")
Casilla )
Texto = InputBox("Introducir un texto" & Chr(13) _
& "Para la casilla " & Casilla, "Entrada de datos") ‘ Operador de concatenación &
ActiveSheet.Range(Casilla).Value = Texto
End Sub
Sub Sumar()()
'Pide dos números y pone en una celda su suma
'Dim Numero1 As Integer
'Dim Numero2 As Integer
Numero1 = InputBox("Entrar el primer valor", "Entrada de datos")
Numero2 = InputBox(
InputBox("Entrar
Entrar el segundo valor"
valor , "Entrada
Entrada de datos
datos"))
Worksheets("Hoja1").Activate 'Esto se pone por si estamos en una hoja distinta de la Hoja1
ActiveSheet.Range("E10").Value = Numero1 + Numero2
End Sub
Sub Sumar_Bis()
Sumar Bis()
'Este procedimiento es similar al anterior
'En el procedimiento anterior si se mete como variable una palabra, da error.
'Por eso en este procedimiento añadimos la función Val
Dim Numero1 As Integer
Di Numero2
Dim N 2 As
A Integer
I t
Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de datos"))
Numero2 = Val(InputBox("Entrar el segundo valor", "Entrada de datos"))
ActiveSheet.Range("E11").Value = Numero1 + Numero2
End Sub
Sub area()
Dim base As Integer
Dim altura As Integer
Dim superficie As Integer
'Los decimales se introducen con coma en un inputbox, y con punto en el código
altura = InputBox("Introduzca la altura del rectángulo")
base = InputBox("Introduzca la base del rectángulo")
superficie = base * altura
MsgBox ("El área del rectángulo es " & superficie)
End Sub
03/08/2010 Adolfo Aparicio 11
P bli – Private.
Public P i t Cells
C ll
z Public. Indica que el procedimiento Sub es accesible para todos
los demás procedimientos de todos los módulos
z Private. Indica que el procedimiento Sub es accesible sólo para
otros procedimientos del módulo en el que se declara
z Por defecto los procedimientos son Public
z Cells comienza a contar filas y columnas a partir del rango
especificado en el objeto Range
Cells(fila,columna)
Private Sub Celda()
Cells(12, 3).Value = "Solo " & 2
ActiveSheet.Cells(10, 6).Value = "Paris"
'La
La Celda 10,6 es la F10
Range("C13:D14").Value = "Cuadrado"
Range(Cells(15, 3), Cells(16, 4)).Value = "Cubo"
Range("C17:F20").Cells(2, 1).Value = "Elipse" 'Esto solo pone una elipse
End Sub
S
Sub objeto()
Di R As
Dim A Range
R
Set R = ActiveSheet.Range("H21:I22")
R.Value = "Roma"
R.Font.Bold = True
R.Font.Color = RGB(0, 255, 100)
End Sub
Sub Condicional()
ActiveSheet.Range("E14").Value = 0
ActiveSheet.Range("E15").Value
ct eS eet a ge( 5 ) a ue = 0
ActiveSheet.Range("E16").Value = 0
ActiveSheet.Range("E14").Value = Val(InputBox("Entrar el precio", "Entrar"))
'Si el valor de la casilla E14 es mayor que 1000, entonces pedir descuento
If ActiveSheet.Range("E14").Value > 1000 Then
ActiveSheet.Range("E15").Value = Val(InputBox("Entrar Descuento", "Entrar"))
End If
ActiveSheet.Range("E16").Value = _
ActiveSheet.Range("E14").Value - ActiveSheet.Range("E15")
End Sub
Sub Condicional2()
If ActiveSheet.Range("F14").Value = ActiveSheet.Range("F16").Value Then
ActiveSheet.Range("F14").Font.Color = RGB(0, 0, 255)
ActiveSheet.Range("F16").Font.Color = RGB(0, 0, 255)
End If
End Sub
Sub
S b objeto_Bis()
bj Bi ()
Dim R As Range
Set R = ActiveSheet.Range("E12:F13")
R.Value = "Milan"
R.Font.Bold = True
Set R = Nothing 'Nothing permite asigna a la variable objeto un valor nulo.
' Esto es útil junto con un IF para verificar si la variable esta asignada
If R Is Nothing Then
MsgBox Prompt:="La variable Objeto no ha sido asignada", Buttons:=vbOK, _
Title:="Error"
Else
R.Value = "Hola"
End If
End Sub
Sub Calculadora()
Dim Signo
g As String g * 1 'Un solo carácter alfanumérico
Dim Valor1 As Integer, Valor2 As Integer, Total As Integer
Valor1 = ActiveSheet.Range("C19").Value
Valor2 = ActiveSheet.Range("C20").Value
Signo = ActiveSheet.Range("C21").Value
Total = 0
If Signo = "+" Then
Total = Valor1 + Valor2
End If
If Signo = "-" Then
Total = Valor1 - Valor2
End If
If Signo = "x" Then
Total = Valor1 * Valor2
End If
If Signo = ":"
: Then
Total = Valor1 / Valor2
End If
ActiveSheet.Range("C22").Value = Total
End Sub
Sub calcula_case()
calcula case()
Dim Signo As String * 1
Dim Valor1 As Integer, Valor2 As Integer, Total As Integer
Valor1 = ActiveSheet.Range("D19").Value
Valor2 = ActiveSheet.Range("D20").Value
Signo = ActiveSheet
ActiveSheet.Range("D21").Value
Range("D21") Value
Select Case Signo
Case "+"
Total = Valor1 + Valor2
Case "-"
T t l = Valor1
Total V l 1 - Valor2
V l 2
Case "x"
Total = Valor1 * Valor2
Case “:"
Total = Valor1 / Valor2
Case Else
Total = 0
End Select
ActiveSheet.Range("D22").Value = Total
End Sub
Sub InputCaja()
Dim Respuesta As String
Respuesta = InputBox("Primera Línea" & vbCrLf & Chr(9) _
& "Segunda Línea con Tabulador Chr(9)", "Aquí el Título") 'Chr(10) equivale a vbCrLf
Respuesta = InputBox("Haz clic en [Cancel]", "A ver que pasa si se cacela")
MsgBox "Al pulsar Calcelar el resultado es = " & Respuesta 'Respuesta nula ""
Respuesta = InputBox("Aparece un valor por defecto", "Título", "Aparece esto por defecto")
Respuesta = InputBox("Situo la ventana", "1200 Twips a la derecha y 1400 hacia abajo", "coordenadas
1200x1400", 1200, 1400)
Respuesta = InputBox("Otra posición", , "1 cm = 566 Twips y 1 pixel = 15 Twips", 50, 75)
E dS
End Subb
Dim i As Integer
Dim Total As Integer
Dim Valor As Integer
For i = 1 To 10
a o = Val(InputBox("Entrar
Valor a ( put o ( ta e el valor
a o " & i,, "Entrada"))
t ada ))
Total = Total + Valor
Next i
ActiveSheet.Range("C11").Value = Total
End Sub
Sub serie()
Dim Casilla_Inicial As String
Dim i As Integer
Di Fila
Dim Fil As
A Integer,
I C l
Columna A Integer
As I
Casilla_Inicial = InputBox("Introducir la casilla Inicial : “ & chr(10) & “Por ejemplo la K10”,
"Casilla Inicial")
ActiveSheet.Range(Casilla_Inicial).Activate
Fila = ActiveCell.Row
ActiveCell Row
Columna = ActiveCell.Column
'ROW y COLUMN devuelven la fila y la columna de un objeto range.
'en este caso se utilizan para obtener la fila y la columna de la casilla activa.
For i = 1 To 10
ActiveSheet.Cells(Fila, Columna).Value = i
Fila = Fila + 1
Next i
End Sub
Sub serie_Bis()
Dim Casilla_Inicial As String
Dim i As Integer
g
Dim Fila As Integer, Columna As Integer
Casilla_Inicial = InputBox("Introducir la casilla Inicial : " & chr(10) & “Por ejemplo
la L10”, "Casilla Inicial")
ActiveSheet Range(Casilla Inicial) Activate
ActiveSheet.Range(Casilla_Inicial).Activate
Fila = 1
For i = 1 To 10
ActiveSheet.Range(Casilla_Inicial).Cells(Fila, 1).Value = i
Fila = Fila + 1
Next i
End Sub
Sub serie_Tris()
Dim Casilla_Inicial As String
Dim i As Integer
Dim Fila As Integer, Columna As Integer
Casilla_Inicial = InputBox("Introducir la casilla Inicial : " & chr(10) &
“Por ejemplo la M10”, "Casilla Inicial")
ActiveSheet.Range(Casilla_Inicial).Activate
‘ Activate (con Range) activa una sola celda. Range("B2").Activate
‘ Para seleccionar un rango de celdas, use el método Select. Range("A1:C3").Select
For i = 1 To 10
ActiveSheet.Range(Casilla_Inicial).Cells(i, 1).Value = i
Next i
E dS
End Sub b
03/08/2010 Adolfo Aparicio 43
For-Next
For Next y Cells
z Volvemos a calcular las notas medias, pero usando la estructura For_Next y la
propiedad Cells
Sub Media_notas_Bis()
Dim Nota As Integer
Dim Media As Single
Dim Fila As Integer
Media = 0
For Fila = 1 To 5
( p (
Nota = Val(InputBox("Entrar la " & " Nota " & Fila, "Entrar Nota"))
))
ActiveSheet.Range(“N10").Cells(Fila, 1) = Nota
'lo de Range(“N10") se pone para marcar la celda de inicio,
'si no se pone comienza en A1
Media = Media + Nota 'esto
esto es un acumulado
Next Fila
Media = Media / 5
ActiveSheet.Range(“N10").Cells(6, 1).Value = Media
End Sub
Sub Media_notas_Tris()
Dim Nota As Integer
Dim Media As Single
Dim Fila As Integer
Media = 0
ActiveSheet.Range("O10").Activate 'la casilla activa siempre es la misma
For Fila = 0 To 4
Nota = Val(InputBox("Entrar la " & " Nota " & Fila + 1, "Entrar Nota"))
ActiveCell.Offset(Fila, 0).Value = Nota
Media = Media + Nota
Next Fila
Media = Media / 5
ActiveCell.Offset(5, 0).Value = Media
End Sub
Sub NombraHojas2()
'Si se pulsa cancelar o no se pone nada en el nombre se sale con el EXIT FOR
Dim Nuevo_Nombre As String
Di hoja
Dim h j As
A Worksheet
W k h
For Each hoja In Worksheets
Nuevo_Nombre = InputBox("Nombre de la Hoja : " & hoja.Name, "Nombrar Hojas",
hoja.Name)
If Nuevo_Nombre = "" Then Exit For 'EXIT FOR sale del bucle
hoja.Name = Nuevo_Nombre
Next
End Sub
z Se ha declarado una variable tipo Range, este tipo de datos sirve para guardar
Rangos de una o más casillas, estas variables pueden luego utilizar todas las
propiedades y métodos propios de los Objetos Range
Range.
z La asignación de las variables que sirven para guardar o referenciar objetos
(Range, WorkSheet, etc.) deben inicializarse muchas veces a través de la
instrucción SET
Sub Registros_Septa() Do
Dim Nombre As String Nombre = InputBox("Entre el Nombre : ", "Nombre")
Dim Ciudad As String Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Dim Edad As Integer Edad = Val(InputBox("Entre la Edad : ", "Edad"))
Dim fecha As Date fecha = CDate(InputBox("Entre la Fecha : ", "Fecha"))
Dim Mas_datos As Integer With ActiveCell
' Llamada a la función .Value = Nombre
Saltar_Celdas_Llenas_Bis .Offset(0, 1).Value = Ciudad
' Mediante dos parámetros se .Offset(0, 2).Value = Edad
comunica al procedimiento llamado en .Offset(0, 3).Value = fecha
que hoja y celda comenzar
End With
Call
Saltar_Celdas_Llenas_Bis("Hoja3", "B4") ActiveCell.Offset(1, 0).Activate
'Los parámetros pueden ser valores o Mas_datos = MsgBox("Otro registro ?", vbYesNo +
variables vbQuestion "Entrada
vbQuestion, Entrada de datos")
datos )
Loop While Mas_datos = vbYes
End Sub
z Sirve para Saltar celdas llenas de una columna hasta encontrar una vacía que
se convierte en activa
z Parámetros :
z Hoja : Hoja donde está el rango a saltar.
z Casilla_Inicial : Casilla Inicial de la columna
z Gracias a los parámetros, sirve para recorrer cualquier rango en cualquier hoja.
z Es incorrecto porque tanto las variable i como la variable Suma están declaradas dentro del
procedimiento Sumar_Cinco_Siguientes consecuentemente, su ámbito de acción es este procedimiento.
z Por tanto, la instrucción ActiveCell.Offset(6,0).Value
( ) = Suma del p
procedimiento Hacer, g
generaría un error
(con Option Explicit activado) ya que la variable Suma no está declarada dentro de él.
z Si piensa en declarar la variable Suma dentro del procedimiento Hacer, no solucionará nada porque esta
será local a dicho procedimiento, en este caso tendría dos variables llamadas Suma pero cada una de
ellas local a su propio procedimiento y consecuentemente con el ámbito de acción restringido a ellos.
Option Explicit
Di Suma
Dim S A Si
As Single
l ‘Suma
‘S es una variable
i bl global
l b l reconocida
id por ttodos
d llos procedimientos
di i t d dell módulo
ód l
Sub Hacer_Bis()
.
Call Sumar_Cinco_Siguientes_Bis
ActiveCell.Offset(6,0).Value = Suma
.
End Sub
Sub Sumar_Cinco_Siguientes_Bis()
Dim i As Integer
Suma=0
For i=1 To 5
Suma = Suma+ActiveCell.Offset(i,0).Value
Next i
E d Sub
End S b
z Aunque lo elegante y efectivo por razones de memoria seria pasar siempre que
sea posible por valor, es poco habitual que así se haga en Visual Basic,
seguramente por comodidad.
comodidad
z Como suponemos que hará como la mayoría, es decir, pasar por referencia,
tenga cuidado con los (indeseables) efectos laterales.
Sub Busca_Bis()
Dim Casilla As String
Dim Valor As Integer
Worksheets("Hoja4").Activate
Valor = CInt(InputBox("Valor buscado: ", "Entrar Datos"))
C ill = Buscar_Valor_Bis("B5",
Casilla B V l Bi ("B5" VValor)
l ) 'Ver
'V lal función
f ió B Buscar_Valor_Bis
V l Bi
' Si valor no encontrado
If Casilla = "" Then
MsgBox ("NO se ha encontrado el valor buscado")
Else 'Valor encontrado
MsgBox ("El primer " & Valor & " esta en la celda: " & Casilla)
End If
End Sub
Importar un módulo
z Cierre todos los archivos de Excel y abra uno nuevo.
z 1. Active el editor Visual Basic.
z 2. Active opción de la barra de menús Archivo/ Importar Archivo. Aparece un cuadro de
diálogo.
z 3 Seleccione en la lista Buscar en: la carpeta donde tiene ubicado el archivo a importar
3.
z 4. Una vez localizada la carpeta, seleccione el archivo a importar (General.Bas en el ejemplo) y
pulse sobre Abrir.
z Observe como en la ventana de proyecto se ha incorporado un nuevo módulo que contiene todos
los procedimientos y funciones del archivo importado.
Sub prestamo()
Static Principal ‘ Variable estática.
estática No cambia
Static Tasa
Static Terminos
Dim Pago As Double
Principal = Application.InputBox(Prompt:="Principal (100000 por ejemplo)", _
Default:=Principal)
Tasa = Application.InputBox(Prompt:="Tipo de interés nominal anual (4,75 por ejemplo)", _
Default:=Tasa)
Terminos = Application.InputBox(Prompt:="Número de años (30 por ejemplo)", _
Default:=Terminos)
‘ Vea como se usa la función de Excel Pmt (Pago) sin necesidad de calcularla en una celda
Pago = Application.WorksheetFunction.Pmt(Tasa / 1200, Terminos * 12, Principal)
MsgBox Prompt:="La Mensualidad es " & Format(-Pago, "Currency"), Title:="Calculadora de Préstamos"
End Sub
Sub perimetro()
Dim radio As Double, longitud
g As Double
Const pi = 3.141592
radio = InputBox("Introduzca el radio de la circunferencia")
longitud = 2 * pi * radio
ActiveCell.Value = longitud
End Sub
Sub perimetro3()
Dim radio As Double, longitud As Double
Dim pi As Double
pi = Application.WorksheetFunction.pi()
radio = InputBox("Introduzca el radio de la circunferencia")
longitud = 2 * pi * radio
MsgBox = longitud
End Sub
Sub Array3()
'Calcular valores aleatorios
'En este caso, los valores aleatorios se calculan usando formulas
Excel
Range(Cells(4, 3), Cells(13, 3)).FormulaArray = "=Round(Rand() *
100, 0)"
'Vea la diferencia entre Rnd (del caso anterior) y Rand.
'Una es una fórmula VBA la otra es una fórmula Excel en inglés
End Sub
z V fichero
Ver fi h C
CeldaColor.xls
ld C l l
03/08/2010 Adolfo Aparicio 122