Вы находитесь на странице: 1из 26

PROGRAMACIÓN EN VBA.

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.

Programación orientada a objetos. POO.


VBA es un lenguaje de programación orientado a objetos.
Propiedades y métodos.
Propiedades. Características del objeto. Dimensiones, especificaciones, etc
Métodos. Funciones del objeto. Que es capaz de hacer
Ejemplo. Un coche
Propiedades: puertas, ruedas, ventanas, etc.
Métodos: arrancar, acelerar, frenar, etc.
Instancia/ instanciación/ ejemplarizar un objeto.
Instancia: Coche 1 Ambos Instancia: Coche 2
Puertas: azules arrancan puertas: amarillas
ruedas: pequeñas aceleran ruedas: grandes
ventanas: pequeñas frenan ventanas: grandes
giran

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.

Chart: grafico en VBA.


Worksheets: en una hoja.
PivotTables: tabla dinámica.

Otro concepto importante.


Los objetos se agrupan en colecciones.
La jerarquía del punto. O nomenclatura
Coche.color=azul
Coche.frenar
Seudo código:
Hay que seguir la jerarquía de objeto que tiene Excel.
Traducido en VBA
Excel.libro.hoja_de_calculo.celda.valor=250
Application.workbooks(“Libro1”).worksheets(“hoja1”).range(“b5”).value=250

Tengo que crear un MODULO


Tengo que generar un procedimiento.
Tengo que escribir el código
Tengo que ejecutarlo con el botón play o F5. Con el cursor dentro del procedimiento.

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

Ahora creamos otro procedimiento: BORRAR, dentro del mismo modulo.


Funciones. Símbolo verde
Métodos. Símbolo verde
Propiedades. Hoja con una mano

Código que borra lo que escribí en la celda


Procedimiento

Sub borrar()
Range("B5").Select
Selection.ClearContents
End Sub

Comentarios en Excel. ‘Esto es una línea de código. Se coloca un apostrofe al comienzo

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

Tipos de datos y variables


Que son y como declararlas.
Tipos de datos.
1. Booleanos.
2. Numero
3. Textos
4. Etc.
Que soporta el lenguaje VBA
Datos de tipo:
1. Byte datos numéricos que van desde 0 al 255
2. Boolean solo pueden tomar dos tipos de valores true y false
3. Integer para almacenar nro. Del tipo entero -32768 al 32767
4. Long nro enteros muy grandes (millones)
5. Single nro decimales (parte decimal corta)
6. Double nro decimales (parte decimal larga)
7. Currency tipo moneda, como salarios
8. Decimal nro decimales (parte decimal larga)
9. Objetc objeto
10. String cadenas de caracteres (palabra/ frase etc.)
11. Variant sin especificar (aún no se tiene claro que se almacenare)
Ahora vamos a ver como se maneja cada uno de ellos

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

3. Como declarar una variable a nivel proyecto.


Cambio el modificador de acceso Dim por public
PROCEDIMIENTO/MODULO/PUBLICA

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

La manera mas rudimentaria de almacenar variables en una matriz es


mirango (0) = 5
mirango (1) = 7
mirango (2) = 4
mirango (3) = 9
mirango (4) = 12
cómo es as Integer es una matriz de números enteros
para ver el valor como siempre se puede emplear
MsgBox mirango (3) =9 en la hoja de Excel.

Si declaro una matriz que almacena 5 valores e invoco la casilla numero 6 hay un ERROR DE DESBORDAMIENTO

Mas forma de declarar una matriz

Dim mimatriz indicando de que posiciones va


Dm mimatriz (0 to 4) As Integer
Para ver las variables vamos a usar la ventana inmediato

Debug.Print mimatriz (3)

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

Para varables aleatorias

mimatriz(i, z) = Math.Round(Math.Rnd * 100)


método RND perteneciente al objeto Math (tienen propiedades y métodos)
un objeto predefinimos math ( solo tiene métodos no propiedades)
RND genera unos aleatorios en entre 0 y 1
Raund es otro método de math que redondea un numero
Y mete cada valor en la matriz en cada posicion que toque a vuelta de bucle
Los bucles se cierran con NEXT Z
NEXT I
Se empleo un bucle anidado z dentro de i
Para leer la información usamos otro bucle for. Para declara una matriz de dos dimensiones:

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 8. Declaración de variables objetos.


Tipos primitivos, nombre, edad, String Integer e
Tipos objetos celda hoja libro etc
Bloques e instrucciones
With end with para dejar el código más limpio
For each bucle para recorrer coleciones de objetos
For each = para cada
Recorrer colecciones

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 WorksheetFunction.Sum(3, 7) para que sume estos valores


MsgBox WorksheetFunction.Sum(Selection) para que sume la selección
Si quiero que salga en la celda activa. No puedo porque no puedo seleccionar y tener una activa a la vez
Lo que pudo hacer es que el valor salga en la celda, por ejemplo:

Range("i10"). Value = WorksheetFunction. Sum(Selection)


Para poder asignarle un botón de teclas, voy a macros, lo localizo “funciones_integradas” en este caso, y en la ventana, en la casilla
opciones, indico una tecla de método abreviado CTRL+ tecla que asigno
El otro objeto importante que tiene funciones predefinidas es el objeto 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:

z = True 'inicio el booleano, si no lo declaro es false


End If

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

If volor = vbYes Then


MsgBox WorksheetFunction.Sum(Selection)
Else
MsgBox "No se realizará la suma"

End If

'Else
' MsgBox "Son solo numeros" 'un else es un y si no

Else
MsgBox WorksheetFunction.Sum(Selection)
End If
End Sub

VIDEO 10- funciones predefinidas


Función inputbox. Introduce información en el programa.

Sub uso_inputbox()

Dim var1 As Integer, var2 As Integer

var1 = InputBox("introduce el primer número")

el prompt es la cadena de mansaje entre comilla “”


var2 = InputBox("introduce el segundo número")

MsgBox "La suma de los números es " & var1 + var2

End Sub

& ampersand

Ejercicio número dos.


Que nos pregunte en qué hora queremos trabajar.
Primero vemos como ocultar las hojas que no queremos que vea el usuario
Para que se inicie el código ni bien abra el libro tengo que agregar un evento.
En este caso tengo que emplear el objeto libro
Para ello solo tengo que trabajar en thisworkbook y configurarlo para que se ejecute al inicio

VIDEO NUMERO 11

El punto donde nos encontramos. Los fundamentos del


leguaje, y conceptos de POO y jerarquía. Los
procedimientos son del tipo sub.

Estructuras de control de flujo. Los condicionales y los bucles.


Se puede dotar al programa de cierta inteligencia. “que tomen decisiones”
Los condicionales son:
 Condicionales
o If - then
o Select - case
Aparecen en java, JavaScript, y otros lenguajes de programación

 Bucles. Permiten repetir un numero determinado o indeterminado de veces.


o Determinados, a priori ya sé cuántas veces que se ejecuta el código.
 For – Next derminto el numero de veces que quiero que recorra
 For – each – next para recurrer coleciones de objetos. Las ojas de un libro, las celdas de un libro, etc
o Indeterminados, no conocemos las veces que se ejecutara el código del interior.
 Do – loop
 While – wend
 Do – until
hay una instrucción, (en la mayoría de lenguajes viejos).
Goto no se aconseja abusar de ella, da lugar a un código espagueti salta de un código a otro y no permite corregirlo
VBA: captura de errores. En tiempo de ejecución. se emplea comúnmente para ello el Goto

Empezamos con: El condicional más usado es el If – then


Si la edad es menor a 18 le dio que ejecute esa línea marcada

En VBA hay dos tipos de


 errores de sintaxis
 De ejecución, por ejemplo, no coinciden los tipos, como querer
almacenar un string en un numero

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

Video 4. Estructura de control de flujo/ bucle while

While “mientras”
Sintaxis:

While (condición del bucle)


Línea 1
.
.
Línea n
Wend

Se repite hasta que la condición del bucle deja de ser verdad


Usamos el objeto cell que permite desplazarse/recorrer por celdas con un bucle while por ejemplo, tiene dos parámetros (fila,”columna”)

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

Código que responde al evento click


Prívate Sub CommandButton1_Click () si quiero que responda a otro evento (para que se inicie la acción) desplego este panel
derecho.

El código desarrollado hasta el video 15 es


Option Explicit

Private Sub CommandButton1_Click()

Dim aleatorio As Integer, minum As Integer

aleatorio = Math.Rnd * 100 'le dije que genere un numero aleatorio del uno al 100

'Debug.Print aleatorio 'para que me imprima en la ventana inmediato

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

If aleatorio > minum Then

MsgBox "El n° es mas alto"

ElseIf aleatorio < minum Then

MsgBox "el n° es mas bajo"


Else
MsgBox "correcto"

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

Range("f2").Offset(fila, 0).Value = "el n° es mas bajo"

VIDEO 15, 16, 17 continuación y final del ejercicio.


En el 16 se hace un control de errores

VIDEO 18. Bucle Do – loop


Dos estructuras de control de flujos
 Do loop while
 Do loop until
Hacer un menú desplegable y cargar con los elementos que tenemos en un rango de celda
La sistaxis es la siguiente:

Private Sub CommandButton1_Click ()

Do While Not IsEmpty (ActiveCell)

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

Hay dos tipos de procedimientos:


 Sub, no devuelve ningún valor
 Function, devuelve valor especifico
Procedimientos sub.
Modularizarían. Muchos procedimientos pequeños.
Sintaxis.
Procesos de tipo sub
Necesitamos aclarar algunos conceptos de POO.
Concepto importante que siempre surge con POO es modularizarían: es mejor dividir un programa en
muchas partes que hacer un único gran programa.
El módulo está dentro de un proyecto.
Proyecto/modulo/procedimiento (sub habitualmente)
La mudularización consiste en hacer varios procedimientos sub en lugar de uno solo

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.

Otro concepto: encapsulación.


A que partes del programa puede acceder el usuario o no.
Si no saben programar no deben tener acceso al código de programación.
Al poner prívate hago que no sea accesible desde afuera, sea un proceso o un valor.

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”.

VIDEO21.TRABAJO CON PROCEDIMIENTOS III


h) Al ocurrir en evento. Es un tema complejo por el cual será dedicado varios videos.
Los eventos son los desencadenes de la acción (cuando queremos que se ejecute el código).
Están en todos los leguajes POO.
El evento o el desencadenante de la acción podría ser cuando se habrá el libro.
Hay cientos de eventos en Excel. Por ello es importante es saber cómo se ejecutan
Ejemplo. Un código que detecte de manera transparente al usuario, para que detecte el nombre
del usuario que abre el libro. Vamos a usar la biblioteca Windows wscript.Network nos informa
el nombre del usuario, de la máquina, el dominio de red bajo el cual se ejecuta el archivo, de
manera transparente para el usuario, es decir sin preguntarle al usuario.

i) Desde la ventana inmediata del editor VBA. Cuando se hacen pruebas.

VIDEO 22. TRABAJO CON PROCEDIMIENTOS IV. Paso de argumentos


Los argumentos. Datos o valores que recibe un procedimiento para utilizarlos en las
instrucciones de su interior.

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

VIDEO23. TRABAJO CON PROCEDIMIENTOS. Practica guiada I


Automatizar una base de datos
Emplear un Combo Box
El evento que quiero es que se abra, cuando se abre el libro

La manera de rellenar un combo box desde código es:

Option Explicit

Private Sub Workbook_Open()

Worksheets("Resultados").c_paises.AddItem "China"

Me diría que agrego china al combo box c_paises de la hoja Resultados

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

Video 24 continuación 2/3


Vamos a usar un bucle FOT EACH para que recorra el objeto celda

Video25 continuación 3/3

Video26 practica guida continuación, más formularios


Las opciones acerca del acceso en una hoja van desde:
-1 -xlsheetVisible visible
0 -xlSheetHidden oculto, pero se puede poner visible desde Excel
2 -xlsheetVeryHidden oculto y no se puede poner en visible. No se activa el menú mostrar

User form formulario de usuario

1. Se lo puede usar de decoración


2. Se lo puede usar para introducir información
3. Otro propósito es crear una aplicación cerrada a modo de panel de control
El formulario se abre de manera modal, de ventana emergente

Para usar un formulario solo busco la opción insertar UserForm1

 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

VIDEO 27. formularios practica guiada V


Se carga el combo box mediante add ítem
Se lo carga mediante el evento initialize
para mostrar un formulario se emplea Show
el evento que cierra el formulario es terminate
para abrir un archivo sin que se ejecute el macro de inicio se abre, el mismo manteniendo apretado shift
VIDEO 28. Procedimientos Function I
A diferencia de los procedimientos tipo sub, devuelven un valor.

Function suma () as Integer digo el tipo de variable


Declaro dos variables de tipo entero
Dim var1 as Integer, var2 as Integer
Var1= 7
Var2 =5
Para que me devuelva el proceso Function tengo que escribir
Suma= var1+var2
No hace su trabajo hasta que es llamado
Puede llamarse desde asistente de funciones de Excel
End function

Sub llamada suma ()


Suma simplemente pongo el nombre del procedimiento para ejecutarlo
End sub

Un procedimiento function tiene parámetros, y a partir del código que se le introduce se le devuelve un
valor u otro.

VIDEO 29 procedimientos function II.


TIPO
NOMBRE APELLIDO SALARIO BASE VENDEDOR VENTAS COMISION TOTAL
Jose lopez 1200 1 500 255
antonio martinn 1500 2 900 600
Ana gomez 1800 2 250 512.5
Maria gomzales 1150 3 700 647.5

=SI(D2=1;(C2+E2)*15%;SI(D2=2;(C2+E2)*25%;(C2+E2)*35%))

Lo mismo mediante VBA

Function calculo_salario(salario As Double, tipo_vendedor As Double, ventas As Double) As Double


'especifico el tipo de parámetro que recibe
'ya declaré el proceso function y los tipos de variables
'ahora tengo que trasladar lo que hice con la función si
If tipo_vendedor = 1 Then
calculo_salario = (salario + ventas) * 0.15
ElseIf tipo_vendedor = 2 Then
calculo_salario = (salario + ventas) * 0.25
ElseIf tipo_vendedor = 3 Then
calculo_salario = (salario + ventas) * 0.35
End If
End Function

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.

VIDEO 30. Tecinas I.


Operaciones útiles con rangos.
Como copiar rangos desde VBA
Copiar el valor de una celda:
Range("a1").Copy Range("f5")
Desde otro libro:
Workbooks("video30").Worksheets("hoja1").Range("a1").Copy Workbooks("Libro2").Worksheets("hoja3").Range("g10")
Para que el código sea mas corto se crean variables tipo objeto

Dim celda1 As Range, celda2 As Range 'declaro un objeto tipo celda


Set celda1 = Workbooks("video30").Worksheets("hoja1").Range("a1")
Set celda2 = Workbooks("Libro2").Worksheets("hoja3").Range("h8")
celda1.Copy celda2

ahora quiero copiar un rango no solo una celda


Range("a1:a6").Copy Range("i3")

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")

Para dejar afuera celdas , o a partir de


Range("a2", Range("a2").End(xlDown)).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

Range("a2", Range("a100000").End(xlUp)).Cut Range("i3") 'sustituyo el copy por el 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()

'li evaluo con un condicional if y las propiedades para dectar si es o no texto

If Application.IsText(Range("a2")) Then

MsgBox "Es texto"


End If

End Sub

Mas completo por si no encuentra ese valor en la celda

Option Explicit

Sub detecta_numero_texto()

'li evaluo con un condicional if y las propiedades para dectar si es o no texto

If Application.IsText(Range("a2")) Then 'istext es una prodiedad del objeto application

MsgBox "Es texto"

ElseIf IsNumeric(Range("a2")) Then

MsgBox "es numerico"

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

Dim micelda As Range, resultado As Boolean 'se declara la variable resultado

For Each micelda In Selection

If Application.IsText(micelda) = True Then ' que mire si la seleccion es un texto

resultado = True

micelda.Interior.Color = vbRed
End If

Next micelda

If resultado = True Then

MsgBox "hay texto en tu rango"

Else

MsgBox "no hay texto en tu rango"

End If

End Sub

Algunas prubas con las filas, sea para contarlas o para seleccionarlas

Sub prubas()

MsgBox ActiveSheet.UsedRange.Rows.Count 'me devuelve el numero de filas

'Rows(5).Select 'seleciono la fila numero 5

End Sub

Sub prueba()

MsgBox Application.WorksheetFunction.CountA(Range("a2")) 'uso la funcion excel de contarA, si hay


algo me devuelve un 1
'si no hay nada me devuelve un cero, en codigo es countA

End Sub

PARA ELIMINAR LAS FILAS REPETIDAS


Sub elimina_filas()

Dim ultimafila As Long, fila As Long 'declaro ambas variables

ultimafila = ActiveSheet.UsedRange.Rows.Count 'le digo cual es la ultima fila

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

If Application.WorksheetFunction.CountA(Rows(fila)) = 0 Then 'le digo que si esta vacia

Rows(fila).Delete ' si pasa eso le digo que la borre si es cierto

End If
Next fila
End Sub
Si quiero que sean útiles para todos los libros Excel debería programarlo en la hoja personal

VIDEO33. Técnicas IV. Guardar libros y validar datos


Cuando trabajo en una hoja, igual que con control G

Sub guardar()

Dim milibro As Workbook

For Each milibro In Workbooks

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

Private Sub Workbook_Open()

Dim valida As Object

Set valida = CreateObject("WScript.network")

If valida.UserName <> "Javier" Then

MsgBox "lo siento. no estas validado"

Application.Quit

End Sub

Si quiero agregar mas seguridad lo agrego con un end valida.computername<>”juan_portatil”

VIDEO 34. FORMULARIO DE USUARIO. UserForms


La utilidad es crear una interfas para manejar la hoja de cálculo,
Para crearlo, empleo UserForm
No se tiene que confundir la propediedad name con caption
Name: nombre es el nombre interno y se usa en el código
Caption: subtitulo es la que aparece en el formulario
Desde código se puede medicar las dimensiones del formulario
Vamos a usar
Etiquetas, desplegables, botones de radio, etc
Casillas de texto para que el usuario lo complete
Para que me salte de una casilla de texto a otra con tabulador tengo que emplear la propiedad indice de
tabulación. La propiedad es TabIndex, en donde coloco el número de orden (1, 2, 3, 4, 5, …, n)
El tipo de carnet no va con un cuadro de texto sino con un desplegable
Con el género se usará un botón de radio
El objeto desplegable tiene un método additem que se utiliza para rellenar el combo box
Además le agregamos un botón para que cambie o se valla posicionando debajo del otro

Ahora empiezo a programar

Para tener cierrta idea de como se va a encar podes ver eso:

Range("a2").Value = nombre.Value

La celda a2 tendrá el valor que se completa en la casilla nombre

'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

La columna del NIFF va ser obligatoria

Si quiero que si o si se complete es decir que se requerida debe ir con un condicional:

Private Sub CommandButton1_Click()

If nif.Value <> "" Then


Range("1000000").End(xlUp).Offset(1, 0) = nif.Value
Else
MsgBox "la casilla Niff es requerida"
End If

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

VIDEO35.UserForm II. Formularios de usuarios

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.

Las maneras de ejecutar el formulario serian


Por un botón o abriendo desde un botón en la hoja
Los métodos de formularios
Show mostrar
Hide ocultar
Load cargar
Unload descargar
Se lo puede poner como un evento que se inicie con el Excel
Se puede maximizar el formulario hasta el punto que tape todo el Excel
El ancho es igual al ancho del Excel
Al cerrar el formulario se cierra el Excel

VIDEO 36 UserForm IV.

que el formulario aparezca a pantalla completa


width ancho
heigh alto

Private Sub UserForm_Initialize()


tipo.AddItem "No tiene"
tipo.AddItem "Tipo A"
tipo.AddItem "Tipo B"
tipo.AddItem "Tipo C"
tipo.AddItem "Tipo D"
Me.Width = 400
Me.Height = 225
End Sub

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

VIDEO 39. Gráficos I


Tipos de gráficos que hay
1. Incrustados. Se crean en la misma hoja de los datos.
2. En hoja independiente
Se debe tener en cuenta la gerarquia de objetos.
Para los incrustados
 Application que hace referencia a Excel
o Workbook al libro
 Worsheet a la hoja de calculo
 ChartObject a la colección de gráficos
o chart al grafico en particular
 chartTitle una propiedad del grafico como ejemplo

para los gráficos en hojas no están las jerarquías Worksheets ni ChartObject


para saber el nombre del grafico
Sub maipulagraficos()

MsgBox ActiveChart.Name

End Sub

VIDEO 40. Gráficos II


Como eliminar los gráficos que tenemos en una hoja.
En hojas independientes. Cuando elimino un grafico en una hoja aparte me sale una consulta de si es
verdad que se quiere eliminar, por ello también lo desactivamos.
Creamos un botón que cambia el aspecto del grafico
Vamos a usar las propiedades
Activechart
With end with

Después de esto queremos manipular un gráfico desde otra ventana.


Para manipular varios gráficos a la vez vamos a usar el bucle for each sirve para recorrer colecciones de
objetos. Gráficos en el libro activo o en las hojas.

VIDEO 41. Tablas dinámicas


Zona Zona
filtro columnas
Zona flas Zona
datos o
totales

Los objetos que aparecen en una taba dinámica


 PivotCaches la tabla que se va armando en memoria momentáneamente
 PivotTables la colección de tablas dinámicas
 PivotFields son todos los objetos que pueden tener una tabla
 PivotItems representan cada objeto que hay en un campo

 Create PivotTable es el objeto que usa VBA para crear tablas

Vamos a proceder, con la grabadora

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

Vamos a incluir controles para que una persona lo maneje


Casillas de verificación

VIDEO 42. Tablas dinámicas II


VIDEO 43. Interacción con aplicaciones

Вам также может понравиться