Macros
Macros
Puede usar también, <ALT> +<F8>, luego seleccionar la macro y hacer clic en
<Modificar>.
Desde <[Link]
VBA página 1
Programación Orientada Objetos
miércoles, 29 de julio de 2020 9:58
Los objetos en Excel están constituidos por Celdas, Rangos, Hojas, Libros,
Gráficos, Tablas, archivos externos, etc.
Los objetos, refiriéndonos a Excel, poseen cuatro características empleados
en la codificación de un programa: Propiedades de los objetos, Métodos para
manipularlos, Eventos que causan la manipulación de los mismos y, Colecciones
o Clases a las que pertenecen los objetos.
Propiedades
Para hacer referencia a las propiedades mediante los programas en VBA, se usa
la sintaxis:
[Link]
Ejemplo:
Range("A5").Name Aquí se hace referencia al nombre del objeto Range de la
celda A5.
Métodos
Un método es una acción, un procedimiento (un hilo), que tiene efectos sobre
un objeto.
Ejemplo:
Range("A5").Select Aquí se ejecuta el método Select, que permite activar
la celda A5 y ponerla en disponible para cualquier otra operación.
Desde <[Link]
VBA página 2
Eventos
miércoles, 29 de julio de 2020 14:35
Nota
No se preocupe si no está seguro de qué hace cada uno de los elementos de la
rutina del controlador de eventos. Por ahora, concéntrese en la línea del
medio del código, que comunica a Excel que organice las ventanas utilizando
el estilo de cascada. Puede obtener el mismo resultado utilizando los
comandos de menú de Excel (menú Ventana, comando Organizar, sub comando
Cascada). Sin embargo, si se trata de una acción que desea que se ejecute
cada vez que ocurra un evento determinado, puede utilizar el lenguaje VBA
para que se ejecute automáticamente y así ahorrarse el trabajo.
Colecciones
Una colección es un grupo o conjunto de objetos contenidos en otro objeto
cuyas propiedades son comunes a los objetos componentes.
Puesto que un libro contiene una o más hojas de cálculo, podemos decir que un
libro es una colección de hojas de cálculo. Así las cosas, podemos ejecutar
algún método sobre esta colección a fin de realizar la misma acción sobre
todas ellas. Por ejemplo, seleccionar tres hojas y darle un determinado
formato.
En el siguiente ejemplo, se ha programado la opción de imprimir la ruta donde
se encuentra el archivo. Como se puede ver (o lo podrá comprender cuando
desarrollemos la instrucción FOR …NEXT), la operación de añadir la dirección
se realiza sobre tres hojas del libro.
For i = 1 to 3
Worksheets(i).[Link] = Path
Next i
VBA página 3
Next i
Desde <[Link]
VBA página 4
Ventanas del Editor VBA
miércoles, 29 de julio de 2020 15:35
Ventana Propiedades
Generalmente debajo de la ventana del Explorador de proyectos, está la
ventana de Propiedades, que se utiliza para examinar y modificar las
distintas propiedades asociadas al objeto seleccionado. La única propiedad
que suele estar disponible para los módulos es el nombre. Las hojas de
cálculo tienen propiedades adicionales que se pueden modificar, como
StandardWidth y DisplayPageBreaks, entre otras.
Para modificar las propiedades de un libro u hoja, debemos seleccionarlo
primero y luego hacer clic en la propiedad deseada y luego elegir entre las
opciones disponibles. Por ejemplo si se desea ocultar la hoja cuyo nombre es
Hoja1, selecciónela primero, luego en la ventana propiedades, haga clic en la
propiedad <Visible> y seleccione la opción <xlSheetHidden>
VBA página 5
propiedad <Visible> y seleccione la opción <xlSheetHidden>
Ventana de Código
La ventana de Código es la ventana que dispone de mayor tamaño en el Editor e
incluye en el lado superior, dos cuadros de lista desplegables. El cuadro de
lista del lado izquierdo (cuadro de Objeto) se utiliza para seleccionar el
objeto en el que se quiere trabajar. Cuando se trabaja sólo con código, el
cuadro muestra el objeto General predeterminado. El cuadro de lista de la
derecha (cuadro de Procedimiento) se utiliza para seleccionar macros
individuales del módulo actual. Según se agreguen o eliminen macros en el
módulo, se agregarán y eliminarán en el cuadro Procedimiento.
Desde <[Link]
VBA página 6
Variables
miércoles, 29 de julio de 2020 15:38
Nota:
El nombre de una variable puede estar escrito en minúsculas, mayúsculas o
combinarlas a fin de darle cierto sentido respecto a su contenido.
Sentencia DIM
Para declarar una variable se usa la sentencia DIM. Esta declaración se
coloca al principio de las secciones o módulos.
Sintaxis:
DIM NombreDeVariable As TipoDeDatos
DIM NombreVar1, NombreVar2, … As TipoDeDatos
Tipos de variable
La tabla siguiente muestra los tipos de datos compatibles, incluyendo el
tamaño de almacenamiento en memoria y el intervalo en el cual pueden variar.
Tipo de datos Tamaño de Intervalo
almacenamiento
Byte Entero de un byte 0 a 255
Bolean Lógico de dos bytes True o False
Integer Entero de dos bytes -32,768 a 32,767
Long Entero largo de 4 -2,147,483,648 a 2,147,483,647
(entero bytes
largo)
Single Decimal de 4 bytes -3,402823E38 a –1,401298E-45 para
(coma valores negativos; 1,401298E-45 a
flotante/ 3,402823E38 para valores positivos
precisión
simple)
Double Decimal de 8 bytes -1.79769313486231E308 a
(coma -4,94065645841247E-324 para valores
flotante/ negativos; 4,94065645841247E-324 a
precisión 1,79769313486232E308 para valores
doble) positivos
Currency Entero de 8 bytes -[Link].477,5808 a
VBA página 7
Currency Entero de 8 bytes -[Link].477,5808 a
(entero a [Link].477,5807
escala)
Decimal Números reales con +/-[Link].[Link].950.3
decimales hasta de 28 35 sin punto decimal;
dígitos (14 bytes) +/-7,9228162514264337593543950335 con
28 posiciones a la derecha del signo
decimal; el número más pequeño distinto
de cero es
+/-0,0000000000000000000000000001
Date Usado para fechas de 1 de enero de 100 a 31 de diciembre de
8 bytes 9999
Object 4 bytes Cualquier referencia a tipo Object
String Usado para datos de Desde 0 a 2.000 millones
(longitud texto de 10 bytes
variable)
String Como el anterior pero Desde 1 a 65.400 aproximadamente
(longitud de longitud fija
fija)
Variant Usado como tipo de Cualquier valor numérico hasta el
(con números) dato genérico de 16 intervalo de un tipo Double
bytes
Variant 22 bytes + longitud El mismo intervalo que para un tipo
(con de la cadena String de longitud variable
caracteres)
Definido por Número requerido por El intervalo de cada elemento es el
el usuario los elementos mismo que el intervalo de su tipo de
(utilizando datos.
Type)
Ejemplos
DIM A, B As Integer A y B serán usados como enteros
DIM Xtot, Zdat As Double Xtot y Zdat serán usados como variables
reales
DIM XTitulo, Nom01, Nom02 As Usados para contener datos literales
String
DIM N, Epsi As Variant Puede contener datos numéricos o literales
Clases de variables
Las variables pueden ser: Locales, Públicas o Estáticas
Variables Locales
Las variables Locales son aquellas que se declaran dentro de un módulo o
procedimiento y sólo pueden ser utilizadas en éste. Éstas dejan de existir
una vez que el procedimiento termina su ejecución. Se pueden usar en otros
módulos o procedimientos pero sus características nada tienen que hacer con
la declaración dada en otro módulo o procedimiento. Para declararlas se debe
usar la sentencia DIM.
Por ejemplo:
Sub procedimiento()
VBA página 8
Sub procedimiento()
Dim nDat As Integer
Dim Cadena As String
Sentencias ....
End Sub
Variables Públicas
Si se quiere que una variable esté disponible para todos los procedimientos
de todos los módulos VBA de un proyecto, se la debe definir a través de la
sentencia PUBLIC (y no DIM).
Por ejemplo:
Variables Estáticas
Si se desea que una variable definida en un procedimiento conserve su valor
una vez terminado éste, e ingresado a otro procedimiento, ésta se debe
definir a través de la sentencia STATIC.
Por ejemplo:
Sub Procedimiento()
Static nDat As Integer
[ Sentencias ...]
End Sub
Option Explicit
La sentencia Option Explicit permite que el programa se detenga cada vez que
VBA encuentre una variable que no ha sido definida. Esto es de gran utilidad
cuando se usan muchas variables ya que nos permite identificar rápidamente
errores o uso no deseado en el nombre de la variable. Esta sentencia se debe
escribir al comienzo del módulo.
Desde <[Link]
VBA página 9
Constantes & Módulos
miércoles, 29 de julio de 2020 15:43
Constantes
A diferencia de la variables, cuyo valor cambia al ejecutarse un
procedimiento, hay valores que no cambian durante la ejecución de un
procedimiento, éstos valores se denominan Constantes. Las constantes se
definen a través de la sentencia Const.
Por ejemplo;
Const Nivel As Integer
Las constantes también pueden declararse como Públicas para que estén
disponibles en todos los procedimientos de todos los módulos, esto se hace a
través de la sentencia PUBLIC
Módulos
Un módulo es un ambiente, es un entorno de trabajo compuesto por sentencias
de declaración de variables y por uno o más procedimientos.
Estando en el Editor del Visual Basic, para disponer de un Módulo, se debe
usar la siguiente secuencia de comandos: <Insertar> - <Módulos>, como se
indica en la siguiente imagen.
VBA página 10
Luego de esta acción, se podrá observar, en la ventana de proyectos y dentro
del libro en uso, una carpeta con el nombre Módulo. Dentro de ella se
insertarán todos los procedimientos que conforman dicho módulo.
Desde <[Link]
VBA página 11
Procedimientos
miércoles, 29 de julio de 2020 15:46
Procedimiento Privado
Un procedimiento privado sólo es accesible por otros procedimientos dentro
del mismo módulo.
Su sintaxis es:
Procedimiento Público
Un procedimiento público es accesible por todos los procedimientos de todos
los módulos VBA de un proyecto,
su sintaxis es:
Procedimiento Estático
Para que las variables de un procedimiento se conserven una vez terminada su
ejecución, éste debe definirse como Estático:
Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
End Sub
Es equivalente a :
VBA página 12
ésta es la instrucción Exit Sub. Por ejemplo, si tenemos el siguiente
procedimiento :
Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
Exit Sub
[Sentencias]
End Sub
Por ejemplo:
Sub Procedimiento1(argumento1,argumento2,.....)
[Sentencias]
indice= ........
Call Proced2(indice)
[Sentencias]
End Sub
Desde <[Link]
VBA página 13
Argumentos
miércoles, 29 de julio de 2020 15:48
Ejemplo 1
XTot = 120
SumaTot = SumaTot + Num01
XTitulo = "Cuadro de ventas consolidadas"
Ejemplo 2
X1 = "Hola Mundo !!!"
X2 = " Buenos días …."
Salida = X1 + X2 + "Hasta luego …"
Ejemplo 3
Tasa = 0.19
Cantidad = 120
PrecioUnit = 25.80
MontoNeto = Cantidad * PrecioUnit – Cantidad * PrecioUnit * Tasa
Nota 1:
En los dos ejemplos anteriores, algunas variables reciben un valor dentro del
programa. Toda vez que se ejecute el programa, dichas variables siempre
VBA página 14
programa. Toda vez que se ejecute el programa, dichas variables siempre
usarán los mismos valores y, como tal, aquellas que dependen de ellas también
contendrán los mismos resultados. Para que dichas variables tomen otros
valores, es necesario ingresarlos desde otros programas o procedimientos, o
desde el teclado.
Nota 2:
En todas las sintaxis de instrucciones que en adelante, se tenga, el uso de
corchetes "[…]" nos indicará que su contenido es opcional.
Desde <[Link]
VBA página 15
Ingreso / Resultados
miércoles, 29 de julio de 2020 15:53
En VBA los datos se ingresan usando el método InputBox(…) el cual abre una
ventana de diálogo. La sintaxis de este método es:
expresió[Link](Prompt[,Title][,Default][,XPos]
Donde
Nota:
Todos los ejemplos de aquí en adelante, pueden ser probados copiando hacia la
ventana de código, correspondiente a un módulo. Si no hubiera ningún módulo,
haga clic en el comando <Insertar>, luego en <Modulo>.
Nota:
Para ejecutar un procedimiento contenido en un módulo, haga que el cursor se
encuentre al interior del procedimiento a ser ejecutado; luego haga clic en
Ejemplo 4
En este ejemplo se pide ingresar un número y que si no se digita, la variable
VBA página 16
En este ejemplo se pide ingresar un número y que si no se digita, la variable
Num recibirá el valor que se asume, 120. La ventana de diálogo tendrá por
título "Ingreso de datos", se desplegará a partir de las coordenadas (4830,
2210) de la pantalla (en pixels). En la siguiente instrucción no se coloca un
título, si no se digita una expresión, la variable texto contendrá "Hola
Perú" y cambiará de posición.
Sub datos()
Num = InputBox("Ingresa un número", "Ingreso de datos", 120, 4830, 2210)
Texto = InputBox("Hola Perú", , 5, 1200, 4800)
End Sub
donde
VBA página 17
de un producto y luego calcular el monto neto, después de aplicar el impuesto
del IGV.
Ejemplo 5
Sub Ventas01
'
Dim PrUnit, Neto As Double
Dim Cantidad As Integer
Cantidad = InputBox ("Ingrese la cantidad")
PrUnit = InputBox("Ingrese el precio unitario")
IGV = InputBox("Valor del IGV", ,0.18)
Neto = Cantidad*PrUnit-Cantidad*PrUnit*IGV
MsgBox("El monto neto es: "+Chr(13)+Chr(10)+Chr(13)+Chr(10)&Neto)
End Sub
Ejemplo 6
Sub Botones
Dim Msg, ComboBotones, Título, Ayuda, Ctxt, Respuesta, MiCadena
Msg = "¿Desea continuar?"
ComboBotones = vbYesNo + vbCritical + vbDefaultButton2 ' Define los
botones.
Título = "Prueba de la función MsgBox con botones" ' Define el título.
Ayuda = "[Link]" '
Define el archivo de ayuda.
Ctxt =
1000
' Define el tema
' el contexto
Res = MsgBox(Msg, ComboBotones, Título, Ayuda, Ctxt) ' Muestra el
mensaje.
End Sub
Desde <[Link]
VBA página 18
Sentencia Condicional
miércoles, 29 de julio de 2020 16:22
Sintaxis
If ExpresionCondicional Then
[ Sentencias 1 ]
Else
[ Sentencias 2 ]
End If
Ejemplo 7
En el siguiente procedimiento, se imprime en pantalla el cuadrado o el cubo
del valor ingresado por teclado, según que éste sea un valor menor o mayor o
igual a 10.
Sub Potencia
x = InputBox("Ingresa un número entre 0 y 500")
If x < 10 Then
ValorCalc =x^2
Else
ValorCalc = x^3
End If
MsgBox(ValorCalc)
End Sub
Nota:
Observe que en este procedimiento no hemos declarado ninguna variable. Esto
es correcto también; sin embargo en un procedimiento formal y bastante
grande, se recomienda hacerlo.
Nota
La siguiente tabla muestra un conjunto de funciones matemáticas, estadísticas
y de texto que pueden ser usadas en un procedimiento.
En esta tabla el rango de los datos numéricos se denomina DATO. La celda C3
contiene un número aleatorio entre 0 y 1. A14 = "Ilmer", B14 = "Cóndor", A15
= "Ilmer Cóndor Espinoza", A16 = "XP203".
VBA página 19
Ejemplo 8
Escriba un código que al ingresar dos números, los imprima en forma ordenada
(creciente)
Sub Ordena01()
Dim Num1, Num2 As Integer
Num1 = InputBox("Ingrese el primer número")
Num2 = InputBox("Ingrese el segundo número")
If Num1 < Num2 Then
MsgBox ("Numero menor: " & Num1 & Chr(13) + Chr(10) & "Número mayor: " &
Num2)
Else
MsgBox ("Numero menor: " & Num2 & Chr(13) + Chr(10) & "Numero mayenor: " &
Num1)
End If
End Sub
Ejemplo 9
Codificar un procedimiento que lea tres números e imprima en pantalla en
forma creciente de sus valores. Como se puede apreciar, la lectura del código
no es tan simple; requiere de una dosis de concentración. Más adelante
usaremos arreglos para ordenar grandes series.
VBA página 20
usaremos arreglos para ordenar grandes series.
Sub ordena02()
Dim Num1, Num2, Num3 As Double
Num1 = InputBox("Ingresa el primer número")
Num2 = InputBox("Ingresa el segundo número")
Num3 = InputBox("Ingresa el tercer número")
If Num1 < Num2 Then
If Num2 < Num3 Then
MsgBox ("Los números ordenados: " + Chr(13) + Chr(10) & Num1 &
Chr(13) + Chr(10) & Num2 & Chr(13) + Chr(10) & Num3)
Else
MsgBox ("Los números ordenados: " + Chr(13) + Chr(10) & Num1 &
Chr(13) + Chr(10) & Num3 & Chr(13) + Chr(10) & Num2)
End If
Else
If Num2 < Num3 Then
If Num1 < Num3 Then
MsgBox ("Los números ordenados: " + Chr(13) + Chr(10) & Num2 &
Chr(13) + Chr(10) & Num1 & Chr(13) + Chr(10) & Num3)
Else
MsgBox ("Los números ordenados: " + Chr(13) + Chr(10) & Num2 &
Chr(13) + Chr(10) & Num3 & Chr(13) + Chr(10) & Num1)
End If
Else
MsgBox ("Los números ordenados: " + Chr(13) + Chr(10) & Num3 & Chr(13)
+ Chr(10) & Num2 & Chr(13) + Chr(10) & Num1)
End If
End If
End Sub
Sintaxis
Ejemplo 10
El siguiente procedimiento, luego de leer un valor desde el teclado, emite un
mensaje.
Sub SelCase()
Dim Indice
Indice = InputBox("Ingrese un número entre 1 y 10")
Numero = 8
Select Case Indice
VBA página 21
Select Case Indice
Case 1 To 4
MsgBox ("Entre 1 y 4")
Case 5, 7, 9
MsgBox ("Entre 5 y 9, pero no 6 ni 8")
Case 6
MsgBox ("Es un número igual a 6")
Case Else
MsgBox ("Es un número 8 ó 10")
End Select
End Sub
Ejemplo 11
El siguiente procedimiento genera dos números aleatorios, los multiplica por
una constante y los emite en orden creciente.
Sub PMaxMin()
Dim Num1, Num2, Num3 As Double
Num1 = Rnd() * 8273
Num2 = Rnd() * 8273
MsgBox ("Los datos son: " & Num1 & " y " & Num2)
Select Case Num1
Case Is < Num2
MsgBox (Num1 & " < " & Num2)
Case Else
MsgBox (Num2 & " < " & Num1)
End Select
End Sub
Desde <[Link]
VBA página 22
Sentencia Repetitiva
miércoles, 29 de julio de 2020 16:25
Sintaxis
Para ello requiere de una variable que funciona a modo de índice (VarIndice)
el cual empieza en un primer valor (ValInit), por cada iteración que se
realiza, se incrementa en una determinada cantidad (Incr), hasta llegar al
extremo (ValFinal), después del cual, continua con la siguiente sentencia,
debajo de Next. Si el incremento es la unidad, no se usa STEP Incr
Ejemplo 12
Se desea obtener la suma de los cuadrados de los 20 primeros números de 1 a
20.
Definiremos las siguientes variables:
I : Para la variable índice
Suma : Para contener la suma: Suma = Suma + I.^2
Sub Suma01()
Dim I As Variant
Dim Suma As Double
Suma = 0
For I = 1 To 20
Suma = Suma + I^2
Next
MsgBox("La suma de los primeros 20 números es: " & Suma)
End Sub
Ejemplo 13
Los siguientes datos corresponden a las superficies ocupadas por un conjunto
de viviendas recién construidas. Se trata de determinar si el precio de la
vivienda está en función a la superficie y en qué grado de correlación está.
Los datos son los siguientes:
Área Valor
(Y) (X)
100 40
140 49
150 54
150 56
130 48
120 46
100 41
VBA página 23
160 56
180 62
140 50
120 45
Se trata de obtener las siguientes estadísticas: El promedio de superficie
por vivienda y el valor promedio, el modelo lineal que exista.
Para ello tenemos las siguientes fórmulas: La ecuación a ser estimada es:
Sintaxis
WHILE Condicion
[ Sentencias ]
WEnd
Al interior del bucle del While debe haber alguna forma de actualizar la
VBA página 24
Al interior del bucle del While debe haber alguna forma de actualizar la
"Condicion" a fin de permitir que el While termine en algún momento.
Ejemplo 14
El siguiente ejemplo permite ingresar una serie de números hasta presionar
<Enter>, en cuyo caso imprime la suma de todos ello.
Sub DoWhile()
Ix = Val(InputBox("Ingeresa un número; para terminar, presiona <Enter>"))
Suma = 0
While Ix > 0
Suma = Suma + Ix
Ix = Val(InputBox("Ingeresa un número; para terminar, presiona <Enter>"))
Wend
MsgBox ("La suma obtenida es = " & Suma)
End Sub
Ejemplo 15
Escriba un procedimiento que permita extraer la primera palabra dentro de un
texto.
Solución
Leeremos carácter por carácter hasta encontrar un espacio en blanco, luego se
imprimirá lo extraído
El código es el siguiente:
Sub dd()
Dim cadena As Variant
cadena = "Condor Espinoza, Ilmer"
x = Mid(cadena, 1, 1)
I = 1
xc = ""
While x <> " "
xc = xc + x
I = I + 1
x = Mid(cadena, I, 1)
Wend
MsgBox xc
End Sub
Ejemplo 16
Escriba un procedimiento que al ejecutarse realice las operaciones básicas de
una calculadora; es decir, sume (+), reste (-), multiplique (*), divida (/) y
eleve a una potencia (^).
El código es el siguiente:
VBA página 25
Sub Calculator()
Dim Op As Double
' Lee el primero valor
Op = Val(InputBox("Ingrese un número"))
' Lee el código de operación
Code = InputBox("Codigo de operación")
' Va a iterar mientras el valor de Code no sea "=".
While Code <> "="
Select Case Code
Case "+"
Op = Op + Val(InputBox("Digite el número"))
Case "-"
Op = Op - Val(InputBox("Digite el número"))
Case "*"
Op = Op * Val(InputBox("Digite el número"))
Case "/"
Op = Op / Val(InputBox("Digite el número"))
Case "^"
Op = Op ^ Val(InputBox("Digite el número"))
Case Else
MsgBox ("Código inválido. Reinicie todo...")
End
End Select
Code = InputBox("Código de operación")
Wend
MsgBox ("Resultado = " & Op)
End Sub
Sintaxis:
DO
[ Sentencias ]
LOOP UNTIL Expresión_de_Comparación
Observación:
Tome nota de la diferencia en el uso de la instrucción FOR, WHILE y DO. El
uso de cada una de ellas es diferente y se emplea en diferentes contextos.
La instrucción FOR se emplea para repetir un bucle un número determinado de
veces.
La instrucción WHILE se emplea para repetir el bucle siempre que la condición
se cumpla.
La sentencia DO es lo mismo que WHILE, excepto que While pregunta antes de
ejecutar el bucle, mientras que Do ejecuta el bucle y luego verifica la
condición.
VBA página 26
Ejemplo 17
Reescriba el procedimiento de la calculadora usando la instrucción DO … Loop
Until
Como se puede apreciar, sólo cambiamos la instrucción While y la condición la
hemos pasado al final, luego de leer el código de operación para una
siguiente operación.
Sub Hasta()
Dim Op As Double
Op = Val(InputBox("Ingrese un número"))
Code = InputBox("Codigo de operación")
Do
Select Case Code
Case "+"
Op = Op + Val(InputBox("Digite el número"))
Case "-"
Op = Op - Val(InputBox("Digite el número"))
Case "*"
Op = Op * Val(InputBox("Digite el número"))
Case "/"
Op = Op / Val(InputBox("Digite el número"))
Case "^"
Op = Op ^ Val(InputBox("Digite el número"))
Case Else
MsgBox ("Código inválido. Reinicie todo...")
End
End Select
Code = InputBox("Código de operación")
Loop Until Code = "="
MsgBox ("Resultado = " & Op)
End Sub
Ejemplo 18
El siguiente código permite asignar a dos variables dos valores ingresados
como una cadena de caracteres. Para ello, mediante el uso de While, almacena
todos los caracteres en una variable. Luego otro While para extraer los
caracteres del segundo valor.
El código es el siguiente:
Sub ee()
cadena = "120, 3500.45"
Cad = ""
I = 1
Xc = Mid(cadena, 1, 1)
While Xc <> ","
Cad = Cad + Xc
I = I + 1
Xc = Mid(cadena, I, 1)
Wend
Valor1 = Val(Cad)
Cad = ""
I = I + 1
Xc = Mid(cadena, I, 1)
While Xc <> "" Or I < Len(cadena)
VBA página 27
While Xc <> "" Or I < Len(cadena)
Cad = Cad + Xc
I = I + 1
Xc = Mid(cadena, I, 1)
Wend
Valor2 = Val(Cad)
MsgBox Valor1 & " " & Valor2
End Sub
Desde <[Link]
VBA página 28
Arreglos
miércoles, 29 de julio de 2020 16:39
Cuando el arreglo está agrupado por fila o columna se tiene un vector, desde
el punto de vista matemático, mientras que está agrupado por un conjunto de
filas y columna, se tiene una matriz.
En la declaración
VBA página 29
DIM Datos(80, 5), C(8, 5) , AS Integer
Nota:
Si en el caso del arreglo X, se intenta usar el elemento X(11), se estará
usando un subíndice fuera de límite. Esto significa que los arreglos deben
ser declarados tomando en cuenta su máximo tamaño.
Ejemplo 19
Escriba Un programa que lea un conjunto de 10 datos numéricos, los almacene
en un arreglo unidimensional y luego los imprima.
Solución
Sea Datos el nombre del arreglo. Supondremos que tiene 50 elementos. Usaremos
la sentencia DIM para definir el arreglo como de tipo Integer.
Ya que se trata de introducir 10 datos, usaremos For … Next para ingresar los
datos repetidamente. La variable de conteo en el For será I, no será
necesario definirla.
Usaremos FOR ::: NEXT para leer los datos y otro para imprimir los valores
leídos. Aunque bien podríamos leer e imprimirlos dentro del mismo FOR … NEXT.
Usaremos a InputBox(…) como función para ingresar los datos
El código es el siguiente:
Sub Arreglos01()
Dim Datos(10) As Integer
' Lectura de datos
For I = 1 To 10
Datos(I) = InputBox("Ingrese el dato: ")
Next
' Impresión de los datos
MsgBox ("Estos son los datos leídos:")
For I = 1 To 10
MsgBox (Datos(I))
Next
End Sub
Ejemplo 20
Escriba un procedimiento que permita obtener la suma y el promedio de un
conjunto de n datos, leídos desde el teclado.
Solución
Ante todo, se debe ingresar los datos a ser procesados.
Como en el ejemplo anterior, usaremos Datos como nombre del arreglo que
recibirá los datos ingresados; usaremos también la variable Suma que
contendrá la suma de todos los datos ingresados y Prom, la variable que
contenga el promedio.
Luego de leer los datos, usaremos otro FOR … NEXT para calcular la suma de
los elementos; aunque se podría realizar la suma a la vez que se van leyendo
los datos.
VBA página 30
Sub Arreglos02()
Dim Datos(10) As Double
Dim Suma, Prom As Double
Suma = 0
N = InputBox("Numero de datos a ser leídos")
For I = 1 To N
Datos(I) = InputBox("Ingrese el dato: ")
Next
' Obtención de la suma
For I = 1 To N
Suma = Suma + Datos(I)
Next
' Cálculo del promedio
Prom = Suma/N
' Impresión de resultados
MsgBox("La suma es: " & Suma & " , el promedio es: " & Prom)
End Sub
Ejemplo 21
Escriba un procedimiento que resuelva el problema planteado en el ejemplo de
la página 31, usando arreglos. Ingrese los datos, separados por coma.
Sub Arreglo03()
Dim I, N As Integer
Dim SX, SX2, SY, SXY, Bo, B1 As Double
Dim MX, MY As Variant
' Inicialización de las sumas
SX = 0: SY = 0: SX2 = 0: SXY = 0
' Ingreso del número de datos
N = InputBox("Ingrese el número de datos a procesar")
For I = 1 To N
Cadena = InputBox("Ingrese el para de datos")
L = Len(Cadena)
' Extrae el primer número y almacena en el vector MatY
Y = ""
Xc = Mid(Cadena, 1, 1)
JPos = 1
While Xc <> ","
Y = Y + Xc
JPos = JPos + 1
Xc = Mid(Cadena, JPos, 1)
Wend
MatY(I) = Val(Y)
' Extrae el segundo número y lo almacena en el vector MatX
X = ""
JPos = JPos + 1
Xc = Mid(Cadena, JPos, 1)
While JPos <= L
X = X + Xc
JPos = JPos + 1
Xc = Mid(Cadena, JPos, 1)
Wend
MatX(I) = Val(X)
Next
' Cálculos
VBA página 31
' Cálculos
For I = 1 To N
SX = SX + MatX(I)
SY = SY + MatY(I)
SXY = SXY + MatX(I) * MatY(I)
SX2 = SX2 + MatX(I) * MatX(I)
Next
' Estimacion de los coeficientes
B1 = (N * SXY - SX * SY) / (N * SX2 - SX * SX)
Bo = SY / N - B1 * SX / N
MsgBox ("La ecuación de regresión estimada es:")
MsgBox ("Y = " & Bo & " + " & B1 & " X")
End Sub
Observación:
En el ejemplo anterior, como verá, hemos extraído los caracteres contenido en
la variable "cadena", carácter por carácter hasta encontrar ",". Repite el
mismo procedimiento para extraer el segundo dato.
Más adelante veremos otra forma de extraer los números (Ver Ejemplo 8 de la
sección Objeto Range).
Desde <[Link]
VBA página 32
Llamar a otros procesos
miércoles, 29 de julio de 2020 16:42
Ejemplo 22
El siguiente procedimiento PrPrin, llama al procedimiento Lectura que se
encarga de leer el nombre de los meses (separado por coma) en una cadena,
llama al procedimiento Decode que se encarga de almacenar los nombres de los
meses en un arreglo unidimensional y termina llamando al procedimiento Prin
que se encarga de imprimir el arreglo de los nombres de los meses.
Nota:
Para que los datos sean compartidos por todos los procedimientos, usamos DIM,
externo a todo procedimiento, en forma global.
VBA página 33
Llamada y transferencia de datos y resultados entre procedimiento
El siguiente ejemplo ilustra la forma cómo se llama a un procedimiento que se
encarga de leer dos datos, se llama otro procedimiento que calcula el
producto de los valores leídos, se imprime en el llamador los valores leídos
y se llama a otro para que imprima el resultado devuelto por el procedimiento
de cálculo.
Ejemplo 23
Sub Transf()
Call Entrada(a, b)
Call Procesa(a, b, c)
MsgBox ("En el procedimiento principal: " & a & " , " & b)
Call Imprime(c)
End Sub
Sub Entrada(x, y)
x = InputBox("X = ")
y = InputBox("Y = ")
End Sub
Sub Procesa(x, y, r)
r = x * y
End Sub
Sub Imprime(z)
MsgBox ("Calculado en un procedimiento e impreso en otro: " & z)
End Sub
Desde <[Link]
VBA página 34
Funciones
miércoles, 29 de julio de 2020 16:44
Como hemos dicho antes, un procedimiento también puede estar constituido por
una función.
La sintaxis de una función es:
Ejemplo 24
El siguiente procedimiento ProcPrin llama a otro procedimiento Lee, que se
encarga de leer dos valores, e imprime el valor devuelto por la función
Decide quien se encarga de determinar si se debe sumar o multiplicar los
valores leídos.
El código es el siguiente:
Sub ProcPrin()
Dim a, b As Double
Call Lee(a, b)
MsgBox (Decide(a, b))
End Sub
Sub Lee(x, y)
x = InputBox("Primer valor: ")
y = InputBox("Segundo valor: ")
End Sub
Function Decide(r, s As Double)
If r < s Then
Decide = r + s
Else
Decide = r * s
End If
End Function
VBA página 35
financieros pasando por aquellos problemas de manejo de texto, estadísticos,
de base de datos, decisiones y fechas.
Ejemplo 25
Escriba una función que devuelva el área de un rectángulo dado su base y
altura.
Solución:
Nombre de la función : Area
Argumentos : Base, Altura
La función calculará: Base*Altura/2
El código es el siguiente:
Function Area(Base,Altura)
Area = Base*Altura
End Function
Ahora en Excel,
• Use el Asistente para funciones
• Seleccione la categoría "Definidas por el usuario"
• Seleccione la función cuyo nombre sea Area
• Haga clic en <Aceptar>
• En cada parámetro ingrese las celdas que contienen el valor
correspondiente: En Base: B9; en Altura: B10.
• Haga clic en <Aceptar>
Estando en Excel, puede digitar =Area(B9,B10) en la celda B11 y presionar
<Enter>
Ejemplo 26
Escriba una función que permita obtener el perímetro o área de un trapecio
teniendo como datos las dos bases y la altura. Si el trapecio no es isósceles
debe devolver el mensaje "No hay datos para obtener el perímetro de un
trapecio que no es isósceles".
Solución
Function Trapecio(Bmay, Bmen, H, Ians)
Select Case Ians
Case "p", "P"
If (Bmay = 2 * Bmen) Then
Trapecio = Bmay + Bmen + 2 * Sqr(H * H + Bmen ^ 2 / 4)
Else
MsgBox ("No se tiene datos para calcular el área" + Chr(13) +
Chr(10) + "de un trapecio que no es isósceles")
VBA página 36
Chr(10) + "de un trapecio que no es isósceles")
End If
Case "a", "A"
Trapecio = H / 2 * (Bmay + Bmen)
End Select
End Function
Ejemplo 26
Dada la ecuación cuadrática
Solución
Daremos por nombre a la función: FRaiz1 aquella función que nos devuelve la primera raíz y
FRAiz2 a la que devuelve la segunda raíz. En cuanto a los parámetros serán A, B y C. El
código correspondiente es el que sigue.
Function FRaiz1(a, b, c)
If (b * b - 4 * a * c < 0) Then
MsgBox "Las raíces son imagináreas"
Return
Else
FRaiz1 = (-b + Sqr(b * b - 4 * a * c)) / (2 * a)
End If
End Function
Function FRaiz2(a, b, c)
If (b * b - 4 * a * c < 0) Then
MsgBox "Las raíces son imagináreas"
Return
Else
FRaiz2 = (-b - Sqr(b * b - 4 * a * c)) / (2 * a)
End If
End Function
Nota:
He aquí una función particularmente útil:
Ejemplo 27
VBA página 37
Ejemplo 27
Implemente una función que permita calcular la raíz n – ésima de un número.
La función debe ser capaz de obtener raíces impares de valores negativos y
emitir un mensaje si se pretende obtener raíz par de un valor negativo.
Solución
Llamaremos r a la función que recibirá dos parámetros: A que contendrá el
número a quien se le saque la raíz y N que será la cantidad radical.
Primero debe verificar si el número a ser usado como cantidad radical par o
no. Si es par debe verificar si el valor es negativo. Si así fuera, devuelve
la raíz pedida, en caso contrario, emite un mensaje de error pues no se puede
obtener un radical par de un valor negativo.
La función es la siguiente:
Function r(a, n)
If n = Int(n / 2) * 2 Then
If a >= 0 Then
r = a ^ (1 / n)
Else
MsgBox "No se puede obtener raíz real par, de un valor negativo"
End If
Else
If a < 0 Then
r = -Abs(a) ^ (1 / n)
Else
r = a ^ (1 / n)
End If
End If
End Function
Ejemplo 28
Escriba un procedimiento para resolver problemas de conteo o enumeración. El
procedimiento debe tener una rutina principal donde se decida qué tipo de
técnica se usará.
Solución
El procedimiento principal se llamará :
MainTc
La función que calcula el factorial se llamará :
Factorial
La función que calcule las permutaciones se llamará : Permut
La función que calcule las permutaciones con repetición: : PermutRep
La función que calcule las combinaciones se llamará : Combinat
Observe cómo se pide el ingreso de los datos, dentro de los argumentos que se
pasan a la función.
VBA página 38
pasan a la función.
A continuación se da el código:
Sub MainTc()
Code = InputBox("Digite el numeral deseado: " + Chr(13) + Chr(10) _
+ "1. Factorial F(n)" + Chr(13) + Chr(10) + "2. Permutaciones P(n,m)" +
Chr(13) + Chr(10) _
+ "3. Permutaciones con repetición Pr(n,m)" + Chr(13) + Chr(10) + "4.
Combinaciones C(n,m)")
Select Case Code
Case 1:
Result = Factorial(InputBox("Factorial de: "))
Case 2:
Result = Permut(InputBox("Permutaciones de n = "), InputBox("tomados de m
= "))
Case 3:
Result = PermutRep(InputBox("Permut. con repet. de n = "),
InputBox("tomados de m = "))
Case 4:
Result = Combinat(InputBox("Combinaciones de n = "),
InputBox("tomados de m = "))
End Select
MsgBox Result
End Sub
Function Factorial(n)
Factorial = n
If Factorial = 1 Then
Else
Factorial = Factorial * Factorial(n - 1)
End If
End Function
Function Permut(n, m)
If n >= m Then
Permut = Factorial(n) / Factorial(n - m)
Else
MsgBox "Error en datos..."
End If
End Function
Function PermutRep(n, m)
PermutRep = n ^ m
End Function
Function Combinat(n, m)
If n >= m Then
Combinat = Factorial(n) / (Factorial(m) * Factorial(n - m))
Else
MsgBox "Error en datos..."
End If
End Function
=Left(Texto,NChar)
Esta función permite extraer los primeros "NChar" caracteres de la cadena
"Texto"
VBA página 39
=Right(Texto, NChar)
Contrario a la anterior, esta función permite extraer de la cadena "Texto",
los úiltimos "NChar" caracteres.
=Instr(Texto1, Texto2,[Inicial])
Esta función devuelve la posición inicial en que se encuentra la cadena
Texto2, dentro de la cadena Texto1. Esto lo hace examinando a partir de la
posición Inicial.
Ejemplo
Sub Apellidos_Y_Nombres()
MsgBox ApPaterno
MsgBox ApMaterno
MsgBox Nombres
End Sub
Desde <[Link]
VBA página 40
Objetos
miércoles, 29 de julio de 2020 16:49
VBA página 41
De la observación de esta tabla, podemos decir que el objeto Application
proporciona un contenedor de toda la aplicación y cada objeto WorkBook
contiene una cantidad de objetos WorkSheet; dentro de este objeto referirnos
al objeto Range, el cual nos permitirá trabajar con celdas o grupos de
celdas.
Como se dijo antes, para usar algún método de acceso a un objeto o colección,
haremos uso del punto, el cual vinculará los objetos y su colección y el
método mediante el cual accederemos a las propiedades de los objetos.
VBA página 42
método mediante el cual accederemos a las propiedades de los objetos.
En este caso, para acceder al objeto Font, usaremos la propiedad Font del
conjunto Range, de la hoja 1, del libro [Link]
Usaremos la siguiente sintaxis:
Range("B5").[Link] = True
Esto permite poner la celda B5 en resaltado (negrita o Bold).
Expresiones equivalentes a esta, puede ser:
WorkSheets(1).Range("B5")).[Link] = True
O también
[Link]("[Link]").WorkSheets(1).Range("B5").[Link] =
True
Nota:
Nosotros usaremos la notación más sencilla, pero claro está, que para ello
deberemos estar usando los conjuntos previos. Esto significa que, en el caso
de la expresión
Range("B5").[Link] = True
VBA página 43
Aplication
lunes, 03 de agosto de 2020 15:57
Sintaxis:
Ejemplo 1
[Link]
En este ejemplo, se aplica la propiedad WorkBooks al ojeto Application. La
propiedad WorkBooks es modificado por le ejecución del método Close. En
consecuencia, esta sentencia permite cerrar el libro que está en uso.
Ejemplo 2
[Link]("[Link]").Activate
Este ejemplo se aplica la propiedad Windows al objeto Application que está en
ejecución.
Ejemplo 3
Set Xls = CreateObject("[Link]")
[Link] "[Link]"
En este ejemplo se crea un objeto libro en otra aplicación y luego abre el
libro existente, [Link].
VBA página 44
Cursor XlMousePointer Obtiene o establece el aspecto del puntero del mouse (ratón).
(xlDefault, xlIBeam,
xlNorthwestArrow,
xlWait)
EditDirectlyInC Boolean Obtiene o establece la capacidad de modificar celdas directamente en el
ell lugar correspondiente. Si es False, las celdas sólo se pueden modificar
en la barra de fórmulas.
FixedDecimal Boolean Si es True, todos los valores numéricos utilizan la propiedad
FixedDecimalPlaces para determinar el número de decimales; en caso
contrario, la propiedad FixedDecimalPlaces se omite (el valor
predeterminado es False).
FixedDecimal Long Determina el número de decimales que se utilizan para los datos
Places numéricos si la propiedad FixedDecimal es True.
Interactive Boolean Obtiene o establece la capacidad del usuario de interactuar con Excel a
través del teclado o el mouse. Si establece esta propiedad en False,
asegúrese de cambiarla de nuevo a True en el controlador de
excepciones.
MoveAfterRetu Boolean Si es True, la selección se mueve a la siguiente celda al presionar
rn ENTRAR; el valor predeterminado es True.
MoveAfterRetu xlDirection (xlDown, Indica la dirección de movimiento después de presionar ENTRAR, si la
rnDirection xlToLeft, xlToRight, propiedad MoveAfterReturn es True. El valor predeterminado es
xlUp) xlDown.
ScreenUpdatin Boolean Si es True, Excel actualiza su pantalla después de cada llamada a un
g método. Puede desactivar la presentación mientras se ejecuta el código.
Asegúrese de establecer de nuevo esta propiedad en True.
ActiveCha Chart Devuelve una referencia al gráfico actualmente activo. Un gráfico incrustado sólo se
rt considera activo cuando está seleccionado o activado.
VBA página 45
ActiveShe Object Devuelve una referencia a la hoja activa del libro activo.
et
ActiveWin Window Devuelve una referencia a la ventana activa (la ventana que está delante); devuelve
dow Nothing si no hay ninguna ventana activa.
Charts Sheets Devuelve una colección de objetos Sheet (el objeto principal de Chart y Worksheet) que
contiene referencias a cada uno de los gráficos del libro activo.
Selection Object Devuelve el objeto seleccionado en la aplicación, como Range, Worksheet u otro objeto.
Se aplica también a la clase Window, en donde la selección es normalmente un objeto
Range. Si no hay ningún objeto actualmente seleccionado, devuelve Nothing.
Sheets Sheets Devuelve una colección de objetos Sheet con referencias a cada una de las hojas del libro
activo.
Workbook Workboo Devuelve una colección de objetos Workbook con referencias a todos los libros abiertos.
s ks
Calculate
CheckSpelling
Evaluate
MailSystem
Quit
Undo
[Link]
Permite ejecutar todos los libros abiertos
[Link]
Permite salir del Excel mediante la programación
[Link]
Permite cancelar la última acción realizada por el usuario.
VBA página 46
WorkBook
lunes, 03 de agosto de 2020 15:54
a) Propiedad WorkBooks
Devuelve todos los libros abiertos.
Se puede usar como
[Link].
O también simplemente
WorkBooks.
Ejemplo 01
Abrir el libro [Link] que se encuentra en la unidad y carpeta en uso.
[Link] FileName:="[Link]"
Ejemplo 02
Abrir un libro que se encuentra en una unidad y carpeta que no está en uso.
[Link] Filename:="G:/Libros/Progmacros/[Link]"
Abre el archivo [Link] que se encuentra en la carpeta ProgMacros dentro
de la carpeta Libros, de la unidad G. Como se puede apreciar, el nombre del
libro viene precedida por la ruta donde se encuentra dicho libro-
Ejemplo 03
El siguiente ejemplo permite activar el segundo libro que ya está abierto.
WorkBooks(2).Activate
Ejemplo 04
El siguiente ejemplo abre el libro "[Link]", imprime en pantalla el
nombre del libro abierto, abre también el libro "[Link]"; activa el
primero y cierra el segundo. Para ejecutarlo, debe estar abierto un libro
cualquiera diferente a Libro1 y Libro2, conteniendo la macro.
Sub Libros01()
[Link] ("C:/[Link]")
MsgBox Workbooks("[Link]").Name
[Link] ("C:/libro2")
Workbooks("[Link]").Activate
Workbooks("[Link]").Close
End Sub
b) Propiedad ActiveWorkBook
VBA página 47
b) Propiedad ActiveWorkBook
Esta propiedad devuelve el libro activo; es decir, hace referencia al libro
activo de tal forma que cualquier acción que se pueda ejecutar, afectará al
libro abierto y activo, dentro del grupo de libros que pudieran estar
abiertos.
Ejemplo
El siguiente ejemplo imprime en pantalla el nombre del libro activo
MsgBox ("El nombre del libro activo es " & [Link]
Ejemplo
En el siguiente esquema se ejecuta una serie de acciones estando en uso el
libro activo
With ActiveWorkBook
Nombre = .Name
Ruta = .Path
HojaActiva = .Sheets(1).Select
Proteger = .Protect
End With
c) Propiedad Open
[Link] Nombre
Permite abrir un libro existente (ya grabado) cuyo nombre es "Nombre".
Si el libro no se encuentra en la unidad y carpeta en uso, el nombre del
libro debe contener la ruta donde se ubica el libro
Ejemplo
Sub OpenUp()
[Link]("C:\MyFolder\[Link]")
End Sub
Ejemplo 01
El siguiente ejemplo abre los libros [Link] y [Link]. La última
instrucción permite crear otro nuevo libro que va a ser una copia exacta del
libro que está activo. Según la secuencia, el libro activo es [Link]; por
lo que seguramente crea otro nuevo libro con el nombre definido por omisión.
Sub Libros02()
[Link] ("C:/[Link]")
MsgBox Workbooks("[Link]").Name
[Link] ("C:/libro2")
[Link]
End Sub
Observe que en la penúltima instrucción hemos añadido un comentario al final
de la misma mediante el uso del apóstrofe: '
Ejemplo 02
El siguiente ejemplo permite duplicar un libro determinado
Sub Duplica()
[Link] ("C:/[Link]")
[Link]
VBA página 48
[Link]
[Link] "[Link]"
[Link]
WorkBooks("[Link]").Close
End Sub
d) Propiedad Add
[Link]
Esta propiedad permite crear un nuevo objeto libro el cual se convierte
automáticamente en libro activo.
El siguiente ejemplo crea un nuevo libro y modifica alguna de las propiedades
del nuevo libro
Ejemplo
Sub AddNew()
Set LibroNuevo = [Link]
With LibroNuevo
.Title = "Proforma 01"
.Subject = "Consultas"
.SaveAs Filename:="[Link]"
End With
End Sub
VBA página 49
WorkSheet
lunes, 03 de agosto de 2020 15:55
a) Propiedad WorkSheets
Esta propiedad devuelve el resultado de una acción realizada sobre una
determinada hoja de cálculo identificada por su nombre o por un índice en el
argumento de esta propiedad.
Sintaxis:
WorkSheets(x).Método
Donde
x puede ser el número de hoja o el nombre de la misma.
Método es el método que se usará sobre la hoja x
b) Propiedad ActiveSheet
Esta propiedad permite hacer referencia a la hoja activa y extraer o
modificar alguna de sus propiedades mediante el uso de algunos métodos.
Sintaxis:
ActiveSheet.Método
En los siguientes ejemplos haremos uso de estas dos propiedades sea en forma
individual o en forma complementaria
Ejemplo 01
WorkSheets(1).Activate
Permite activar la hoja 1 del libro activo
Ejemplo 02
El siguiente ejemplo pide la ruta y nombre de libro a abrirse y activa la
hoja 3 de dicho libro.
Sub Activar()
Libro = Trim(InputBox("Ruta y nombre del archivo"))
Libro = Libro + ".xls"
[Link] Filename:=Libro
Book = [Link]
Workbooks(Book).Worksheets("Hoja3").Activate
End Sub
Ejemplo 03
El siguiente ejemplo permite obtener el nombre de la hoja activa.
Sub Nombre()
VBA página 50
Sub Nombre()
Worksheets(1).Activate
NombreHoja = Worksheets(1).Name
MsgBox NombreHoja
End Sub
Ejemplo 04
En el siguiente ejemplo se activa la hoja 3 y se añade una nueva hoja a la
izquierda de la hoja activa.
Sub NuevaHoja()
Worksheets(3).Activate
[Link]
End Sub
Ejemplo 05
El siguiente ejemplo activa la tercera hoja, añade una nueva hoja y le cambia
el nombre por "Ventas" y luego imprime el nombre devuelto por el método Name
Sub NuevoNombre()
Worksheets(3).Activate
[Link]
NomHoja = [Link]
Worksheets(NomHoja).Name = "Ventas"
MsgBox [Link]
End Sub
Ejemplo 06
El siguiente ejemplo permite añadir una nueva hoja. Moverlo después de la
hoja 1 e imprimir el número de hojas.
Sub MoverHoja()
Worksheets(3).Activate
[Link]
NomHoja = [Link]
Worksheets(NomHoja).Name = "Ventas"
[Link] After:=Worksheets(1)
MsgBox [Link]
End Sub
Ejemplo 07
En el siguiente ejemplo se oculta la hoja3 y luego de activar la hoja1, se
cambia la orientación de la hoja y se imprime después.
Sub ImprimirHoja()
Worksheets(1).Visble = False
Worksheets("Hoja3").Activate
[Link] = xlLandscape
[Link]
End Sub
Ejemplo 08
El Siguiente ejemplo añade una nueva hoja y luego muestra una lista de los
nombres de las hojas, en el orden en el que se encuentran, contenidas en
el libro activo.
Sub ListaHojas()
Dim Cadena As Variant
Cadena = ""
Set NuevaHoja = [Link](Type:=xlWorksheet)
For i = 1 To [Link]
VBA página 51
For i = 1 To [Link]
Cadena = Cadena + Sheets(i).Name + Chr(10) + Chr(13)
Next i
MsgBox Cadena
End Sub
Comentarios:
Primero hemos definido a la variable cadena como de tipo variant
La instrucción Set permite definir a NuevaHoja como un objeto WorkSheet.
Ejemplo 09
El siguiente ejemplo, además de hacer lo mismo que el ejemplo 8, activa la
hoja 2 (que es la segunda en secuencia), deposita un texto en B2 y activa el
objeto NuevaHoja que es una hoja.
Sub Lista()
Dim Cadena As Variant
Cadena = ""
Set NuevaHoja = [Link](Type:=xlWorksheet)
For i = 1 To [Link]
Cadena = Cadena + Sheets(i).Name + Chr(10) + Chr(13)
Next i
MsgBox Cadena
Sheets(2).Activate
Range("B2") = "Hola estamos cenando"
[Link]
Range("B3").Select
End Sub
Ejemplos sueltos:
La siguiente declaración mueve todas las hojas a la derecha de la última
hoja.
[Link] After:=Sheets([Link])
La siguiente declaración permite inserter tres nuevas hojas antes de la
primera hoja.
[Link] Count := 2, Before := Sheets(1)
Desde <[Link]
VBA página 52
Range
lunes, 03 de agosto de 2020 16:00
Propiedad Range
Sintaxis
Range(Cadena).Método
Devuelve un objeto range que representa una celda o un rango de celdas.
El argumento Cadena representa a una celda o un rango de celdas. Por ejemplo
A2, B5:B12, B2:M12.
Ejemplos simples:
Range("A1").Select ' Activa o selecciona la celda A1
Range("A1").Activate 'Activa o selecciona la celda A1
Range("A1").Value ' Devuelve el valor o contenido de
la celda A1
Range("A1").Value = Expresión ' Se asigna a la celda A1 el valor de
Expresión.
Range("A1").Name = "Tasa" ' Permite dar el nombre de Tasa a la celda
A1
MsgBox Range("A1").Value ' Permite visualizar el contenido de la
celda A1
MsgBox Range("B3").Address() ' Visualiza la celda B3
MsgBox Range("B3").AddressLocal() ' Como en el caso anterior
Range("B3").AddComment "Esta es una celda de datos"
' Inserta en B3 el
comentario que se indica
Range("B3").Clear ' Borra contenido y formato de la
celda B3
Range("B3").ClearContents ' Borra sólo el contenido de la celda B3
Range("B3").ClearComments ' Elimina el comentario insertado en B3
Range("B3").ClearFormats ' Borra solo el formato de B3
MsgBox Range("E3").Column ' Emite el número de columna; en este caso 5.
MsgBox Range("J3:M21").Column ' En este caso devuelve 10
Rango = "D2:F8"
MsgBox Range(Rango).Column ' Devuelve 4
Veamos el siguiente grupo:
Rango = "D2:H15"
Range(Rango).Columns(3).Value = "M"
Range(Rango).Rows(3).Value = "MMMMMMM"
Las siguientes dos sentencias permiten copiar el contenido del rango B1:B6 de
VBA página 53
Las siguientes dos sentencias permiten copiar el contenido del rango B1:B6 de
la Hoja2 hacia la Hoja3, a partir de la celda E5
MsgBox Range("B3").ColumnWidth ' Devuelve el ancho de la columna B
Sheets("Hoja2").Range("B1:B6").Copy Destination:=Sheets("Hoja3").Range("E5")
La siguiente sentencia selecciona tres hojas del mismo libro (libro activo)
Desde <[Link]
Ejemplo 01
Asignar un texto a la celda B3
Sub Ej01()
' Primera forma
Workbooks("Libro1").Worksheets(2).Range("B1") = "Hola Mundo B1 !!!"
' Segunda forma
Worksheets(2).Range("B2") = "Hola Mundo B2 !!!"
' Tercera forma
Worksheets(2).Activate
Range("B3") = "Hola Mundo B3 !!!"
' Cuarta forma
Worksheets(2).Select
Range("B4").Select
Range("B4").Value = "Hola Mundo B4 !!!"
' Quinta forma
Worksheets(2).Select
Range("B5").Formula = "Hola Mundo B5 !!!"
' Sexta forma
Worksheets(2).Select
Range("B6").FormulaR1C1 = "Hola Mundo B6 !!!"
End Sub
Ejemplo 02
Ingresar datos desde el teclado hacia una celda
Sub Ej02
' Primera forma
XDat1 = InputBox("Ingresa un número")
Range("B1") = XDat1
' Segunda forma
Range("B1") = InputBox("Ingresa un número")
' Tercera forma
Cells(3, 2) = InputBox("Ingresa un número")
' Cuarta forma Indicar en qué celda se guardará
Celda = InputBox("En que celda deseas almacenar el dato?")
XDat1 = InputBox("Ingresa el dato")
Range(Celda) = XDat1
' Quinta forma
Celda = InputBox("Ingresa la celda donde se guardará")
Range(Celda) = InputBox("Ingresa el dato a ser guardado")
End Sub
Desde <[Link]
Ejemplo 03
VBA página 54
Ejemplo 03
Obtener la suma de un rango de celdas de la hoja "Datos" y dejar el resultado
en otra celda. Se recomienda grabar esta macro en un libro diferente al que
se va a abrir.
En este ejemplo se usa el libro [Link] y los datos de la hoja Totales. La
macro se puede grabar en cualquier libro
Sub Ej03()
Libro = InputBox("Ingresa el nombre del libro")
Hoja = InputBox("Ingresa el nombre de la hoja")
'
' La siguiente instrucción abre la hoja del libro deseado
'
[Link] (Libro)
Sheets(Hoja).Activate
'
' La siguiente instruccioón ingresa una fórmula en F3
'
Range("F3") = "=Sum(B3:E3)"
'
' Como la celda active es aquella que contiene la fórmula, se copia
'
[Link]
'
' Ahora se selecciona el rango destino y se pega en dicha selección
'
Range("F4:F14").Select
[Link]
[Link] = False
'
' A continuación ingresa en B15 una formula, lo copia y lo pega en otro rango
'
Range("B15") = "=Sum(B3:B14)"
Range("B15").Copy
Range("C15:E15").Select
[Link]
[Link] = False
End Sub
Desde <[Link]
VBA página 55
' Pide ingresar un dato por teclado hacia una celda que tiene nombre de rango
'
Range("Capital") = InputBox("Ingrese el capital")
'
' Multiplica dos celdas por sus nombre de rango
'
Range("Monto") = "=Tasa*Capital"
End Sub
Desde <[Link]
Desde <[Link]
VBA página 56
Desde <[Link]
Desde <[Link]
Desde <[Link]
VBA página 57
Ejemplo 08. Ingresar pareja de datos, separados por ",", hacia dos columnas.
Sub Ej08()
Dim StDato As String
' Usaremos la columna A y B a partir de la fila 2
'
Row = 2
Col = 1
Range("A1") = "X"
Range("B1") = "Y"
'
' La siguiente sentencia permite centrar el dato contenido en el rango
'
Range("A1:B1").HorizontalAlignment = xlCenter
'
' Ingreso de datos
'
nDat = InputBox("Número de datos")
For I = 1 To nDat
Dato = InputBox("Dato: " & I)
Cells(I + 1, 1) = Val(Mid(Dato, 1, InStr(Dato, ",") - 1))
Cells(I + 1, 2) = Val(Mid(Dato, InStr(Dato, ",") + 1, Len(Dato) -
InStr(Dato, ",")))
Next
End Sub
Desde <[Link]
VBA página 58
' Se encuentra en la siguiente página
NroDatos
'
' La variable global (común a todos los procedimientos) se reduce en 1
'
nDat = nDat - 1
'
' Loop para calcular las columnas
'
For I = 1 To nDat
Cells(I + 1, 3) = Cells(I + 1, 1) ^ 2
Cells(I + 1, 4) = Cells(I + 1, 1) * Cells(I + 1, 2)
Cells(I + 1, 5) = Cells(I + 1, 3) * Cells(I + 1, 2)
Cells(I + 1, 6) = Cells(I + 1, 2) ^ 2
Cells(I + 1, 7) = Cells(I + 1, 1) * Cells(I + 1, 6)
Next
' Obtiene la suma de todas las columnas y los guarda una fila más abajo
'
' VarSuma = Range(Cells(2, 1), Cells(21, 1)): Ejemplo de cómo seleccionar un
' determinado rango, usado líneas abajo
For I = 1 To 7
Cells(2, I).Select
' Range("A2").Select
' Selecciona el rango de datos de la i-ésima columna
'
VarSuma = Range(Selection, [Link](xlDown))
'Suma el rango seleccionado y lo almacena
Cells(nDat + 3, I) = [Link](VarSuma)
Next
End Sub
Sub Ej08()
Dim StDato As String
' Usaremos la columna A y B a partir de la fila 2
'
Row = 2
Col = 1
Range("A1") = "X"
Range("B1") = "Y"
'
' La siguiente sentencia permite centrar el dato contenido en el rango
'
Range("A1:B1").HorizontalAlignment = xlCenter
'
' Ingreso de datos
'
nDat = InputBox("Número de datos")
For I = 1 To nDat
Dato = InputBox("Dato: " & I)
Cells(I + 1, 1) = Val(Mid(Dato, 1, InStr(Dato, ",") - 1))
Cells(I + 1, 2) = Val(Mid(Dato, InStr(Dato, ",") + 1, Len(Dato) -
InStr(Dato, ",")))
Next
End Sub
Sub NroDatos()
nDat = Columns("A:A").Range("A65536").End(xlUp).Row
End Sub
VBA página 59
End Sub
Nota 1:
Este es un ejemplo independiente del módulo principal usado para probar la
definición de un rango y la forma de cómo sumar dicho rango
Sub Macro4()
' VarSuma = Range(Cells(2, 1), Cells(21, 1))
For I = 1 To 7
Cells(2, I).Select
' Range("A2").Select
VarSuma = Range(Selection, [Link](xlDown))
'Sumar el rango
Cells(24, I) = [Link](VarSuma)
Next
End Sub
Nota 2:
Si abre el archivo Uso de Mó[Link], en la primera hoja encontrará un botón
al cual se le ha asignado la macro PMain(). De manera que si desea ver una
demostración de esto, debe hacer clic en dicho control.
Desde <[Link]
VBA página 60
Ejercicios
lunes, 03 de agosto de 2020 16:04
Ejercicios
Ejemplos:
DIM XIngreso As Double
DIM Codigo As variant
Ejemplo
PUBLIC Saldo As Double
PUBLIC Precio, Stock, Tasa As Double
Sub Decode()
On Error GoTo Labxx
Sentencia - 1
Sentencia – 2.
…….
Labxx: Sentencia – kk
….
End Sub
VBA página 61
c) Obtenga el nombre del libro activo
Sub LibroName()
DIM LibNom As String
LibNom = WorkBooks(1).Name
MsgBox "El nombre del libro es: " & LibNom
End Sub
Desde <[Link]
VBA página 62
Interacción Módulos & Macros
lunes, 03 de agosto de 2020 16:19
VBA página 63
En la figura anterior se muestra el formulario llamado UserForm1. Si se desea
cambiar este nombre se debe hacer clic en la opción Name de la ventana de
propiedades. Si se desea que el formulario se llame "Panel de ingreso de
datos", entonces se debe hacer clic en la propiedad Caption de la ventana de
propiedades y digitar dicho texto en el lado derecho de esta propiedad.
Desde <[Link]
VBA página 64
Proyecto
lunes, 03 de agosto de 2020 16:25
Ventana de Proyectos
Al abrir el Editor del VBA Usando <Alt> + <F11> se acede a un conjunto de
ventanas que conforman la ventana del editor.
Entre estas ventanas tenemos:
VBA página 65
Por debajo de la ventana de proyectos se dispondrá de la Ventana de
Propiedades. En esta ventana se visualizará las propiedades que posee un
determinado objeto. En la siguiente imagen se muestra la ventana de
propiedades de un formulario, ya que éste es el que está activo.
Nota
Si se hace clic en una hoja de un libro, en la ventana de
Propiedades se visualizará las propiedades de la hoja.
Desde <[Link]
VBA página 66
Formulario
lunes, 03 de agosto de 2020 16:25
VBA página 67
usando la propiedad Name, el cual es usado en la codificación de las acciones
que se debe realizar al activar dicho control. Alguno de ellos tienen también
la propiedad Caption, que permite ingresar un texto en dicho botón de control
y que servirá para colocarle una etiqueta al botón, como ocurre con el botón
de comando que se muestra en la figura anterior: CommandButton 1.
Las acciones que se han enumerado líneas arriba se pueden llevar a cabo
mediante el uso de los cuadros de control.
Desde <[Link]
VBA página 68
Cuadros de control
lunes, 03 de agosto de 2020 16:28
Botón de comando
Este control permite realizar una determinada acción; puede servir para abrir
un nuevo formulario, para asignar valores iniciales, para modificar alguna
propiedad de otros controles, para transferir datos a y desde una hoja de
trabajo. Puede servir también para dar por terminado el uso del formulario.
Ejemplo 01
Crear un formulario que se llame Forma01, que su caption sea "Este es un
formulario"; que el color de fondo sea verde claro.
Procedimiento:
P1. Abra el editor usando <Alt>+F11. Insertar un formulario usando
<Insertar> - <UserForm>.
P2. Haga clic en (Name) y luego digite Forma01
P3. Haga clic en <Caption> y luego digite "Este es un formulario"
P4. Haga clic en <Back color> y desplegando la lista seleccione el color
verde claro en <Paleta>.
Desde <[Link]
VBA página 69
Ejemplo 02
Crear un formulario que se llame Forma02, que tenga un botón de comando y que
éste permita dar por terminado el uso del formulario. Que su caption sea
Botón de comando. Luego al hacer clic en dicho botón, durante la ejecución
del formulario, debe dar por terminado su uso.
Procedimiento:
P1. Inserte un nuevo UserForm.
P2. Haga clic en (Name) y digite Forma02. Haga clic en <Caption> y digite
"Botón de comando".
P3. Haga clic en el Botón <Botón de comando> del cuadro de herramientas.
Luego, en el formulario, trace un pequeño rectángulo en la parte inferior
derecha.
P4. Haga clic en (Name) y digite CmdTerminar. En <Caption> digite Terminar.
P5. Ahora vamos a insertar el código que permita dar por terminado la
ejecución del formulario.
Para ello haga doble clic en el botón que ha insertado
Ejemplo 03
Crear un formulario que al hacer clic en un botón de comando, se muestre en
una ventana del MsgBox, la ruta del libro que esté en uso y al hacer clic en
el segundo, se dé por terminado la ejecución del formulario.
Procedimiento
P1. Insertar un UserForm que se llame Forma03
P2. Insertar dos botones de comando.
Botón 1: Nombre: CmdRuta Caption: Devuelve la
ruta
VBA página 70
ruta
Botón 2: Nombre: CmdFin Caption: Terminar
P3. Luego de hacer doble clic en el botón 1, ingrese el siguiente código:
Dim Ruta As Variant
Workbooks(1).Activate
Ruta = [Link]
MsgBox Ruta
P4. Luego de hacer clic en el botón 2, ingrese el siguiente código:
End
P5. Ejecute el formulario haciendo clic en el icono
Desde <[Link]
Ejemplo 04
Ahora diseñe un formulario que permita ingresar por teclado la ruta en donde
se encuentra los archivos que se va a usar, que pida el nombre del libro a
ser abierto y luego muestre el número de hojas de dicho libro.
Procedimiento:
P1. Inserte un nuevo formulario. Haga que su nombre sea FrmAbrir; que su
caption sea "Abrir libros".
P2. Inserte dos botones de comando. Que el primero tenga por Name:
CmdAbrirLibro y su caption sea "Abre Libro". Que el segundo botón tenga por
Name: CmdTerminar y su caption sea "Terminar".
P3. Luego de hacer doble clic en el primer botón, ingrese las siguientes
líneas de código:
Dim Ruta As Variant
Dim LibroXx As Variant
Ruta = InputBox("Ingrese la ruta en donde se" & Chr(10) & "encuentren los
archivos a ser usados") + "/"
LibroName = InputBox("Nombre del libro")
Libro = Trim(Ruta) + Trim(LibroName) + ".xls"
[Link] Libro
MsgBox ([Link])
P4. Vuelva al formulario haciendo clic en el botón central de
Nota:
El libro a ser abierto debe ser de extensión xls. Si la extensión es otra
será suficiente modificar el código.
VBA página 71
Desde <[Link]
********************************************************************
Cuadro de Texto
El control de cuadro de texto se usa para ingresar algún dato por teclado o
recibir algún resultado producto de algún cálculo o proveniente de alguna
celda de la hoja que estuviera activa.
Si se hace doble clic en un cuadro de texto, se despliega el procedimiento
que le corresponde el cual contendrá el código que se ejecuta o en que se
puede insertar el código que queremos que se ejecute sea cuando su contenido
se modifique.
Procedimiento
P1. Inserte un nuevo formulario
P2. Inserte en este formulario dos cuadros de texto y un botón de comando
P3. Defina las propiedades de cada botón según los siguientes datos:
VBA página 72
Botón Name Caption
Formulario FrmPanel01 Ejemplo de uso de cuadro de texto
Cuadro de texto 1 TxtDato
Cuadro de texto 2 TxtSalida
Botón de comando CmdFin Terminar
P4. Debemos hacer que TxtDatos sea habilitado para ingresar datos. Para ello
haga doble clic en una parte del formulario. Se mostrará el siguiente
procedimiento:
Private Sub UserForm_Click()
End Sub
Aquí ingresaremos el código:
[Link] = True
A fin de habilitar el primer cuadro de texto para ingresar un dato
cualquiera.
P5. Haciendo doble clic en el segundo cuadro de texto y digite:
[Link] = [Link]
P6. Haga doble clic en el botón de comando e ingrese el código: End
P7. Vuelva al formulario y haga clic en el icono para ejecutarlo. Ahora
ingrese un texto bastante largo en el primer cuadro de texto y observe lo que
sucede en el segundo cuadro de texto. Finalmente haga clic en <Terminar> para
finalizar la ejecución del formulario.
Desde <[Link]
********************************************************************
Etiqueta
Este control permite ingresar un texto a fin de que se pueda usar como un
comentario o como una etiqueta que acompañe a un cuadro de texto o algún otro
botón de control.
VBA página 73
color del borde, del fondo de dicho control.
Procedimiento:
Inserte un nuevo formulario (userform) y que tenga el siguiente diseño:
Al hacer doble clic en cada uno de los controles debe ingresar el código que
se muestra a continuación:
Private Sub CmdAceptar_Click()
MsgBox ("Su usuario es: " + [Link] & Chr(10) & "Su contraseña es: " +
[Link])
End
End Sub
Private Sub TxtPassword_Change()
[Link] = "*"
End Sub
Private Sub txtUserId_Change()
[Link] = True
End Sub
Private Sub UserForm_Click()
[Link] = True
End Sub
VBA página 74
End Sub
Desde <[Link]
Ejemplo 07
Diseñe un formulario que contenga un cuadro combinado y dos botones de
comandos. Que el cuadro combinado tenga por nombre CboLista; un botón de
comando se llame CmdActivar y su caption sea <Activar> y el segundo botón de
comando tenga por nombre CmdFin y su caption sea <Terminar>. Al hacer doble
clic en el botón Activar debe ingresar el siguiente código:
El código que se debe insertar en cada uno de estos botones de control es la
siguiente:
Private Sub CmdActvar_Click()
[Link] "Estadística General"
[Link] "Estadística Aplicada I"
[Link] "Estadística Aplicada II"
[Link] "Análisis Mutivariado"
[Link] "Matemática Básica I"
[Link] "Matemática para los Negocios"
[Link] "Ecuaciones generales"
[Link] "Teoría del crecimiento"
[Link] "Creación de modelos económicos"
End Sub
Private Sub CmdFin_Click()
End
End Sub
Private Sub UserForm_Click()
End Sub
Desde <[Link]
Ejemplo 08
Diseñe un formulario que permita ingresar una lista de elementos hacia un
cuadro combinado y que son digitados en un cuadro de texto. Cada vez que se
digita una línea, se debe hacer clic en un botón de comando para ingresar el
dato a la lista. Al final se debe hacer clic en un segundo botón de comando
para terminar la ejecución del formulario.
Procedimiento:
La siguiente imagen muestra los elementos que debe tener el formulario.
VBA página 75
La tabla siguiente muestra el nombre de los elementos
Al ejecutar el formulario, cada vez que ingresa un nombre o texto, debe hace
clic en <Aceptar>. En cualquier momento puede desplegar la lista en el cuadro
combinado para ver los elementos que se van añadiendo. Para terminar debe
hacer clic en <Terminar>.
Desde <[Link]
VBA página 76
Nota:
Tanto en el cuadro combinado como en el cuadro de lista, los elementos
contenidos se hacen disponible cuando se produce algún evento de cambio.
Ejemplo 09
Inserte un formulario y dentro de él, un cuadro de lista a fin colocar una
lista de nombres al hacer clic en un botón de comando.
Procedimiento:
Luego de insertar un UserForm, coloque dentro de él los siguientes controles:
Al ejecutar este formulario primero debe hacer clic en <Generar lista>. Para
terminar, haga clic en <Terminar>.
Desde <[Link]
VBA página 77
Ejemplo 10
El siguiente ejemplo permite colocar en dos listas los nombres de los meses y
los días de semana. Luego, extrae el número de mes, día y año de la fecha
actual, para visualizar los respectivos nombres en un cuadro de texto.
Procedimiento:
Luego de insertar un UserForm, inserte y defina los siguientes cuadros de
control:
VBA página 78
[Link] Trim(Mid(Meses, 9 * (I - 1) + 1, 9))
Mes(I) = Trim(Mid(Meses, 9 * (I - 1) + 1, 9))
Next
For I = 1 To 7
[Link] Trim(Mid(Dias, 9 * (I - 1) + 1, 9))
Dia(I) = Trim(Mid(Dias, 9 * (I - 1) + 1, 9))
Next
' Las siguientes líneas extraen Día, Mes y Año de la fecha actual
Fecha = Date
NDia = Mid(Fecha, 1, 2)
NMes = Mid(Fecha, 4, 2)
NAño = Mid(Fecha, 7, 4)
' La siguiente línea guarda en el cuadro de texto la cadena literal de la
fecha
[Link] = Trim(Dia(Weekday(Date, 2))) + " " + NDia + " de " +
Trim(Mes(NMes)) + " del " + NAño
End Sub
Desde <[Link]
Ejemplo 11
Ahora vamos a generar un formulario que permita colocar los elementos
seleccionados en un cuadro de lista
Procedimiento:
Luego de insertar un UserForm, inserte y defina los siguientes cuadros de
control:
VBA página 79
Primero almacenamos una lista de nombres en el cuadro de lista. Esto lo
hacemos en el procedimiento para CmdListar, de manera que, al hacer clic en
este botón, se genera la lista..
VBA página 80
[Link] = fmMultiSelectExtended
End Sub
Desde <[Link]
Ejemplo 11A
El siguiente ejemplo permite listar una columna de datos de una hoja del
Excel, seleccionar un elemento y colocarlo en un cuadro de lista.
Procedimiento:
Para ello utilizaremos un cuadro combinado para colocar los elementos de la
columna de la hoja, un botón de comando para que realice esta transferencia,
un cuadro de lista para recibir el elemento seleccionado y un botón de
comando para dar por finalizado el formulario. Los datos se encuentran en el
libro [Link].
VBA página 81
Cadena = Trim(Cells(Ir, Icol))
Wend
End Sub
Nota:
Si la lista fuera más grande se puede modificar la propiedad ListRows del
cuadro combinado a fin de que se pueda visualizar más elementos de la lista.
Desde <[Link]
Ejemplo 12
Como en el ejemplo anterior, se desea extraer todos los datos
correspondientes a un elemento de una determinada fila de datos colocándolos
cada uno de ellos en un control de lista.
Procedimiento
Para ello haremos uso de los mismos controles que el ejemplo anterior con el
único cambio en la ubicación de los elementos en el formulario y hemos
aumentado dos cuadros de control: LstPrecio y LstCosto.
VBA página 82
El código del procedimiento CboLista es el siguiente:
Desde <[Link]
Ejemplo 13
En este ejemplo se trata de usar un formulario para ingresar datos a través
de un panel diseñado en el formulario hacia una hoja de un libro abierto. En
particular, supongamos que se trata de ingresar el nombre de un producto, el
precio unitario, la cantidad y el monto de un posible descuento. En la hoja
debe aparecer una columna en el cual se calcule el monto del IGV (18%) de las
ventas. El formulario deberá ser activado desde una macro la cual se iniciará
insertando una nueva hoja, dándole un nombre y colocando la cabecera de las
columnas de datos.
Procedimiento
Usaremos los siguientes cuadros de control de formulario:
VBA página 83
Este será el módulo correspondiente a la macro:
Para mayor facilidad se puede ingresar los datos usando la tecla <Tab>. En el
cuadro de texto para Descuento se debe ingresar 0 si no hay descuento. A
continuación se debe hace clic en el botón <Transferir>.
VBA página 84
Cells(NroDatos + 2, 5) = Cells(NroDatos + 2, 4) * 0.18
Cells(NroDatos + 2, 6) = [Link]
Cells(NroDatos + 2, 7) = Cells(NroDatos + 2, 4) + Cells(NroDatos + 2, 5) -
[Link]
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link]
End Sub
Observe que luego de ingresar los datos y los valores calculados a celdas de
la nueva hoja, los controles son puestos en blanco y con la última
instrucción se vuelve activar el cuadro de texto Producto que, de otra
manera, se tendría que hacer clic en dicho cuadro.
Desde <[Link]
Ejemplo 14
El siguiente ejemplo permite manipular datos provenientes desde un cuadro de
texto, ingresados por teclado y los seleccionados de una lista, almacenada en
un cuadro combinado.
Procedimiento
VBA página 85
Al diseñarlo debe insertar un cuadro de texto cuyo nombre sea TxtDatos; un
control de lista, cuyo nombre sea LstLista01, un cuadro combinado que tenga
por nombre CboInfo01 y tres botones de comando: CmdInicio, CmdAceptar y
CmdFin; sus captions se muestra en la imagen.
El código es el siguiente:
Nota:
Observe que no siempre el botón Terminar debe tener una única instrucción. El
archivo se llama [Link].
Desde <[Link]
VBA página 86
1.3. Botón de opción
Este control permite seleccionar un elemento y sólo uno, de una lista de
opciones. El procedimiento que le corresponde al hacer clic es:
Ejemplo 15
En este ejemplo ingresaremos tres botones de opción. Al hacer clic en cada
uno de ellos, se debe emitir un mensaje. La siguiente imagen es una muestra
de este formulario:
Nota:
Sugerimos a nuestro amigo lector que inserte un botón de comando a fin de
tener una forma de terminar el uso de este formulario. Como lo hemos hecho
con todos los formularios colocando End al interior del código del botón.
Desde <[Link]
Ejemplo 16
En este ejemplo colocaremos un grupo de controles de verificación y dos
botones de opción a fin de seleccionar apropiadamente lo que corresponda. El
resultado de la selección se recibirá en un cuadro de texto, que tendrá
activada la propiedad multilínea. La imagen del formulario es la siguiente:
VBA página 87
Los nombres de cada control así como su Caption se da en la siguiente tabla.
Control Nombre, caption
Formulario FrmCasilla, Uso del control de verificación
Opción Opt00, Mujer
Opción Opt01, Varón
Casilla de verificación Chk00, Secundaria completa
Casilla de verificación Chk01, Estudios universitarios
Casilla de verificación Chk02, Estudios de Post Grado
Casilla de verificación Chk03, No tiene experiencia
Casilla de verificación Chk04, Ha viajado al extranjero
Comando CmdActivar, Activar
Comando CmdClear, Limpiar
Comando CmdFin, Salir
Cuadro de texto TxtLista, Propiedad: Mulitiline: True
VBA página 88
[Link] = False
[Link] = False
[Link] = ""
End Sub
Private Sub CmdSalir_Click()
End
End Sub
Nota:
El libro [Link] contiene los últimos formularios de estos ejemplos.
Desde <[Link]
Ejemplo 17
Este ejemplo permite seleccionar un valor para el peso y otro para la edad,
los cuales se visualizan en sus respectivos cuadros de texto.
VBA página 89
Private Sub NroEdad_Change()
[Link] = [Link]
End Sub
Private Sub ScPeso_Change()
[Link] = [Link]
End Sub
Desde <[Link]
VBA página 90
Aplicaciones
lunes, 03 de agosto de 2020 16:50
Procedimiento:
P2. Declaramos las variables HjName y Dni como de tipo String. El primero
para recibir el nombre de la hoja y el segundo para recibir el número de DNI
que se consultará.
VBA página 91
Iz = Iz + 1
Else
Iz = 0
End If
Desde <[Link]
Procedimiento
Como se puede apreciar, al seleccionar el código del cliente, se debe obtener
toda la información. En todos los casos es una simple búsqueda en tablas. El
ítem que se busca debe ser el código del producto y también se debe buscar
por el nombre del cliente. Para ello es suficiente insertar en dond
corresponda dos cuadros combinados. Luego usar la función Indice en todos los
casos.
VBA página 92
casos.
La solución se muestra en el archivo Detalle de [Link].
Desde <[Link]
Procedimiento:
P3. Se grabará una macro que permita imprimir todo lo seleccionado. La macro
se llama MacPrint. Hemos colocado un botón de comando al cual le hemos
asignado dicha macro. La macro se encuentra en el archivo Formato
[Link].
Desde <[Link]
VBA página 93
Tres cuadros de texto. Para ver los datos que se desean almacenar
Tres cuadros de lista. Para almacenar los datos seleccionados
VBA página 94
Para ver la solución al problema, abra el archivo Consulta con
[Link].
Desde <[Link]
En ella se ha usado:
Un cuadro combinado: CboProductos: Para contener la lista de los productos
Cinco cuadros de texto: TxtProducto, TxtPrecio, TxtCantidad, TxtMonto y
TxtFecha.
Sub IngresoVentas()
Workbooks("Ejemplo [Link]").Activate
Hoja = Trim(InputBox("Nombre de hoja. Si va a crear, presione <Intro>"))
If Len(Hoja) > 0 Then
Sheets(Hoja).Activate
Else
VBA página 95
Else
[Link]
[Link] = "Tempo"
Cells(1, 26) = 1
Cells(1, 1) = "Producto"
Cells(1, 2) = "Precio"
Cells(1, 3) = "Cantidad"
Cells(1, 4) = "Monto"
Cells(1, 5) = "Fecha"
End If
[Link]
End Sub
VBA página 96
End Sub
Desde <[Link]
VBA página 97