5. Funciones y procedimientos
5.1. Funciones predefinidas de vbscript
La riqueza de un lenguaje deriva en gran medida de su biblioteca de funciones, que pueden encapsularse en objetos conocidos como métodos. En este sentido, vbscript puede considerarse bastante pobre.
La siguiente tabla define las funciones no objeto de VBScript. No entraremos aquí en detalles. Su nombre es generalmente una indicación de su función. El lector debe consultar la documentación para conocer los detalles de una función en particular.
Abs | Array | Asc | En |
CBool | CByte | CCur | CDate |
CDbl | Chr | CInt | CLng |
Conversiones | Cos | CreateObject | CSng |
Fecha | DateAdd | DateDiff | DatePart |
DateSerial | DateValue | Día | Matemáticas derivadas |
Eval | Exp | Filtro | FormatCurrency |
FormatDateTime | FormatNumber | FormatPercent | GetLocale |
GetObject | GetRef | Hex | Hora |
InputBox | InStr | InStrRev | Int, Arreglos |
IsArray | IsDate | IsEmpty | IsNull |
IsNumeric | IsObject | Join | LBound |
LCase | Izquierda | Len | LoadPicture |
Registro | LTrim; RTrim; y Embellecedores | Matemáticas | Medio |
Minuto | Mes | MonthName | MsgBox |
Ahora | Octubre | Replace | RGB |
Derecha | Rnd | Redondo | ScriptEngine |
ScriptEngineBuildVersion | ScriptEngineMajorVersion | ScriptEngineMinorVersion | Segundo |
SetLocale | Sgn | Sin | Espacio |
Split | Sqr | StrComp | String |
Tan | Tiempo | Temporizador | TimeSerial |
TimeValue | TypeName | UBound | UCase |
VarType | Entre semana | WeekdayName | Año |
5.2. Programación modular
Describir la solución programada a un problema significa describir la secuencia de acciones elementales que puede ejecutar el ordenador para resolver el problema. Dependiendo del lenguaje, estas operaciones elementales son más o menos sofisticadas. Por ejemplo, existen
- leer datos del teclado o del disco
- escribir datos en pantalla, impresora, disco, etc
- calcular expresiones
- desplazarse por un fichero
- ...
Describir un problema complejo puede requerir varios miles de estas instrucciones elementales y mucho más. Por lo tanto, es muy difícil para la mente humana tener una visión global de un programa. Dada esta dificultad para captar el problema en su conjunto, lo descomponemos en subproblemas más sencillos de resolver. Consideremos el siguiente problema: Ordenar una lista de valores numéricos escritos en el teclado y mostrar la lista ordenada en la pantalla.
Inicialmente, la solución puede describirse del siguiente modo:
début
lire les valeurs et les mettre dans un tableau T
trier le tableau T
écrire les valeurs triées du tableau T à l'écran
fin
El problema se ha descompuesto en 3 subproblemas, más sencillos de resolver. La redacción algorítmica suele ser más formalizada que la anterior y el algoritmo se escribe como sigue:
donde T representa una matriz. Las operaciones
son operaciones no elementales que, a su vez, deben describirse mediante operaciones elementales. Esto se hace en lo que se conoce como módulos. Los datos T se denominan parámetros de módulo. Se trata de información que el programa llamante pasa al módulo llamado (parámetro de entrada) o recibe de éste (parámetro de salida). Los parámetros de un módulo son, por tanto, la información intercambiada entre el programa que llama y el módulo llamado.
módulo lire_tableau(T) | ![]() |
módulo trier_tableau(T) | ![]() |
módulo escribir_tabla(T) | ![]() |
El módulo lire_tableau(T) podría describirse del siguiente modo:
début
écrire "Tapez la suite de valeurs à trier sous la forme val1 val2 ... : "
lire valeurs
construire tableau T à partir de la chaîne valeurs
fin
Aquí hemos descrito suficientemente la lire_tableau. Las tres acciones requeridas se traducen inmediatamente a vbscript. La última acción requiere el uso de la función split. Si vbscript no dispusiera de esta función, la acción 3 tendría que descomponerse en acciones elementales con un equivalente vbscript inmediato.
El módulo de escritura_tableau(T) podría describirse del siguiente modo:
El módulo de escritura_tableau(T) podría describirse del siguiente modo (se supone que los índices de los elementos de T empiezan en 0):
début
N<-- indice dernier élément du tableau T
pour IFIN variant de N à 1
faire
//on recherche l'indice IMAX du plus gd élément de T
// IFIN est l'indice du dernier élément de T
chercher_max(T, IFIN, IMAX)
// on échange l'élément le plus grand de T avec le dernier élément de T
échanger (T, IMAX, IFIN)
finfaire
FIN
Aquí el algoritmo vuelve a utilizar acciones no elementales:
chercher_max(T, IFIN, IMAX) devuelve el índice IMAX del elemento mayor de la matriz T cuyo último índice de elemento es IFIN.
![]() |
exchange(T, IMAX, IFIN) intercambia 2 elementos de la tabla T , los de índice IMAX y IFIN.
![]() |
Por tanto, es necesario describir las nuevas operaciones no elementales.
módulo chercher_max(A, IFIN, IMAX) | |
módulo exchange(T IMAX, IFIN) |
El problema inicial se ha descrito completamente mediante operaciones elementales de vbscript y ahora puede traducirse a este lenguaje. Hay que tener en cuenta que las acciones elementales pueden diferir de un lenguaje a otro y que, por tanto, el análisis de un problema debe tener en cuenta en algún momento el lenguaje de programación utilizado. Un objeto que existe en un lenguaje puede no existir en otro, lo que modifica el algoritmo utilizado. Por ejemplo, si un lenguaje dispone de una función de ordenación, sería absurdo no utilizarla.
El principio aplicado aquí es el de análisis descendente. Si representamos la columna vertebral de la solución, tenemos lo siguiente:
![]() |
Tenemos una estructura de árbol.
5.3. Funciones y procedimientos vbscript
Una vez realizado el análisis modular, el programador puede traducir los módulos de su algoritmo en funciones o procedimientos vbscript. Visite funciones y procedimientos ambos admiten parámetros de entrada/salida, pero el función devuelve un resultado que puede utilizarse en expresiones, mientras que la función procedimiento no devuelve nada.
5.3.1. Declaración de funciones y procedimientos vbscript
La declaración de un procedimiento vbscript es la siguiente
y la de una función
Para devolver su resultado, la función debe incluir una instrucción para asignar el resultado a una variable que lleve el nombre de la función:
nomFonction=résultat
Existen dos formas de detener la ejecución de una función o procedimiento:
- al final de la instrucción de función (fin function) o fin de procedimiento (fin sub)
- para cumplir la instrucción de salida de la función (exit function) o procedimiento (salir de sub)
Para la función, recuerde que el resultado debe haberse asignado a una variable que lleve el nombre de la función antes de que ésta termine con un fin function o exit function.
5.3.2. Cómo pasar los parámetros de una función o procedimiento
Al declarar los parámetros de entrada-salida de una función o procedimiento, se especifica el modo (byRef,byVal) para transmitir el parámetro del programa llamante al programa llamado:
sub nomProcédure([Byref/Byval] param1, [Byref/Byval] param2, ...)
function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...)
Cuando el modo de transmisión byRef o byVal no se especifica el modo byRef se utiliza.
Parámetros efectivos, parámetros formales
Sea una función vbscript definida por
Los parámetros parmamFormi utilizados en la definición de la función o procedimiento se denominan parámetros formales. La función anterior puede utilizarse desde el programa principal o desde otro módulo utilizando una instrucción como :
Los parámetros parmamEffi utilizados en la llamada a la función o procedimiento se denominan parámetros efectivos. Cuando se ejecuta el nomFonction los parámetros formales reciben los valores de los parámetros efectivos correspondientes. Las palabras clave byRef y byVal establecen cómo deben transmitirse estos valores.
Modo de transmisión por valor (byVal)
Cuando un parámetro formal especifica este modo de transmisión, el parámetro formal y el parámetro efectivo son dos variables diferentes. El valor del parámetro efectivo se copia en el parámetro formal antes de que se ejecute la función o el procedimiento. Si la función o el procedimiento modifican el valor del parámetro formal durante la ejecución, esto no modifica el valor del parámetro efectivo correspondiente. Este modo de transmisión se adapta bien a los parámetros de entrada de la función o el procedimiento.
![]() |
Modo de transmisión de referencia (byRef)
Este modo de transmisión es el modo por defecto si no se especifica ningún modo de transmisión de parámetros. Cuando un parámetro formal especifica este modo de transmisión, el parámetro formal y el parámetro efectivo correspondiente son la misma variable. Así, si la función modifica el parámetro formal, también se modifica el parámetro efectivo. Este método de transmisión es muy adecuado para :
- parámetros de salida, ya que sus valores deben transmitirse al programa de llamada
- a los parámetros de entrada cuya copia es costosa, como las tablas
![]() |
El siguiente programa muestra ejemplos de cómo pasar parámetros:
Comentarios
- En un vbscript script, no hay un lugar especial para las funciones y procedimientos. Pueden estar en cualquier parte del texto fuente. En general, se agrupan al principio o al final, para que el programa principal forme un bloque continuo.
5.3.3. Sintaxis de llamada a funciones y procedimientos
Sea p un procedimiento con parámetros formales pf1, pf2, ...
- se llama al procedimiento p de la forma
sin corchetes alrededor de los parámetros
- si el procedimiento p no tiene parámetros, puede utilizar la llamada p o p() y la declaración sub p o sub p()
Sea f una función con parámetros formales pf1, pf2, ...
- la función f se llama de la forma
los paréntesis alrededor de los parámetros son obligatorios. Si la función f no tiene parámetros, puede utilizar la llamada f o f() y la declaración function f o function f().
- el resultado de la función f puede ser ignorado por el programa que llama. La función f se considera entonces un procedimiento y sigue las reglas de llamada a procedimientos. Escribimos f pe1, pe2, ... (sin paréntesis) para llamar a la función f.
Si la función o procedimiento es un método de objeto, parece que las normas son algo diferentes e incoherentes.
- por lo que podemos escribir MyFile.WriteLine "Esto es una prueba." o MyFile.WriteLine("Esto es una prueba.")
- pero si podemos escribir wscript.echo 4no podemos escribir wscript.echo(4).
Se aplican las siguientes normas:
- sin paréntesis alrededor de los parámetros de un procedimiento o de una función utilizada como procedimiento
- paréntesis alrededor de los parámetros de una función
5.3.4. Algunos ejemplos de funciones
A continuación se ofrecen algunos ejemplos de definiciones y usos de las funciones:
Comentarios
- la función rendUnTableau muestra que una función puede devolver varios resultados y no sólo uno. Todo lo que tiene que hacer es colocarlos en una variante del array y devolver esta variante como resultado.
- a la inversa, el argumentsVariables muestra que se puede escribir una función que tome un número variable de argumentos. Una vez más, todo lo que tienes que hacer es ponerlos en una matriz de variantes y hacer de esta variante un parámetro de la función.
5.3.5. Parámetro de salida o resultado de una función
Supongamos que el análisis de una aplicación ha mostrado la necesidad de un módulo M con parámetros de entrada Ei y parámetros de salida Sj. Recordemos que los parámetros de entrada son información que el programa llamante da al programa llamado y que, a la inversa, los parámetros de salida son información que el programa llamado da al programa llamante. En vbscript hay varias soluciones para los parámetros de salida:
- si sólo hay un parámetro de salida, puede ser el resultado de una función. En este caso, ya no hay un parámetro de salida, sino simplemente el resultado de una función.
- si hay n parámetros de salida, uno de ellos se puede utilizar como resultado de una función, los otros n-1 parámetros de salida restantes. También se puede utilizar un procedimiento con n parámetros de salida en lugar de una función. También puede utilizar una función que devuelve una matriz en la que ha colocado los n valores que se devolverán al programa que llama. Recuerde que el programa llamado devuelve sus resultados al programa llamante copiando los valores. Esto se evita en el caso de parámetros de salida pasados por referencia. Por lo tanto, esta última solución ahorra tiempo.
5.4. El programa Vbscript para ordenar valores
Comenzamos nuestro debate sobre la programación modular con un estudio algorítmico de la ordenación de valores numéricos escritos con el teclado. He aquí la traducción VBScripto que podría hacerse de él:
Comentarios :
- el módulo intercambiar que se había identificado en el algoritmo inicial no ha sido objeto aquí de un módulo vbscript porque se consideró demasiado simple para ser objeto de un módulo específico.
5.5. El programa IMPOTS en forma modular
Tomemos de nuevo el programa de cálculo de impuestos, esta vez escrito en forma modular
Comentarios
- la función getArguments recuperar información (matrimonio, hijos, salario) del contribuyente. Aquí, se pasan como argumentos al programa vbscript. Si esto cambiara, por ejemplo, si estos argumentos procedieran de una interfaz gráfica, sólo el getArguments y no los demás.
- la función getArguments puede detectar errores de argumento. Cuando esto ocurre, podríamos haber decidido detener la ejecución del programa en la función getArguments con un wscript.quit. Esto nunca debe hacerse en una función o procedimiento. Si una función o procedimiento detecta un error, debe señalarlo de alguna manera al programa que llama. Es el programa invocador el que debe decidir si detiene o no la ejecución, no el procedimiento. En nuestro ejemplo, el programa de llamada podría decidir pedir al usuario que vuelva a escribir los datos erróneos en el teclado en lugar de detener la ejecución.
- aquí, el getArguments devuelve una matriz de variantes donde el primer elemento es un código de error (0 si no hay error) y el segundo un mensaje de error si se ha producido un error. Comprobando el resultado obtenido, el programa llamante puede determinar si se ha producido o no un error.
- el procedimiento getData se utiliza para obtener los datos necesarios para calcular el impuesto. Aquí se definen directamente en el procedimiento getData. Si estos datos procedieran de otra fuente, un fichero o una base de datos por ejemplo, sólo habría que reescribir el procedimiento getData y no los demás.
- la función calculerImpot permite calcular el impuesto una vez obtenidos todos los datos, sea cual sea la forma en que se hayan obtenido.
- así pues, cabe señalar que la escritura modular permite (re)utilizar determinados módulos en contextos diferentes. En los últimos veinte años, este concepto se ha desarrollado mucho en el concepto de objeto.







