Академический Документы
Профессиональный Документы
Культура Документы
1. Introducción
a. Que es VBA.
b. Cuando se necesita utilizar.
2. Editor de VBA.
3. Fundamento del lenguaje.
4. POO y jerarquía de objetos Excel.
5. Tipos de procedimientos.
a. Procedimientos sub.
b. Procedimientos function.
6. Módulos de clase.
7. Ejemplos y técnicas de programación con VBA.
8. Trabajar con formularios (UserForm).
9. Eventos.
10. Trabajar con graficas.
11. Trabajo con tablas dinámicas.
12. Interacción con otras aplicaciones.
a. Access.
b. Word.
c. Documentos pdf.
13. Uso de complementos.
14. Creación de menús personalizados.
15. Creación y desarrollo de aplicaciones Excel.
Objetos en Excel.
Obejeto celda, en VBA Range
Propiedades. Tiene bordes, fondo, valor, dirección
Métodos. Copiar, borrar, seleccionar, etc
Instancia Range A1
Bordes rojos, fondo amarillo, valor 500, dirección A1.
Jerarquía de objetos.
En Excel.
Application.Workbooks("Libro1").Worksheets("Hoja2").Range("b5").Value = 250
Esta es la manera larga de escribir el código. Para demostrar la jerarquía.
Cuando el libro esta activo o la hoja activa, se pueden ir suprimiendo palabras del código
Application, se puede suprimir. Por que hace referencia a que usamos Excel.
Workbooks si usamos el libro 1. Estando este activo y siendo el único.
Lo mismo con Worksheets si trabajamos con una única hoja.
Quedaría asi.
Range("b5"). Value = 250 rango de celda, valor 250
Range tiene como propiedad principal el Value, por ello se puede omitir escribir la propiedad o el método por
defecto, quedaría.
Range("b5") = 250
Sub borrar()
Range("B5").Select
Selection.ClearContents
End Sub
Sub Borrar()
'Range("b5").Select
'Selection.ClearContents
Range("b5").ClearContents
End Sub
Sub destacar()
Range("b5").Interior.Color = RGB(0, 100, 255)
'Rojo, verde, azul
'Estos numeros que me mescla colores va desde 0 y 255
End Sub
Sub destacar2()
Selection.Interior.Color = RGB(0, 100, 255)
End Sub
Sub pruebas()
Range("b5") = 250
End Sub
Definición de variable: espacio en la memoria del ordenador donde se puede almacenar un valor que podrá
variar durante la ejecución de un programa.
Declarar variables.
Se emplea dim y se le coloca un nombre luego se coloca el tipo de variable
Sub tipos_datos ()
Dim nombre As String
End sub
Si no se especifica el tipo de variable te declara como Variant, con un espacio grande de almacenamiento
Las palabras reservadas del lenguaje el VBA me las colorea en azul.
Los valores de tipo string van entre comilla “María” por ejemplo
Declaro un numero
Dim edad as byte o Integer
Inicio la variable (le doy un valor)
Edad= 15 no va entre comilla
MsgBox "Hola " & nombre & "Tienes " & edad & " años"
Ampersand
El signo &, cuyo nombre en español es et,1 es una alternativa gráfica de la conjunción copulativa latina et, de la
que deriva la conjunción española «y», que es lo que significa.
Es conocido también por su nombre en inglés ampersand, proveniente a su vez de la expresión and per se and, es
decir, «y por sí mismo, y», antiguamente usada como parte de la retahíla para la memorización del alfabeto.
VIDEO 5.
Seguimos con la declaración de variables.
Se configura para forzar la declaración de la variable
Hay que tener en cuenta el ámbito donde se declara la variable
Los ámbitos son:
A nivel procedimiento (local): solo en el procedimiento (entre los sub y End sub)
A nivel modulo (local):
A nivel público. Desde cualquier modulo perteneciente al procedimiento.
Si la declaro afuera de la línea la declaro a nivel modulo, si esta adentro es a nivel procedimiento
No puedo iniciar una variable fuera del procedimiento. Solo declararlo
Para llamar a un procedimiento anterior: Call
Declaración de constantes
La palabra reservada es CONST, se tienen que iniciar siempre
También tiene las mismas consideraciones con el AMBITO (local a nivel procedimiento, modulo o publico)
VIDEO 6.
Matrices de una dimensión.
Matriz: Elementos del mismo tipo con un nombre común.
Como se declara.
Option Explicit
Sub declaración_matrices ()
Dim mirango (4) As Integer ‘de esta manera con el (4) declaro que es una matriz de una fila y 4 columnas
End Sub
El índice mas alto será 4 pero los valores que podrán almacenarse van desde el 0}
0 1 2 3 4
Si declaro una matriz que almacena 5 valores e invoco la casilla numero 6 hay un ERROR DE DESBORDAMIENTO
Si antes de cada procedimiento escribimos Option base 1 indicamos que todas las matrices inician desde el 1 no
el cero.
Otra manera de rellenar una matriz.
La manera que por ahora se puede ver el valor de una matriz es por msgbox o por la ventana “inmediato”
Pero la manera mas habitual de recorrer una matriz más extensa es mediante un bucle for
Un ejemplo más complejo de código en donde se emplean bucles para almacenar valores en celdas/ range
Del Excel es es siguiente:
Option Explicit
Sub introducrivalores() declaro el procedimiento
Dim mirango(5) As Integer declaro la matriz e indico el numero de datos a almacenar
Dim micelda As Range declaro la variable micelda como objeto celda
Dim indice As Integer declaro la variable índice como un numero entero
Range("d1").Select selecciono la celda “d1” de la hoja Excel
Selection.CurrentRegion.Select selecciono las celdas aledañas a la celda d1
For Each micelda In Selection creo el bucle for each para que valla seleccionando celda por celda
mirango(indice) = micelda.Value inicio la variable mirango completando la matriz con los v de la celda
indice = indice + 1 hago que se valla incrementando el valor del índice
Next micelda hago que se inicie nuevamente el bucle
Dim i As Integer declaro la variable i
For i = 0 To 5 Step 1 indico el rango por el cual va a pasar un bucle for
Debug.Print mirango(i) indico que se imprima en la ventana “inmediato”
Next i hago que se inicie nuevamente el bucle for en un valor superior
End Sub termina el procedimiento
VIDEO 7.
Arrays/ matrices de dos o más dimensiones. Declaración y almacenamiento.
Para reyenar o recorrer una matriz lo idal es usar un bucle FOR
Las variables i y z me sirven para recorrer la matriz
Option Explicit
Sub declaracion_matrices()
Dim mimatriz(3, 4) As Integer
Dim i As Integer, z As Integer
For i = 0 To 2 Step 1
For z = 0 To 3 Step 1
mimatriz(i, z) = Math.Round(Math.Rnd * 100)
Debug.Print mimatriz(i, z)
Next z
Next i
'For i = 0 To 2 Step 1
' For z = 0 To 3 Step 1
' Debug.Print mimatriz(i, z)
' Next z
'Next i
End Sub
VIDEO 9
Funciones integradas / predefinidas.
Hay funciones que permiten o no argumentos
El editor nos ayuda
F1 es la ayuda de Excel. Nos dice para que sirve, los valores, etc
Para cualquier función predefinida.
Tenemos la equivalencia a la hoja de cálculo.
Podemos usar dos objetos que tienen todas estas funciones predefinidas.
WorksheetFunction.
Math.
Msgbox sacar información hacia afuera para que el usuario pueda verlo
Inputbox toma información del exterior y lo introduce dentro del programa
El usuario podrá introducir por medio de una ventana para luego poder manipularlo.
Suma un rango seleccionado y dice si hay en el rango seleccionado texto, y si se quiere continuar o no con la operación.
El msgbox traerá un mansaje de si y de no para poder continuar con la operación (suma en este caso)
Como construir dos botones.
El ejercicio
Sub funciones_integradas ()
Dim micelda As Range, z As Boolean, valor As Integer 'declaro dos variables uno objeto y otro booleano
For Each micelda In Selection
If WorksheetFunction.IsText(micelda) Then 'le digo que, si es un texto lo que estoy evaluando en mi celda, tengo que hacer:
Next micelda
If z = True Then 'si te has encontrado texto dice
valor = MsgBox ("Hay texto en el rango seleccionado" & vbCrLf & ". ¿Deseas continuar?", 4) 'esta última instrucción me produce un salto de línea
End If
'Else
' MsgBox "Son solo numeros" 'un else es un y si no
Else
MsgBox WorksheetFunction.Sum(Selection)
End If
End Sub
Sub uso_inputbox()
End Sub
& ampersand
VIDEO NUMERO 11
Option Explicit
Sub contro_flujo1()
On Error GoTo etiqueta 'en el caso de que haya un error ve a un marcador
Dim edad As Integer
edad = InputBox("introduce tu edad", " ", " ", 5000, 5000)
If edad < 18 Then ' si la edad es menor que 18 entonces
'tengo que programar que quiero que haga si es verdadero
MsgBox "Eres menor de edad"
End If
If edad >= 18 Then
MsgBox "Eres mayor de edad"
End If
Exit Sub
etiqueta:
MsgBox "no sé qué edad tienes"
End Sub
Video 12
El condicional fi puede emplearse un else un “y si no” para simplificar el código
Además, esta la estructura elseif si esto no es cierto ve a ver si esto es cierto
También empleamos el operador and
Video 13. Estructura de control de flujo Select case. Puedo usar esta estructura o el if, pero cuando se tiene que evaluar muchas
condiciones es más cómodo usar el Select case. Cuando hay que evaluar dos valores (“una horquilla de valores”) es mas cómodo, no hay
que usar el operador and
While “mientras”
Sintaxis:
VIDEO 15 REPASO 1
Juego donde tengo que acertar un numero aleatorio, donde me va informando si es mas alto o mas bajo ,el número de intentos que
emplee (los intentos), la posibilidad de iniciar el juego o borrarlo.
Y cuando acierto me dice que es correcto y el inputbox desaparece.
Para generar números aleatorios. Randomize, rnd
Las de arriba se emplean para ejecutar macros que se hacen con la grabadora y las
de abajo las que se realicen manualmente, por procedimiento sub que responden a
objetos
aleatorio = Math.Rnd * 100 'le dije que genere un numero aleatorio del uno al 100
While aleatorio <> minum 'mientras el numero generado sea diferente del mio
minum = InputBox("Introduce un nuemero entre 1 y 100", "Introducción", , 150, 150) 'para saltarme un parámetro coloco dos comas
End If
Wend
' cuando introduzco un parámetro inputbox se convierte en una variable, por eso tengo que declárala primero
End Sub
Luego se hacen algunas modificaciones sobre el mismo para que se escriban los números introducidos, en numero de intentos y la ayuda
en la hoja de Excel, no en una ventana emergente como hasta ahora.
Para Offset(fila, 0) tengo que indicar cuanto quiero desplazar partiendo de una celda, cuantas filas y columnas con un numero
Loop
End Sub
En segunda parte del video, vamos a ingresar los datos (lista de países) desde un archivo de texto.
El bucle loop until, cambia en que until es “hasta”, hace lo que dice hasta que la condición de bucle se cumple
Video 19 procedimientos.
Hasta ahora trabajamos con procedimientos sub
Sintaxis
Delante de sub se pueden agregar Modificadores de accesos
Public
Private
State
Que son los lugares de donde puedo acceder
MODIFICADORES DE ACCESO:
Public sub. Puedo acceder desde cualquier modulo
Si no se pone el public da igual, es el por defecto.
Prívate sub. Solo desde le propio modulo.
Static. El valor de la variable dentro del procedimiento se mantiene dentro del mismo.
LOS ARGUMENTOS
Son valores que nuestro procedimiento utilizara durante la ejecución de un programa
Son los que van entre paréntesis
Sum número (zona de parámetros)
Como ejecutar un procedimiento sub
a) Con el comando Sub User Form o pulsando F5
o No funciona si el procedimiento requiere argumentos (o parámetros es lo mismo).
o Es la manera de ejecutarlo cuando se está haciendo pruebas, el usuario nunca los
emplearía.
b) Desde el menú MACROS
o No funciona si el procedimiento es private
c) Teclado.
No funciona si el procedimiento es private
VIDEO 20. Continuación ejecución de un procedimiento
d) Haciendo clic en figura o botón.
BOTONES
o Botón procedimiento (de la grabadora o generado) asignando MACRO
o ActiveX, cuando se llama un procedimiento asociado en otro modulo.
FIGURAS
o Insertando una imagen
e) Desde otro procedimiento. Llamada a procedimiento. Un procedimiento desde un sub desde
otro. Siempre que el procedimiento sea público.
f) Desde la barra de herramientas de acceso rápido, si es private no aparecería en “Mas
comandos”.
g) Desde botón personalizado en la cinta de opciones, valido en la versión 2010.
Se crea una pestaña más en la cinta de Excel. Se puede crear una pestaña más con nombre “mis
macros”.
Hay funciones que no requieren argumentos, como la función AHORA, que me dice la fecha y hora
actual.
BuscarV tiene 4 argumentos y tres son obligatorios.
La función suma tiene un número de argumentos ilimitados (255 por ejemplo).
Que tipos de valores puede recibir un procedimiento. (un procedimiento tipo sub por ejemplo).
Variables
Constantes
Matrices
Objetos
Option Explicit
Worksheets("Resultados").c_paises.AddItem "China"
Worksheets("Resultados").c_paises.AddItem "Italia"
Worksheets("Resultados").c_paises.AddItem "Usa"
Worksheets("Resultados").c_paises.AddItem "Marruecos"
Worksheets("Resultados").c_paises.AddItem "España"
Worksheets("Resultados").c_paises.AddItem "Japón"
Worksheets("Resultados").c_paises.AddItem "Suecia"
End Sub
Pero no es la manera que vamos a emplear, porque si agregamos así lo elementos a mano, cuando
modifique mi base de datos no se actualizara, debe ser rellenado dinámicamente
Se puede rellenar a mano mas fácil con el bucle with y end with
With Worksheets("Resultados").c_paises
.AddItem "China"
.AddItem "Italia"
.AddItem "Usa"
.AddItem "Maruecos"
End With
End Sub
Etiqueta
Cuadro de texto, para introducir
Combo box para filtrar
Botones de comandos
Botones de radio
Herramientas comunes de Access
Barras de menú
Botones de alternar
Listas
Etc
Un procedimiento function tiene parámetros, y a partir del código que se le introduce se le devuelve un
valor u otro.
=SI(D2=1;(C2+E2)*15%;SI(D2=2;(C2+E2)*25%;(C2+E2)*35%))
Sub ordenafioncion()
Application.MacroOptions "calculo_salario", "Calcula el salario de los trabaja en función del tipo de los
vendedores", , , , , 1
End Sub
Para que funcione en todos los documentos Excel, tengo que guardarlo como un complemento.
Para habilitarlo:
Archivo/opciones/complementos/ botón ir
Y se me abre otro menú con más complementos
Las funciones que se crean por definición quedan almacenadas en la categoría definidas por el usuario,
Puedo además cambiarlo a cualquier categoría y además agregarle alguna descripción por medio de
código.
Cuando no sabemos cuántas celdas componen el rango que queremos copiar, si el rango es móvil
Se puede usar la propiedad: currentregion, detecta las celdas en las 4 direcciones
Range("a1").CurrentRegion.Copy Range("i3")
Si hay columnas con interrupciones. Con xlup nos movemos hacia arriba, pero para ello es necesario saber cual es
la ultima fila
Range("a1", Range("a100000").End(xlUp)).Copy Range("i3")
Si lo que se quiere es mover rangos y no copiarlo, es todo lo mismo pero donde va Copy va cut
VIDEO 31. Técnicas II inserción de datos. Introducir información una celda tras otra.
VIDEO 32. Técnicas III. Tipos de datos y eliminar filas
Sub detecta_numero_texto()
If Application.IsText(Range("a2")) Then
End Sub
Option Explicit
Sub detecta_numero_texto()
End If
End Sub
Ahora un rango de celda, para ver si hay o no un texto entre los números
Sub evalua_si_texto()
Range(Range("a2"), Range("a2").End(xlDown)).Select 'desde la celda a2, recorro todas las celdas que
estan
'alado y las seleciono hasta donde termino
resultado = True
micelda.Interior.Color = vbRed
End If
Next micelda
Else
End If
End Sub
Algunas prubas con las filas, sea para contarlas o para seleccionarlas
Sub prubas()
End Sub
Sub prueba()
End Sub
For fila = ultimafila To 1 Step -1 'lo recorro con un bucle, le digo que de la ultima fila tiene que llegar
'al la fila restando de uno a uno
End If
Next fila
End Sub
Si quiero que sean útiles para todos los libros Excel debería programarlo en la hoja personal
Sub guardar()
If milibro.Path <> "" Then 'path me devulve si el libro fue o no guardado, si es diferente de cadena
vacia
' le digo que guarde
milibro.Save
End If
Next milibro
End Sub
Sub guardar_y_cerrar()
Dim milibro As Workbook 'declaro la variable de tipo libro, para usarlo en el bucle
For Each milibro In Workbooks 'le decimos que por cada libro de excel que halla en la
collecion de libos
If milibro.Name <> ThisWorkbook.Name Then 'mire si libro a libro, el nombre es diferente al libro
activo
'si es diferente le digo que guarde cambios y que lo cierre
milibro.Save 'me cierra todos menos este libro
milibro.Close
End If
Next milibro
ThisWorkbook.Save 'cuando ya a cerrado todos los libros le digo que guarde y cirre
este libro
'si lo cierro antes, el codigo queda a medias
ThisWorkbook.Close
End Sub
Como usar librerías de la apy de Windows. Que detecte quien es la persona que abre el archivo de Excel
Desde Windows tengo siempre:
Nombre usuario
Nombre dominio
Nombre de maquina
Application.Quit
End Sub
Range("a2").Value = nombre.Value
'Range("a2").Value = nombre.Value
Range("1000000").End(xlUp).Offset(1, 0) = nif.Value
'le digo que valla a la celda un millon, que valla al ultimo valor en la celda, que se despave un valor fila
'abajo y cero columnas a la derecha. Todo esto sera igual a nombre.value
End Sub
Para que vuelva a la casilla una ves que me sale el msgbox, agrego nif.SetFocus el cursor vuelve a la
casilla nif
Option Explicit
Private Sub CommandButton1_Click()
If nif.Value <> "" Then
Range("a1000000").End(xlUp).Offset(1, 0).Select
ActiveCell.Value = nif.Value
ActiveCell.Offset(0, 1) = nombre.Value
ActiveCell.Offset(0, 2) = apellido.Value
ActiveCell.Offset(0, 3) = carnet.Value
Else
MsgBox "La casilla Niff es requerida"
nif.SetFocus
End If
End Sub
Para rellenar el combo box de los elementos, sera AddItem. Lo rellenamos al comienzo, ese sera el
evento.
El evento principal de un formulario es el evento click.
Tengo que cambiarlo initialice
Lo que puedo hacer es que sea condicionado el tipo.
Lo ultimo que vemos en este video es como hacer que el formulario no se modal
Option Explicit
Private Sub CommandButton1_Click()
d_personales.Show False
End Sub
VIDEO 37 EVENTOS I
Definición:
Evento: el desencadenante de una acción. Ej. cuando se abra el libro
A plantearse:
1. ¿Quién (objeto) desencadena la acción objeto=libro, objetos, rango de celdas, celdas, botones de
celdas, hojas de gráficos, etc.?
2. ¿Cuándo va a desencadenarse la acción?
Clasificación de eventos
a. De libro, hoja, grafico, aplicación, UserForm.
b. Eventos no asociados a objetos: cuando pasa un tiempo o cuando se pulsa una tecla en particular
VIDEO 38 EVENTOS II.
Monday lunes
Tuesday martes
Wednesday miércoles
Thursday jueves
Friday viernes
Saturday sábado
Sunday domingo
Deshabilitar al menú contextual que aparece con el botón derecho del mouse
Worksheet_BeforeRightClick antes de pulsar el botón derecho
También vemos o repasamos los eventos de formulario
Eventos de gráficos u hoja de chart
Para insertar un gráfico en la hoja se crea un modulo de clase
Eventos no asociados a objetos
o OnTime, a una hora en concreto
o OnKey, con una tecla en partícula
MsgBox ActiveChart.Name
End Sub
Sub Macro1()
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"ARTÍCULOS!R1C1:R39C5", Version:=6).CreatePivotTable TableDestination:= _
"Hoja4!R1C1", TableName:="TablaDinámica3", _
DefaultVersion:=6
Sheets("Hoja4").Select
Cells(1, 1).Select
With ActiveSheet.PivotTables("TablaDinámica3").PivotFields("SECCIÓN")
.Orientation = xlColumnField
.Position = 1
End With
With ActiveSheet.PivotTables("TablaDinámica3").PivotFields("NOMBRE ARTÍCULO")
.Orientation = xlRowField
.Position = 1
End With
ActiveSheet.PivotTables("TablaDinámica3").AddDataField ActiveSheet.PivotTables( _
"TablaDinámica3").PivotFields("PRECIO "), "Suma de PRECIO ", xlSum
End Sub