Las funciones ImputBox y MsgBox

A lo largo de los diferentes ejemplos que he ido insertando, he ido adelantando en la práctica algunos conceptos que, no  he expuesto en profundidad. En el presente post, trataré de explicar las posibles configuraciones que tiene los cuadros de entrada (inputbox) y de mensajes (message-box/MsgBox).

Los primeros permiten introducir datos por teclado. Su sintáxis es la siguiente:

InputBox([prompt],[Title],[Default],{xpos],[ypos],[help file,context])

‘Prompt : Es el texto mostrado en el cuadro de dialogo

‘Title :(opcional)Texto de titulo para el cuadro de dialogo

‘Default :Valor por defecto mostrado en el cuadro de dialogo

‘Xpos,Ypos :La patalla se ubicar segun las cordenadas

‘Helpfile ,context (opcional).el archivo de ayuda

‘Type :Opcional. Expresión numérica que es el número de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente.El tipo de dato devuelto como se ve en la siguiente tabla.

codigo –> SIGNIFICADO
‘——
’0 —–> Una fórmula
’1 —–> Un numero
’2 —–> Una cadena(texto)
’4 —–> Un valor logico(True o False)
’8 —–> Una celda de referencia ,como un objeto de rango
’16 —–> Un error de valor,como #N/A

El MsgBox es el cuadro de respuesta de la API de Windows. Su sintáxis es la siguiente:

Muestra un mensaje en un cuadro de diálogo, espera a que el usuario haga clic en un botón y devuelve un tipo Integer correspondiente al botón elegido por el usuario.


MsgBox(prompt[, buttons][, title][, helpfile, context])

La sintaxis de la función MsgBox consta de estos argumentos con nombre:

prompt Requerido. Expresión de cadena que representa el prompt en el cuadro de diálogo. La longitud máxima de prompt es de aproximadamente 1024 caracteres, según el ancho de los caracteres utilizados. Si prompt consta de más de una línea, puede separarlos utilizando un carácter de retorno de carro (Chr(13)) o un carácter de avance de línea (Chr(10)), o una combinación de caracteres de retorno de carro – avance de línea (Chr(13) y Chr(10)) entre cada línea y la siguiente.
buttons Opcional. Expresión numérica que corresponde a la suma de los valores que especifican el número y el tipo de los botones que se pretenden mostrar, el estilo de icono que se va a utilizar, la identidad del botón predeterminado y la modalidad del cuadro de mensajes. Si se omite este argumento, el valor predeterminado para buttons es 0.
title Opcional. Expresión de cadena que se muestra en la barra de título del cuadro de diálogo. Si se omite title, en la barra de título se coloca el nombre de la aplicación.
helpfile Opcional. Expresión de cadena que identifica el archivo de Ayuda que se utiliza para proporcionar ayuda interactiva en el cuadro de diálogo. Si se especifica helpfile, también se debe especificar context.
context Opcional. Expresión numérica que es igual al número de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente. Si se especifica context, también se debe especificar helpfile.

Valores

El argumento buttons tiene estos valores:

VbOKOnly 0 Muestra solamente el botón Aceptar.
VbOKCancel 1 Muestra los botones Aceptar y Cancelar.
VbAbortRetryIgnore 2 Muestra los botones Anular, Reintentar e Ignorar.
VbYesNoCancel 3 Muestra los botones , No y Cancelar.
VbYesNo 4 Muestra los botones y No.
VbRetryCancel 5 Muestra los botones Reintentar y Cancelar.
VbCritical 16 Muestra el icono de mensaje crítico.
VbQuestion 32 Muestra el icono de pregunta de advertencia.
VbExclamation 48 Muestra el icono de mensaje de advertencia.
VbInformation 64 Muestra el icono de mensaje de información.
VbDefaultButton1 0 El primer botón es el predeterminado.
VbDefaultButton2 256 El segundo botón es el predeterminado.
VbDefaultButton3 512 El tercer botón es el predeterminado.
VbDefaultButton4 768 El cuarto botón es el predeterminado.
VbApplicationModal 0 Aplicación modal; el usuario debe responder al cuadro de mensajes antes de poder seguir trabajando en la aplicación actual.
VbSystemModal 4096 Sistema modal; se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensajes.
VbMsgBoxHelpButton 16384 Agrega el botón Ayuda al cuadro de mensaje.
VbMsgBoxSetForeground 65536 Especifica la ventana del cuadro de mensaje como la ventana de primer plano.
VbMsgBoxRight 524288 El texto se alínea a la derecha.
VbMsgBoxRtlReading 1048576 Especifica que el texto debe aparecer para ser leído de derecha a izquierda en sistemas hebreo y árabe.

Ejemplo:

Sub ejemplo()
Dim pregunta, res1, res2, res3 As String

pregunta = InputBox(“¿Cómo te llamas?”, “Bienvenido”)
res1 = MsgBox(“Hola ” & pregunta, vbExclamation, “Bienvenido”)
res2 = MsgBox(“Hola ” & pregunta, 64, “Bienvenido”)
res3 = MsgBox(“Hola ” & pregunta, 64 + vbMsgBoxRight, “Bienvenido”)
End Sub

Pruebe con las diferentes combinaciones a la hora de programar sus cuadros. Lo interesante es preparar unos cuantos que fácilmente puede implementar en sus programas.

Funciones de conversión de tipos

Existen una gran variedad de funciones de conversión en VBA aunque en la mayoría de casos se hace de forma automática. Las funciones de conversión se utilizan para cambiar el tipo de dato, de una expresión  a fin de poder operar  con ella.

Función  Tipo  Valor que devuelve la función 
CBool Boolean Cualquier cadena o expresión numérica válida
CByte Byte 0 a 255
CCur Currency 922 337 203 685 477,5808 a 922 337 203 685 477,5807
CDate Date Cualquier expresión de fecha válida
CDbl Double -1.79769313486231E308 a -4,94065645841247E-324 para los valores negativos ; 4,94065645841247E-324 a 1,79769313486232E308 para los valores positivos
CDec Decimal +/-79 228 162 514 264 337 593 543 950 335 para los número sin décimales. El rango de numeros  para  28 décimales +/-7,9228162514264337593543950335. El número más pequeño es diferente de cero 0,0000000000000000000000000001
CInt Integer -32 768 a 32 767 , las fracciones se redondean. Las partes decimales se redondean a 0.5 y el número par más cercano
CLng Long 2 147 483 648 a 2 147 483 647 , las fracciones son redondeadas.  Las partes decimales se redondean a 0.5 y el número par más cercano
CSng Single -3,402823E38 a -1,401298E-45 para los valores negativos,  1,401298E-45 à 3,402823E38 para los valores positivos
CStr String Los valores devueltos por la función Cstr de la expresión dependiente
CVar Variant Mismo rango de valores para los números de tipo doble y el tipo de cadenas no númericas.

En el siguiente ejemplo puede ver una forma de convertir datos de tipo numérico a tipo fecha y viceversa:

Sub convierte()
Dim x As Integer
Dim y As Date
x = Cells(1, 1)
Cells(1, 2) = CDate(x)

y = Date
Cells(3, 1) = y
Cells(3, 2) = CLng(y)
End Sub

Funciones Financieras

VBA tiene una serie de funciones financieras además de las que ya tiene Excel, que nos ofrece la oportunidad de crear potentes aplicaciones para finanzas empresariales o personales.

Si desea repasar las funciones financieras de Excel aquí tiene un documento que tal vez pueda ayudarle.

Para estudiar las propias de VBA volvamos al examinador de objetos. Pulse F2 y en el cuadro de búsqueda inserte FINANCIAL. Inmediatamente pordrá ver los miembros de Financial:

Las más usuales son:

rate: tasa fija de interés.

nper:nº de períodos

pmt: pagos o depósitos periódicos.

pv:valor actual del préstamo

fv: valor futuro del préstamo o inversión.

type:tipo de pago o depósito.

El siguiente ejemplo muestra el cálculo de la cuota para un préstamo francés:

Sub otro()
Dim Fmt, FVal, PVal, APR, TotPmts, Tipopago, Pago
Const PERIODFIN = 0, PERIODINI = 1    ‘ Momento de los pagos.
Fmt = “###,###,##0.00″    ‘ Define el formato.
FVal = 0    ‘ Normalmente 0 (crédito).
PVal = InputBox(“¿Cuánto dinero desea solicitar?”)
APR = InputBox(“¿Cuál es la tasa anual porcentual del crédito?”)
If APR > 1 Then APR = APR / 100    ‘ Asegura la forma correcta.
TotPmts = InputBox(“¿Cuantos pagos mensuales va a realizar?”)
Tipopago = MsgBox(“¿Realiza los pagos al final del mes?”, vbYesNo)
If Tipopago = vbNo Then Tipopago = PERIODINI Else Tipopago = PERIODFIN
Pago = Pmt(APR / 12, TotPmts, -PVal, FVal, Tipopago)
MsgBox “El importe del pago será ” & Format(Pago, Fmt) & ” al mes.”

End Sub

 

En la práctica que aquí se expone, se ha realizado el cálculo de las cuotas de un préstami tipo francés mediante Excel:

En F10 se inserta la fórmula siguiente:=(Va*i/q)/(1-(1+i/q)^-(n*q))

Si qusiéramos hacerlo mediante VBA el código asociado sería el siguiente:

Sub prestamo_dos()
Dim cuantia, cuota, tipo, periodos, i, r
Const k = 0.25 / 100

tipo = (Cells(4, 4).Value) / 100
periodos = Cells(5, 4).Value
cuantia = Cells(3, 4).Value

Cells(9, 2) = Cells(4, 4) / 100
For i = 9 To 15
Cells(i, 2).Value = (Cells(i – 1, 2).Value) + k
r = Cells(i, 2).Value
Cells(i, 6) = Abs(Pmt(r, periodos, cuantia))
Cells(i, 5) = Abs(Pmt(r / 2, periodos * 2, cuantia))
Cells(i, 4) = Abs(Pmt(r / 4, periodos * 4, cuantia))
Cells(i, 3) = Abs(Pmt(r / 12, periodos * 12, cuantia))

Next

End Sub

 

 

Funciones de cadenas

Una expresión de cadena devuelve un valor  de datos de tipo String. A continuación veremos la mayoría de las funciones que trabajan con cadenas, previamente aquí tenemos un cuadro de las funciones de cadenas en Excel.

Asc(string) =Código de carácter ANSI correspondiente a la primera letra de la cadena.

Chr(código char)= Carácter que corresponde al código ASCII

CStr(expresión)=Convierte una expresión a String.

Format(expresión,formato)=La expresión en el formato especificado

Ejemplos:

Sub prueba()
Dim a As String
a = InputBox(“Introduzca una palabra”, “Funciones de texto”)
Cells(1, 1) = Asc(a)
Cells(1, 2) = Chr(Cells(1, 1))
Cells(1, 3) = Format(Date, “dd / mmm /yyyy”)
Cells(1, 5).NumberFormat = “#,##0.00 €”

End Sub

(PD Cuando quiera insertar el símbolo euro presione alt gr+ 5)

También tenemos las siguientes expresiones para formatear expresiones:

FormatCurrency(expresión)=Expresión con formato de moneda.

FormatdateTime(expresión)=Id con formato de fecha y hora.

FormatPercent(expresión)=Id formato de porcentaje.

InStr(comienzo,posición1,posición2) Ejemplo: en la celda 1,1 previamente he insertado mi nombre completo, después ejecuto el siguiente código.

Sub prueba_dos()
Dim c, b As String
Dim i As Byte
b = Cells(1, 1)

c = InputBox(“Inserte la letra a buscar”)
MsgBox “La letra ” & c & ” que Vd busca se encuentra en la posición ” & InStr(1, b, c)

End Sub

LCase(expresión)= Convierte a minúsculas y Ucase a mayúsculas. Para poner la primera letra en mayúsculas y el resto minúsculas usamos StrConv(cadena,vbPoperCase).Ejemplo:

Sub letras()
Dim b As String
b = InputBox(“Inserte su nombre”)
Cells(1, 1) = b
Cells(2, 1) = LCase(b)
Cells(3, 1) = UCase(b)
Cells(4, 1) = StrConv(b, vbProperCase)
End Sub

Otras funciones de cadenas:

Left(texto,Nchart)–>devuelve los primeros caracteres de una cadena

Right(id)–>nos devuelve los últimos

Midt(texto, Init, NChar)–>permite extraer del texto una serie de carácteres a partir de “Init”.

Ejemplo:

Sub funciones_cadenas()
Dim palabra As String
palabra = InputBox(“Introduzca una palabra”, “Funciones de cadenas”)
If Len(palabra) = 0 Then
MsgBox “ERROR”
GoTo salida
Else
[A1] = “La palabra que ha introducido ha sido ” & palabra
[A2] = “La función left a partir de la 2ª letra devuelve el carácter :” & Left(palabra, 2)
[A3] = “La función right a partir de la 2ª letra devuelve el carácter :” & Right(palabra, 2)
[A4] = “La función Mid(palabra, 1, 2) devuelve :” & Mid(palabra, 1, 2)
[A5] = “Su palabra tiene ” & Len(palabra) & ” caracteres.”

End If
salida:

End Sub

Funciones matemáticas de VBA

VBA cuenta con funciones matemáticas propias que podemos utilizar en nuestros procedimientos:

Abs(número)–>Valor absoluto

Atn(número)–>Arcotangente de un número

Cos(número)–>Coseno

Exp(número)–>número e como base de los logaritmos naturales

Fix(número)–>La pasrte entera de un número decimal*

Hex(número)–>El valor hexadecimal de un número

Int(número)–>Parte entera del número*

Oct(número)–>El valor octal de un número

Rnd(número)–>Número aleatorio ente 0 y 1.

Sgn(número)–>El signo del número

Sqr(número)–>Raiz cuadrada

Sin(número)–>Seno

Tan(número)–>Tangente

 

(*) La función Fix(n) nos devuelve la porción entera del número. Si este es negativo, Fix  devuelve el primer entero negativo que es mayor que ese número. La función Int(n) nos devuelve el primer entero negativo que es menor o igual que el número.

La función Rnd(número)  genera un número aleatorio entre 0 y 1 con las opciones siguientes:

si número <0 Repite el mismo número cada vez

si número=0 El número generado más reciente

si número>0 El siguiente número aleatorio en la secuencia.

Le inserto aquí un código para que compruebe los resultados.

Sub prueba()
Dim i As Byte
Dim j As Integer

principio:
j = Int(Val(InputBox(“Escoja un número positivo “, “Función Random”)))
If j < 0 Then
MsgBox “Error debe escoger un número positivo”
GoTo principio
Exit Sub
Else
For i = 1 To 15
Cells(i, 1) = Rnd(-j)
Cells(i, 2) = Rnd(0)
Cells(i, 3) = Rnd(j)
Next

End If
End Sub

La necesidad de trabajar con números aleatorios surge muy a menudo. A veces necesitamos trabajar con un abanico más amplio que de 0 a9. Aquí le expongo la fórmula que ha de emplear en tal caso:

Int((superior-inferior)*Rnd + inferior

Ejemplo número aleatorio entre 25 y 100

Sub prueba2()
Cells(1, 1) = Int((100 – 25) * Rnd + 25)
End Sub

 

FUNCIONES (funciones de comprobación)

Podemos utilizar innumerables funciones dentro de VBA. También se pueden usar las propias de Excel, llamándolas desde un procedimiento o función. Por último podemos crear nuestras propias funciones. Una posible agrupación sería la siguiente:

  • Funciones de comprobación.
  • Funciones de cadenas.
  • Funciones matemáticas.
  • Funciones de conversión de tipos.
  • Funciones MsgBox e InputBox.
  • Definidas por el usuario.

Funciones de comprobación

Las funciones tienen la particularidad de que nos devuelven un valor. Las funciones de comprobación, que son las primeras que voy a abordar son muy útiles al permitirnos validad o comprobar los tipos de datos, bien los insertados en una celda o los introducidos por teclado.

Lista de Funciones de Comprobación.

IsNuméric(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como numérico.

IsDate(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como tipo fecha.

IsEmpty(Expresión). Comprueba que expresión tenga algún valor, que se haya inicializado.

IsError(Expresión). Comprueba si expresión devuelve algún valor de error.

IsArray(Expresión). Comprueba si expresión (una variable) es un array o no.

IsObject(Expresión). Comprueba si expresión (una variable) representa una variable tipo objeto.

IsNull(Expresión). Comprueba si expresión contiene un valor nulo debido a datos no válidos.

Función IsEmpty

Nos comprueba si una celda o rango está vacío, no hay datos.

Sintaxis

IsEmpty(expresión)

El argumento expresión requerido es un tipo de datos Variant que contiene una expresión de cadena o una expresión numérica. Sin embargo, ya que la función IsEmpty se utiliza para determinar si las variables individuales están inicializadas, el argumento expresión es generalmente un único nombre de variable.

Ejemplo:

Comprobamos si en la celda B1 de la hoja activa hay datos:

Sub ejemplo()
Dim mensaje As String

If IsEmpty(ActiveSheet.Range(“B1″)) Then

MsgBox Prompt:=”la casilla B1 está vacía”, Title:=”ERROR”

Else
mensaje = ActiveSheet.Range(“B1″)
MsgBox “En la casila B1 hay este dato :  ” & mensaje
End If

End Sub

Es complicado utilizar utilizar IsEmpty con datos recogidos por teclado mediante la función InputBox. Y ello es así porque esta función devuelve datos de tipo variant o sea cualquier expresión que se pueda evaluar a datos numéricos, de cadena o de fecha. Para entenderlo mejor modifique el código anterior por este otro:

Sub ejemplo2()
Dim mensaje

mensaje = InputBox(“Usuario”)
If IsEmpty(mensaje) Then

MsgBox Prompt:=”usuario?”, Title:=”ERROR”

Else

MsgBox “Hola ” & mensaje
End If
End Sub

Como comprobará la función IsEmpty no evalúa la cadena vacía, ya que InputBox en ese caso devolvería un cero.

Función IsNumeric/Función IsDate

Nos comprueba si una expresión se evalúa como un número, para IsNumeric o fecha para IsDate Por ejemplo evaluamos si en la celda activa hay valores numéricos:

Sub comprueba()
If Not IsNumeric(ActiveCell.Value) Then
MsgBox “Error”
Else
MsgBox “Los valores son numéricos”

End If

End Sub

Función IsObject

La función IsObject es útil solamente para determinar si un tipo de datos Variant es de VarType vbObject. Ejemplo:

Sub Obj()

Dim R As Range

‘ Si la variable R es Nothing es que no ha sido asignada, no se puede trabajar con ella

If R Is Nothing Then

MsgBox Prompt:=”La variable Objeto no ha sido asignada”, Buttons:=vbOK, _
Title:=”Error”

Else

R.Value = “Hola”

End If

End Sub

Aquí un ejemplo resumen:

Sub comprueba()
Dim cadena As Variant
cadena = ActiveCell.Value

If IsEmpty(cadena) Then
MsgBox “La celda no contiene datos”

ElseIf IsNumeric(cadena) Then
MsgBox “La celda contiene datos numéricos”

ElseIf IsDate(cadena) Then
MsgBox “La celda contiene datos tipo fecha”

ElseIf Not IsArray(cadena) Then
MsgBox “La celda no es un array”

Else
MsgBox “No hay nada para evaluar”
End If

End Sub