Anexo. Editor de Visual Basic para Excel
Anexo. Editor de Visual Basic para Excel
Anexo. Editor de Visual Basic para Excel
0
1
6
Puede usar tambin, <ALT> +<F8>, luego seleccionar la macro y hacer clic en <Modificar>.
Todo lo que se puede hacer en el editor, est relacionada con programas. La filosofa de programacin
usada en este editor, es el de la Programacin Orientada a Objetos (POO), la que nos permitir hacer
modificaciones sobre la programacin subyacente a una macro y crear nuestros propios programas. Un
programa es, en principio, una secuencia de pasos o instrucciones que escribimos para resolver un
problema en particular.
Propiedades
Las propiedades son las caractersticas, atributos, formas o aspectos del o bjeto, a las que se hace
referencia mediante el uso de variables. Una propiedad de objeto comn de Excel es su Nombre, que
nos permitir usarlos en los diferentes usos que hagamos del objeto. De manera que una celda, un rango
de celdas, una hoja, libro, grfico o tabla en Excel, tendr un nombre con el cual lo identificaremos.
Para hacer referencia a las propiedades mediante los programas en VBA, se usa la sintaxis:
Ejemplo:
Range("A5").Name Aqu se hace referencia al nombre del objeto Range de la celda A5.
Mtodos
Un mtodo es una accin, un procedimiento (un hilo), que tiene efectos sobre un objeto.
Ejemplo:
Range("A5").Select Aqu se ejecuta el mtodo Select, que permite activar la celda A5 y ponerla en
disponible para cualquier otra operacin.
Eventos
Un evento es el resultado de una accin, es la forma cmo queda el objeto despus de alguna accin
sobre l. Por lo general estas acciones son producidas por los mtodos que actan sobre el objeto.
Excel incluye varios controladores de eventos, o rutinas de cdigo, que controlan acciones
determinadas. Cuando ocurre una de dichas acciones, y ha comunicado a Excel qu desea que haga
cuando ocurra el evento, Excel ejecuta el cdigo del controlador de eventos. Por ejemplo, si despus de
crear un nuevo libro desea que Excel muestre todos los libros abiertos como un conjunto de ventanas
en cascada, puede crear el siguiente controlador de eventos:
Application.Windows.Arrange xlArrangeStyleCascade
End Sub
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, concntrese en la lnea del medio del cdigo, 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 accin que desea que se ejecute cada vez que ocurra un evento determinado, puede ut ilizar
el lenguaje VBA para que se ejecute automticamente y as ahorrarse el trabajo.
Una coleccin 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 ms hojas de clculo, podemos decir que un libro es una coleccin
de hojas de clculo. As las cosas, podemos ejecutar algn mtodo sobre esta coleccin a fin de realizar
la misma accin sobre todas ellas. Por ejemplo, seleccionar tres hojas y darle un determinado formato.
For i = 1 to 3
Worksheets(i).PageSetup.RightFooter = Path
Next i
En vez de incrementar el valor en un bucle ForNext, el bucle For EachNext busca simplemente el
siguiente elemento de la coleccin Worksheets (hojas de clculo) y se detiene cuando no encuentra
uno.
El Editor de Visual Basic muestra distinta informacin en distintas ventanas. Estas ventanas pueden
contener a uno o ms mdulos (macros) o pueden hacer referencia a las propiedades de los objetos
contenidos en la hoja o libro.
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, seleccinela primero, luego en la ventana propiedades, haga clic en la
propiedad <Visible> y seleccione la opcin <xlSheetHidden>
Ventana de Cdigo
La ventana de Cdigo es la ventana que dispone de mayor tamao en el Edi tor 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 slo con cdigo, el
cuadro muestra el objet o General predeterminado. El cuadro de lista de la derecha (cuadro de
Procedimiento) se utiliza para seleccionar macros individuales del mdulo actual. Segn se agreguen o
eliminen macros en el mdulo, se agregarn y eliminarn en el cuadro Procedimiento.
Variables
Puesto que todo lo que se realiza en el computador, debe ser guardado en la memoria, cada uno de
los datos deben tener un lugar en ella a donde guardarlos. Para ello es necesario el uso de las variables.
Mediante el uso de las variables y tambi n constantes, podemos almacenar cada uno de los datos o
constantes en una localidad de la memoria.
Esto implica que, para acceder a dichas localidades, es necesario el uso de las variables. Estas tienen
un nombre. El nombre puede estar formado por una let ra, seguido de uno o ms caracteres literales o
numricos. Estos nombres son nicos; es decir, ninguna otra variable puede tener el mismo nombre.
Naturalmente, la variable se puede usar en diferentes mbitos o secciones; en cada una de ellas, el
mismo nombre de variable puede ser usado para propsitos distintos; sin embargo, el nombre de una
variable tambin puede ser definido para ser vlido en todos los mbitos.
Nota:
El nombre de una variable puede estar escrito en minsculas, maysculas o combinarlas afin de darle
cierto sentido respecto a su contenido.
Sintaxis:
Tipos de variable
Tamao de
Tipo de datos Intervalo
almacenamiento
Byte Entero de un byte 0 a 255
Bolean Lgico de dos True o False
bytes
Integer Entero de dos -32,768 a 32,767
bytes
Long Entero largo de 4 -2,147,483,648 a 2,147,483,647
(entero largo) bytes
Single Decimal de 4 -3,402823E38 a 1,401298E-45 para valores
(coma flotante/ bytes negativos; 1,401298E-45 a 3,402823E38 para
precisin valores positivos
simple)
Double Decimal de 8 -1.79769313486231E308 a
(coma flotante/ bytes -4,94065645841247E-324 para valores
precisin doble) negativos; 4,94065645841247E -324 a
1,79769313486232E308 para valores
positivos
Currency Entero de 8 bytes -922.337.203.685.477,5808 a
(entero a escala) 922.337.203.685.477,5807
Decimal Nmeros reales +/-79.228.162.514.264.337.593.543.950.335
con decimales sin punto decima l;
hasta de 28 +/-7,9228162514264337593543950335 con
dgitos (14 bytes) 28 posiciones a la derecha del signo decimal;
el nmero ms pequeo distinto de cero es
+/-0,0000000000000000000000000001
Date Usado para 1 de enero de 100 a 31 de diciembre de 9999
fechas de 8 bytes
Object 4 bytes Cualquier referencia a tipo Object
String Usado para datos Desde 0 a 2.000 millones
(longitud de texto de 10
variable) bytes
String Como el anterior, Desde 1 a 65.400 aproximadamente
(longitud fija) pero de longitud
fija
Ejemplos
DIM Xtot, Zdat As Double Xtot y Zdat sern usados como variables reales
DIM XTitulo, Nom01, Nom02 As String Usados para contener datos literales
Clases de variables
Variables Locales
Las variables Locales son aquellas que se declaran dentro de un mdulo o procedimiento y
slo pueden ser utilizadas en ste. stas dejan de existir una vez que el procedimiento termina
su ejecucin. Se pueden usar en otros mdulos oprocedimientos, pero sus caractersticas nada
tienen que hacer con la declaracin dada en otro mdulo o procedimiento. Para declararlas se
debe usar la sentencia DIM.
Por ejemplo:
Sub procedimiento()
Dim nDat As Integer
Dim Cadena As String
Sentencias ....
End Sub
Variables Pblicas
Si se quiere que una variable est disponible para todos los procedimiento s de todos los mdulos
VBA de un proyecto, se la debe definir a travs de la sentencia PUBLIC (y no DIM).
Por ejemplo:
Variables Estticas
Si se desea que una variable definida en un proced imiento conserve su valor una vez
terminado ste, e ingresado a otro procedimiento, sta se debe definir a travs 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 rpidamente errores o uso no deseado en el nombre de la variable. Esta sentencia se
debe escribir al comienzo del mdulo.
Constantes
A diferencia de la variables, cuyo valor cambia al ejecutarse un procedimiento, hay valores que no
cambian durante la ejecucin de un procedimiento, stos valores se denominan Constantes. Las
constantes se definen a travs de la sentencia Const. Por ejemplo;
Las constantes tambin pueden declararse como Pblicas para que estn disponibles en todos los
procedimientos de todos los mdulos, esto se hace a travs de la sentencia PUBLIC
Para definir constantes Locales, basta definirlas a travs de la sentencia Const dentro de un
procedimiento o funcin.
Mdulos
Un mdulo es un ambiente, es un entorno de trabajo compuesto por sentencias de declaracin de
variables y por uno o ms procedimientos.
Estando en el Editor del Visual Basic, para disponer de un Mdulo, se debe usar la siguiente secuencia
de comandos: <Insertar> - <Mdulos>, como se indica en la siguiente imagen.
Procedimientos
Un procedimiento est formado por un conjunto de sentencias que permite resolver un problema. Un
mdulo est formado por uno o ms procedimientos. Un procedimiento se declara a travs de la
sentencia Sub y puede ser Privado, Pblico o Esttico.
Procedimiento Privado
Un procedimiento privado slo es accesible por otros procedimientos dentro del mismo mdulo. Su
sintaxis es:
Procedimiento Pblico
Un procedimiento pblico es accesible por todos los procedimientos de todos los mdulos VBA de un
proyecto, su sintaxis es:
Para que las variables de un procedimiento se conserven una vez terminada su ejecucin, ste debe
definirse como Esttico:
La sentencia Sub y End Sub son obligatorias al definir cualquier procedimiento. Los argumentos y las
sentencias Private, Public y Static son opcionales. Es importante mencionar que al definir un
procedimiento sin ninguna de las sentencias anteriores, por defecto ste se define como Pblico, es
decir:
Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
End Sub
Es equivalente a :
Public Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
End Sub
Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
Exit Sub
[Sentencias]
End Sub
Para llamar a un procedimiento desde otro procedimiento, se puede utilizar la senten cia Call o
simplemente el nombre del procedimiento. Por ejemplo:
La sentencia Call se utiliza cuando se requiere llamar a un procedimiento al cual hay que pasarle un
argumento, por ejemplo:
Sub Procedimiento1(argumento1,argumento2,.....)
[Sentencias]
indice= ........
Call Proced2(indice)
[Sentencias]
End Sub
Argumentos
Los argumentos pueden ser pasados a un procedimiento por referencia (por defecto los argumentos
se pasan de esta forma) o por valor. Cuando un argumento es pasado por referencia, se pasa lavariable
misma al procedimiento llamado, por lo que los cambios que se producen en la variable son devueltos
al procedimiento principal (al que llam al otro). En cambio, cuando un argumento es pasado por valor,
se pasa una copia de la variable al procedimiento llamado por lo que los cambios que se producen en la
variable no son devueltos al procedimiento principal. Para pasar un argumento por valor, se utiliza la
sentencia ByVal, por ejemplo:
Pasar argument os por valor es til cuando se requiere conservar el valor original de una variable
despus de llamar a otro procedimiento.
Al especificar los argumentos de un procedimiento tambin es posible definir el tipo de dato, por
ejemplo se puede definir un procedimiento de la siguiente forma :
Ejemplo 1
XTot = 120
SumaTot = SumaTot + Num01
XTitulo = "Cuadro de ventas consolidadas"
Ejemplo 2
Ejemplo 3
Tasa = 0.19
Cantidad = 120
PrecioUnit = 25.80
MontoNeto = Cantidad * PrecioUnit Cantidad * PrecioUnit * Tasa
Preparado por: Carlos Alberto Valencia Garca
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 usarn los mismos valores y, como tal, aquellas que
dependen de ellas tambin contendrn los mism os 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.
En VBA los datos se ingresan usando el mtodo InputBox() el cual abre una ventana de dilogo. La
sintaxis de este mtodo es:
donde:
Prompt Cadena de caracteres, requerido. Es usado como informacin al usuario sobre lo que se le
pide que ingrese.
Title Cadena de caracteres de tipo Variant, opcional. Es usado para colocarlo en la barra de
ttulo de la ventana de dilogo.
Default Es opcional. Es el valor que se asigna a la variable receptora, si no se digita ningn dato.
Nota:
Todos los ejemplos de aqu en adelante, pueden ser probados copiando hacia la ventana de cdigo,
correspondiente a un mdulo. Si no hubiera ningn mdulo, haga clic en el coman do <Insertar>, luego
en <Modulo>.
Para ejecutar un procedimiento contenido en un mdulo, haga que el cursor se encuentre al interior
del procedimiento a ser ejecutado; luego haga clic en . Para detener la ejecucin de un procedimiento
Ejemplo 4
En este ejemplo se pide ingresar un nmero y que, si no se digita, la variable Num recibir el valor
que se asume, 120. La ventana de dilogo tendr por ttulo "Ingreso de datos", se desplegar a partir de
las coordenadas (4830, 2210) de la pantalla (en pixels). En la siguiente instruccin no se coloca un ttulo,
si no se digita una expresin, la variable texto contendr "Hola Per" y cambiar de posicin.
Sub datos()
Num = InputBox("Ingresa un nmero", "Ingreso de datos", 120, 4830, 2210)
Texto = InputBox("Hola Per", , 5, 1200, 4800)
End Sub
Para poder emitir o imprimir en pantalla el contenido de una variable o el resultado de un clculo, se
usa la funcin MsgBox (), el cual abre una ventana en cual se visualizar todos los resultados emitidos.
La sintaxis de este mtodo es el siguiente:
Donde:
Prompt Cadena de caracteres de hasta 1024 bytes. Si ocupa ms de una lnea se pue de separar
usando el carcter de retorno de carro CHR(13), o un carcter de avance de lnea CHR(10) o una
combinacin de los dos: CHR(13)+CHR(10).
Botones Permite mostrar u determinado tipo d botn a travs de un icono. La siguiente tabla muestra
la lista de las variables internas usadas para mostrar el icono.
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
El siguiente ejemplo muestra el uso de los botones para mostrar sus respectivos iconos
Ejemplo 6
Sub Botones
Dim Msg, ComboBotones, Ttulo, Ayuda, Ctxt, Respuesta, MiCadena
Msg = "Desea continuar?"
ComboBotones = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.
Ttulo = "Prueba de la funcin MsgBox con botones" ' Define el ttulo.
Ayuda = "DEMO.HLP" ' Define el archivo de ayuda.
Ctxt = 1000 ' Define el tema
' el contexto
Res = MsgBox(Msg, ComboBotones, Ttulo, Ayuda, Ctxt) ' Muestra el mensaje.
End Sub
Sintaxis
If ExpresionCondicional Then
[ Sentencias 1 ]
Else
[ Sentencias 2 ]
End If
Sub Potencia
x = InputBox("Ingresa un nmero 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
tambin; sin embargo, en un procedimiento formal y bastante grande, se recomienda hacerlo.
Nota
En esta tabla el rango de los datos numricos se denomina DATO. La celda C3 contiene un
nmero aleatorio entre 0 y 1. A14 = "Ilmer", B14 = "Cndor", A15 = "Ilmer Cndor
Espinoza", A16 = "XP203".
Escriba un cdigo que, al ingresar dos nmeros, los imprima en forma ordenada (creciente)
Sub Ordena01()
Dim Num1, Num2 As Integer
Num1 = InputBox("Ingrese el primer nmero")
Num2 = InputBox("Ingrese el segundo nmero")
If Num1 < Num2 Then
MsgBox ("Numero menor: " & Num1 & Chr(13) + Chr(10) & "Nmero mayor: " & Num2)
Else
MsgBox ("Numero menor: " & Num2 & Chr(13) + Chr(10) & "Numero mayenor: " & Num1)
End If
End Sub
Ejemplo 9
Sub ordena02()
Dim Num1, Num2, Num3 As Double
Num1 = InputBox("Ingresa el primer nmero")
Num2 = InputBox("Ingresa el segundo nmero")
Num3 = InputBox("Ingresa el tercer nmero")
If Num1 < Num2 Then
If Num2 < Num3 Then
MsgBox ("Los nmeros ordenados: " + Chr(13) + Chr(10) & Num1 & Chr(13) + Chr(10) & Num2 & Chr(13) + Chr(10) & Num3)
Else
MsgBox ("Los nmeros 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 nmeros ordenados: " + Chr(13) + Chr(10) & Num2 & Chr(13) + Chr(10) & Num1 & Chr(13) + Chr(10) & Num3)
Else
MsgBox ("Los nmeros ordenados: " + Chr(13) + Chr(10) & Num2 & Chr(13) + Chr(10) & Num3 & Chr(13) + Chr(10) & Num1)
End If
Else
MsgBox ("Los nmeros ordenados: " + Chr(13) + Chr(10) & Num3 & Chr(13) + Chr(10) & Num2 & Chr(13) + Chr(10) & Num1)
End If
End If
End Sub
Esta sentencia permite ejecutar una o ms sentencias segn el valor que tenga determinada variable.
A diferencia de la sentencia IF, esta puede presentar muchas opciones del mismo nivel.
Sintaxis
Ejemplo 10
Sub SelCase()
Dim Indice
Indice = InputBox("Ingrese un nmero entre 1 y 10")
Numero = 8
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
Ejemplo 11
El siguiente procedimiento genera dos nmeros 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
Sentencias repetitivas
Sintaxis
Para ello requiere de una variable que funciona a modo de ndice (VarIndice) el cual
empieza en un primer valor (ValInit), por cada iteracin que se realiza, se incrementa en una
determinada cantidad (Incr), hasta llegar al extremo (ValFinal), despus del cual, continua con
la siguiente sentencia, debajo de Next. Si el incremento es la unidad, no se usa STEP Incr
Ejemplo 12
Ejemplo 13
Los siguientes datos corresponden a las superficies ocup adas por un conjunto de viviendas recin
construidas. Se trata de determinar si el precio de la vivienda est en funcin a la superficie y en qu
grado de correlacin est.
rea Valor
(Y) (X)
100 40
140 49
150 54
150 56
130 48
120 46
100 41
160 56
180 62
140 50
120 45
Se trata de obtener las siguientes estadsticas: El promedio de superficie por vivienda y el valor
promedio, el modelo lineal que exista.
Para ello tenemos las siguientes frmulas: La ecuacin a ser estimada es:
Sub Regre01()
Dim I, N As Integer
Dim SX, SX2, SY, SXY, Bo, B1 As Double
Dim MX, MY As Variant
' MX y MY contendrn la media de X e Y, respectivamente
' Se lee el nmero de datos a procesar
N = InputBox("Numero de datos:")
' Inicializacin de las sumas
SX = 0: SY = 0: SX2 = 0: SXY = 0
Preparado por: Carlos Alberto Valencia Garca
For I = 1 To N
Cadena = InputBox("Ingrese el para de datos, separados por coma")
X = Val(Left(Cadena, 3))
Y = Val(Right(Cadena, 2))
SX = SX + X
SY = SY + Y
SX2 = SX2 + X ^ 2
SXY = SXY + X * Y
Next
MX = SX / N
MY = SY / N
B1 = (N * SXY - SX * SY) / (N * SX2 - SX ^ 2)
Bo = MY - B1 * MX
' Emisin de resultados
MsgBox ("Total de datos: " & N)
MsgBox ("Superficie media = " & MX)
MsgBox ("Valor promedio = " & MY)
MsgBox ("Coeficiente Bo = " & Bo)
MsgBox ("Coeficiene de regresin = " & B1)
MsgBox ("La ecuacionde regresin es: Y = " & Bo & " + " & B1 & " X")
End Sub
Esta instruccin permite ejecutar un conjunto de sentencias incluidas en su mbito, hasta que
alguna condicin se cumpla.
Sintaxis
WHILE Condicion
[ Sentencias ]
WEnd
Al interior del bucle del While debe haber alguna forma de actualizar la "Condicion" a fin de
permitir que el While termine en algn momento.
Ejemplo 14
El siguiente ejemplo permite ingresar una serie de nmeros hasta presionar <Enter>, en cuyo
caso imprime la suma de todos ello.
Sub DoWhile()
Ix = Val(InputBox("Ingeresa un nmero; para terminar, presiona <Enter>"))
Suma = 0
While Ix > 0
Suma = Suma + Ix
Ix = Val(InputBox("Ingeresa un nmero; para terminar, presiona <Enter>"))
Wend
MsgBox ("La suma obtenida es = " & Suma)
End Sub
Preparado por: Carlos Alberto Valencia Garca
Ejemplo 15
Solucin
Leeremos carcter por carcter hasta encontrar un espacio en blanco, luego se imprimir lo
extrado
El cdigo 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
Tercero : Mientras el valor de Code no sea "=", se pide otro nmero que ejecuta la
operacin indicada por Code, con el nmero previamente ingresado. Si se ha digitado "=", sale
del bucle del While y emite el resultado.
El cdigo es el siguiente:
Sub Calculator()
Dim Op As Double
' Lee el primero valor
Op = Val(InputBox("Ingrese un nmero"))
' Lee el cdigo de operacin
Code = InputBox("Codigo de operacin")
' Va a iterar mientras el valor de Code no sea "=".
Preparado por: Carlos Alberto Valencia Garca
While Code <> "="
Select Case Code
Case "+"
Op = Op + Val(InputBox("Digite el nmero"))
Case "-"
Op = Op - Val(InputBox("Digite el nmero"))
Case "*"
Op = Op * Val(InputBox("Digite el nmero"))
Case "/"
Op = Op / Val(InputBox("Digite el nmero"))
Case "^"
Op = Op ^ Val(InputBox("Digite el nmero"))
Case Else
MsgBox ("Cdigo invlido. Reinicie todo...")
End
End Select
Code = InputBox("Cdigo de operacin")
Wend
MsgBox ("Resultado = " & Op)
End Sub
Ejemplo 18
El siguiente cdigo 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 cdigo 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)
Cad = Cad + Xc
I=I+1
Xc = Mid(cadena, I, 1)
Wend
Valor2 = Val(Cad)
MsgBox Valor1 & " " & Valor2
End Sub
Preparado por: Carlos Alberto Valencia Garca
Ejemplo 20
Escriba un procedimiento que permita obtener la suma y el promedio de un conjunto de n datos, ledos
desde el teclado.
Solucin
Como en el ejemplo anterior, usaremos Datos como nombre del arreglo que recibir los datos
ingresados; usaremos tambin la variable Suma que contendr la suma de todos los datos in gresados
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 podra realizar la suma a la vez que se van leyendo los datos.
Sub Arreglos02()
Dim Datos(10) As Double
Dim Suma, Prom As Double
Suma = 0
N = InputBox("Numero de datos a ser ledos")
For I = 1 To N
Datos(I) = InputBox("Ingrese el dato: ")
Next
' Obtencin de la suma
For I = 1 To N
Suma = Suma + Datos(I)
Next
' Clculo del promedio
Prom = Suma/N
' Impresin 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 anterior ( 20), 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
' Inicializacin de las sumas
SX = 0: SY = 0: SX2 = 0: SXY = 0
' Ingreso del nmero de datos
N = InputBox("Ingrese el nmero de datos a procesar")
For I = 1 To N
Cadena = InputBox("Ingrese el para de datos")
L = Len(Cadena)
' Extrae el primer nmero y almacena en el vector MatY
Y = ""
Xc = Mid(Cadena, 1, 1)
JPos = 1
While Xc <> ","
Observacin:
En el ejemplo anterior, como ver, hemos extrado los caracteres contenido en la variable "cadena",
carcter por carcter hasta encontrar ",". Repite el mismo procedimiento para extraer el segundo dato.
Ms adelante veremos otra forma de extraer los nmeros (Ver Ejemplo 8 de la seccin Objeto Range).
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 t odo
procedimiento, en forma global.
El siguiente ejemplo ilustra la forma cmo se llam a a un procedimiento que se encarga de leer dos
datos, se llama otro procedimiento que calcula el producto de los valores ledos, se imprime en el
llamador los valores ledos y se llama a otro para que imprima el resultado devuelto por el procedimiento
de clculo.
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
Preparado por: Carlos Alberto Valencia Garca
Sub Imprime(z)
MsgBox ("Calculado en un procedimiento e impreso en otro: " & z)
End Sub
Funciones
Como hemos dicho antes, un procedimiento tambin puede estar constituido por una funcin.
[ Sentencias ]
End Function
La diferencia entre el procedimiento estndar que hemos descrito y este otro que es una funcin est
en que un procedimiento funcin devuelve un valor (aunque sea nulo), mientras que un procedi miento
estndar no devuelve valor alguno.
El hecho que un procedimiento pase algunos valores a otro no es lo mismo que la capacidad que
tienen las funciones de devolver un resultado.
Tanto un procedimiento que devuelve un resultado como una funcin que devuelve un resultado tienen
su semejanza y su diferencia de uso, dependiendo del contexto en donde se encuentran.
Ejemplo 24
El siguiente procedimiento ProcPrin llama a otro procedimiento Lee, que se encarga de leer dos
valores, e imprime el valor devuelto p or la funcin Decide quien se encarga de determinar si se debe
sumar o multiplicar los valores ledos.
El cdigo 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
Escriba una funcin que permita calcular las races de una ecuacin cuyos coeficientes son
conocidos y se ingresan en tres celdas de una hoja.
Solucin
Daremos por nombre a la funcin: FRaiz1 aquella funcin que nos devuelv e la primera raz
y FRAiz2 a la que devuelve la segunda raz. En cuanto a los parmetros sern A, B y C. El
cdigo correspondiente es el que sigue.
Function FRaiz1(a, b, c)
If (b * b - 4 * a * c < 0) Then
MsgBox "Las races son imaginreas"
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 races son imaginreas"
Return
Else
FRaiz2 = (-b - Sqr(b * b - 4 * a * c)) / (2 * a)
End If
End Function
Una vez que ha creado una determinada funcin, para verificar su adicin al conjunto de
funciones, haga uso del asistente y seleccione la categora de "Funciones definidas por el
usuario". All encontrar una lista de ellas.
Para usarla, puede hacer uso del asistente de funciones o digitar en la celda donde desee el
resultado como sigue:
Nota:
Ejemplo 27
Implemente una funcin que permita calcular la raz n sima de un nmero. La funcin debe ser
capaz de obtener races impares de valores negativos y emitir un mensaje si se pretende obtener raz
par de un valor negativo.
Solucin
Llamaremos r a la funcin que recibir dos parmetros: A que contendr el nmero a quien se le
saque la raz y N que ser la cantidad radical.
Primero debe verificar si el nmero a ser usado como cantidad radical par o no. Si es par debe verificar
si el valor es negativo. Si as fuera, devuelve la raz pedida, en caso contrario, emite un mensaje de error
pues no se puede obtener un radical par de un valor negativo.
La funcin 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 raz 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
Solucin
La rutina principal se encargar de pedir que se ingrese el cdigo de operacin a realizar. 1 = Factorial;
2 = Permutaciones; 3 = Permutaciones con repeticin; 4 = Combinaciones
Observe cmo se pide el ingreso de los datos, dentro de los argumentos que se pasan a la funcin.
A continuacin, se da el cdigo:
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 repeticin 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 funcin permite extraer los primeros "NChar" caracteres de la cadena "Texto"
=Right(Texto, NChar)
Contrario a la anterior, esta funcin permite extraer de la cadena "Texto", los iltimos "NChar"
caracteres.
Esta funcin permite extraer de Texto, "NChar" caracteres a partir del carcter "Init"
=Instr(Texto1, Texto2,[Inicial])
Esta funcin devuelve la posicin inicial en que se encuentra la cadena Texto2, dentro de la cadena
Texto1. Esto lo hace examinando a partir de la posicin Inicial.
Ejemplo
Sub Apellidos_Y_Nombres()
Texto = InputBox("Ingresa tus apellidos y nombres (Ap Am, Nombres)")
ApPaterno = Left(Texto, InStr(Texto, " "))
ApMaterno = Mid(Texto, InStr(Texto, " "), Len(Texto) - InStr(Texto, ",") - 6)
Nombres = Right(Texto, Len(Texto) - InStr(Texto, ","))
MsgBox ApPaterno
MsgBox ApMaterno
MsgBox Nombres
End Sub