domingo, 10 de noviembre de 2013

Dibujar en Visual BASIC

Veamos un pequeño ejemplo de como utilizar algunas de las herramientas de dibujo que nos brinda visual basic

Option Explicit
Dim Color As Long
Dim p As Integer


Private Sub Command1_Click()
'Define el color rojo en la Picture1 
Color = RGB(255, 0, 0)
End Sub

Private Sub Command2_Click()
'Define el color rosa en la picture1
Color = RGB(255, 192, 203)
End Sub

Private Sub Command3_Click()
'Define el color negro en la Picture1 
Color = RGB(0, 0, 0)
End Sub

Private Sub Command4_Click() 
'Define el color amariyo en la Picture1 
Color = RGB(255, 255, 0)
End Sub

Private Sub Command5_Click()
'Define el grosor del puntero 
Picture1.DrawWidth = InputBox("Dame el grosor del puntero:", "Grosor")
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then 
Picture1.PSet (X, Y), Color 
End If 
If Button = 2 Then 
Picture1.PSet (X, Y), RGB(255, 255, 255) 
End If
End Sub

lunes, 4 de noviembre de 2013

Evaluacion


Lo que hay que saber
Para que se utilizan las funciones LEN, LEFT, RIGHT, MID
Que funcionan los ciclos FOR-NEXT, DO WHILE-LOOP
Principales propiedades de los Botones (caption, forecolor, font, passwordchar)
TEXTBOX
LABEL
LISTBOX
COMBOBOX
OPTIONBUTTON

Tipos de Variables
STRING, INTEGER, DOBLE, LONG, SINGLE

Instrucciones condicionales
IF THEN ELSE ENDIF
SELECT CASE - ENDCASE

Instrucciones para ingreso de valores
INPUTBOX

Random
RND()

domingo, 20 de octubre de 2013

Tp funciones de cadena

Trabajo Practico funciones de cadenas de caracteres

1-     Escribir para que se utilizan y como se deben escribir las siguientes sentencias

LEN
LEFT
RIGHT
MID

2-     Hacer un programa que realice lo siguiente:
Ingresar una palabra, informe la cantidad de letras, muestre la primera y la ultima letra.
3-     Hacer un programa que pida el ingreso de una palabra y luego la imprima en forma vertical
4-     Ingresar una palabra (ejemplo : alegria) y luego imprimirla de la siguiente manera
Alegria
Alegri
Alegr
Aleg
Ale
Al
A

5-     Ingresar una palabra, y luego una letra. Indicar si la letra ingresada pertenece o no a la palabra. En el caso que pertenezca indicar en que posición esta
6-     Ingresar una frase y luego mostrar cuantas letras A tiene dicha frase.
7-     Idem anterior pero indicando la cantidad de Vocales que tiene la frase
8-     Ingresar una frase y luego separar las palabras una debajo de otra. ( por ejemplo: Hoy es un lindo día de sol)
HOY
ES
UN
LINDO
DIA
DE
SOL
9-     Para que se utilizan las funciones Lcase y Ucase

10- Para que se utilizan las funciones TRIM, LTRIM y RTRIM, dar ejemplos

TP de Aplicación FOR – NEXT- RND DO WHILE

TP de Aplicación FOR – NEXT- RND DO WHILE

1-     Ingresar 10 números, luego mostrar cuantos son mayores a 20 y cuantos menores a 10.

Resolver haciendo el formulario y corrigiendo los posibles errores que se presentaran al ejecutar el programa

Dim x,a,c,m as integer
For x= 1 to 10
      Rem la siguiente línea permite ingresar un numero en una ventana
     A=inputbox(“ingrese numero”)
     Rem esta línea sirve para mostrar en una etiqueta el numero ingresado
     Label1= label1 & A & “          “ 
     If a>20 then
         C=c+1
           Endif
      Next x
      Label2= “ La cantidad de números mayores a 20 son “ & c
    
2-     Generar 100 números al azar entre 1 y 20, luego informar cuantos fueron iguales a 10
3-     Generar 500 números al azar entre 1 y 10, luego informar cuantos de cada uno se repitieron

4-      Ingresar números hasta que se  ingrese un cero, luego informar cuantos números se ingresaron, la suma de los números ingresados y el promedio

lunes, 9 de septiembre de 2013

tabla de multiplicar con FOR NEXT

Dim t, i As Integer
Labeltabla.Caption = ""


t = Val(Text1.Text)

For i = 1 To 10

    Labeltabla = Labeltabla & t & " * " & i & " = " & t * i & vbCrLf

Next i

EJERCICIOS de VISUAL BASIC

Ejercicio 1 (utilizando for – next)

Hacer un programa que solicite al usuario la cantidad de números a ingresar, luego que permita ingresar en un Listbox los números que correspondan. Por ultimo al finalizar el ingreso de números se deberá mostrar el máximo y el mínimo

Por ejemplo, el programa solicita el ingreso de un numero, ingresamos el 4. Esto indica que deberemos ingresar luego 4 números, supongamos que ingresamos: 8, 3, 25 y 12.
Entonces al final deberemos ver como máximo al 25 y como mínimo al 3





Ejercicios 2
Ingresar 10 números en un list, luego determinar cuantos fueron mayores a 30 y cuantos menores a 10.

Ejercicio 3
Modificar el ejercicio anterior para que además se muestre la sumatoria de los números ingresados y el promedio

Ejercicio 4
Ingresar números hasta que se ingrese el nro cero. Luego informar cuantos números se ingresaron y cuantos fueron pares y cuantos impares. ( utilizar la sentencia DO WHILE- Loop)
 Tener en cuenta aquí que para saber si un numero es par podría aplicar el MOD, que determina el valor del resto en un cociente
Por ejemplo : res = A mod 2 ( si A es un numero ingresado y queremos saber cual es el resto de A al dividir por 2, en este caso si el numero es par el resto es cero y sino será distinto de cero, quizás con esta ayuda puedan resolver como sacar cuando un numero es par o impar)



Instrucción Do...Loop (Visual Basic)



Repite un bloque de instrucciones mientras una condición Boolean sea True o hasta que la condición se convierta en True.
Do { While | Until } condition
    [ statements ]
    [ Continue Do ]
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop
-or-
Do
    [ statements ]
    [ Continue Do ]
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop { While | Until } condition
Término
Definición
Do
Requerido. Inicia la definición del bucle Do.
While
Obligatorio a menos que se utilice Until. Repite el bucle hasta que condition sea False.
Until
Obligatorio a menos que se utilice While. Repite el bucle hasta que condition sea True.
condition
Opcional. Expresión Boolean. Si condition es Nothing, Visual Basic la trata como False.
statements
Opcional. Una o más instrucciones que se repiten mientras o hasta que condition sea True.
Continue Do
Opcional. Transfiere el control a la siguiente iteración del bucle de Do .
Exit Do
Opcional. Transfiere el control fuera del bucle Do.
Loop
Requerido. Termina la definición del bucle Do.
Utilice una estructura Do...Loop cuando desee repetir un conjunto de instrucciones un número indefinido de veces, hasta que se satisfaga una condición. Si desea repetir las instrucciones un número fijo de veces, la Instrucción For...Next es normalmente una opción mejor.
Puede usar While o Until para especificar condition, pero no ambas.
Puede probar condition solo una vez, en el inicio o el final del bucle. Si prueba condition al principio del bucle (en la instrucción Do), puede que el bucle no se ejecute ni siquiera una vez. Si prueba al final del bucle (en la instrucción Loop), el bucle siempre se ejecuta al menos una vez.
Generalmente, la condición es el resultado de comparar dos valores, pero también puede ser cualquier expresión que da como resultado un valor Boolean (Tipo de datos, Visual Basic) (True o False). Esto incluye los valores de otros tipos de datos, como los numéricos, que han sido convertidos a valores de tipo Boolean.
Se pueden anidar bucles Do colocando un bucle dentro de otro. También puede anidar distintos tipos de estructuras de control unos dentro de otros. Para obtener más información, vea Estructuras de control anidadas (Visual Basic).
Nota Nota
La estructura Do...Loop proporciona mayor flexibilidad que la Instrucción While...End While (Visual Basic) porque permite decidir si se debe finalizar el bucle cuando condition deja de ser True o cuando es True por primera vez. También le permite probar conditionen el inicio o el final del bucle.

Exit Do

La instrucción Exit Do puede proporcionar una alternativa para salir de Do…Loop. Exit Do transfiere el control inmediatamente a la instrucción que sigue a la instrucción Loop.
Exit Do se utiliza a menudo después de evaluar alguna condición, por ejemplo en una estructura If...Then...Else. Por ejemplo, puede ser conveniente salir de un bucle si se detecta una condición que hace que sea innecesario o imposible continuar la iteración, como puede ser un valor erróneo o una solicitud de finalización. Un uso de Exit Do consiste en comprobar una condición que podría ocasionar un bucle sin fin; es decir, un bucle que pudiera ejecutarse un número elevado, o incluso infinito, de veces. Puede utilizar Exit Do para escapar del bucle.
Puede incluir cualquier número de instrucciones Exit Do en cualquier lugar de Do…Loop.
Cuando se utiliza dentro de bucles Do anidados, Exit Do transfiere el control fuera del bucle más profundo y al siguiente nivel de anidamiento.

domingo, 1 de septiembre de 2013

Ejercicio de SELECT CASE

Transformar en código de Visual Basic el siguiente enunciado: crear un programa que pida al usuario un número de día y un número de mes, evalúe si la entrada es correcta y en caso de que así sea calcule el día del año que es, considerando un año no bisiesto.



SOLUCIÓN

Rem [Cálculo del día del año]
Option Explicit
Dim Ndía%, Nmes%, DDA As Integer

Private Sub Form_Load()
Show
Form1.Caption = "Cálculo día del año"
Label1(0).Caption = "Introduzca aquí el número del día"
Label1(1).Caption = "Introduzca aquí el número del mes"
Command1.Caption = "Determinar día del año"
End Sub

Private Sub Command1_Click()
Ndía = Val(Text1(0))
Nmes = Val(Text1(1))
LabelResultado.FontSize = 10
LabelResultado.FontBold = True
If Ndía >= 1 And Ndía <= 31 And Nmes >= 1 And Nmes <= 12 Then
    Select Case Nmes
        Case 1
            DDA = Ndía '[DDA es día del año]
        Case 2
            DDA = Ndía + 31
        Case 3
            DDA = Ndía + 59
        Case 4
            DDA = Ndía + 90
        Case 5
            DDA = Ndía + 120
        Case 6
            DDA = Ndía + 151
        Case 7
            DDA = Ndía + 181
        Case 8
            DDA = Ndía + 212
        Case 9
            DDA = Ndía + 243
        Case 10
            DDA = Ndía + 273
        Case 11
            DDA = Ndía + 304
        Case 12
            DDA = Ndía + 334
    End Select
    LabelResultado = "El " & Ndía & " del "& Nmes & " es el día" & DDA & " del año"
Else
    LabelResultado = "Datos proporcionados no válidos"
End If
End Sub


Aspecto gráfico:


ESTRUCTURAS DE REPETICIÓN (BUCLES) CON VISUAL BASIC

Vamos a ver cómo materializar con Visual Basic estructuras de repetición que permitirán que en nuestros programas se realice un proceso n veces. En concreto veremos las instrucciones Desde … Siguiente (For … Next) con su cláusula Paso (Step), la instrucción Mientras … Hacer (Do While … Loop) y la instrucción Hacer … Repetir Mientras (Do … Loop While).


 
Muchas veces podremos optar indistintamente por usar una instrucción u otra. En otros casos, es recomendable decantarse por una de ellas por hacer el programa más legible o sencillo que usando otras opciones.


INSTRUCCIÓN DESDE ... SIGUIENTE (FOR ... NEXT) Y CLÁUSULA PASO (STEP)

La sintaxis a emplear con Visual Basic es la siguiente:

For VAR = Vi  To Vf
                Instrucción 1
                Instrucción 2
·
·
·
      Instrucción n
Next VAR
 

El incremento que sufre el contador es, por defecto, unitario. Es decir, el primer valor que toma VAR en el bucle será Vi, el segundoVi + 1, el tercero (Vi + 1) + 1, etc. La modificación de dicho valor de incremento la realizaremos a través de la cláusula Step después del valor VfStep 2 implicará que en cada repetición del bucle el contador se incremente en dos unidades, Step 5 implicará que en cada repetición del bucle el contador se incremente en cinco unidades. Un paso negativo del tipo Step -1 supone que el contador decrece en vez de incrementarse. Si el paso es negativo, Vi necesariamente habrá de ser mayor que Vf, ya que en caso contrario no se producirá la entrada en el bucle.

Con este código se nos muestra en pantalla 3 veces hola, gracias a que se ha invertido el sentido del bucle:

Option Explicit
Dim VAR As Integer
Dim Vi As Integer
Dim Vf As Integer

Private Sub Form_Load()
Show
Vi = 1
Vf = 3
For VAR = Vf To Vi Step –1
    '[También supondría tres repeticiones For VAR = Vi to Vf]
    Print "hola"
Next VAR
End Sub



Con Visual Basic resulta admisible usar Next sin indicar la variable que está sirviendo de guía del bucle, pues todo bucle ha de tener un cierre. Sin embargo, no lo creemos recomendable pues puede dificultar la lectura y depuración de los programas.

La instrucción For ... Next es anidable dentro de sí misma o dentro de otros tipos de bucles o estructuras, debiendo seguir las pautas que ya hemos comentado.

SELECT CASE

INSTRUCCIÓN SEGÚN (CASO) HACER (SELECT CASE)

La sintaxis a emplear con Visual Basic para la instrucción Select Case es la siguiente:



 


Select Case [expresión]
Case [valor expresión 1]
Instrucción 1
Instrucción 2
Case [valor expresión 2]
Instrucción 3
Instrucción 4
.
.
.
Case [valor expresión n]
Instrucción k
Case Else
Instrucción m
End Select
 

La expresión a evaluar puede ser un valor numérico o una cadena de texto. Sólo se puede evaluar una expresión y no múltiples expresiones. La evaluación de expresiones puede ser:

a)   De coincidencia: por ejemplo, Case 12 indicaría que si la expresión evaluada vale 12 se ejecutarán las instrucciones anexas.

b)   De intervalo: usando la palabra clave To. Por ejemplo, Case 12 To 14 indicaría que si la expresión evaluada tiene un valor comprendido entre 12 y 14 (incluidos los extremos de los intervalos), se ejecutarán las instrucciones anexas.

c)   De comparación: usando la palabra clave Is. Por ejemplo, Case Is <= 14 indicaría que si la expresión evaluada tiene un valor menor o igual a 14 se ejecutarán las instrucciones anexas.

Cuando varios casos son válidos, sólo se ejecutan las instrucciones asociadas al primer caso verificado, siguiendo el flujo del programa por la siguiente instrucción después de End Select. Esto debemos tenerlo muy en cuenta, ya que si pretendemos que cuando se cumplan dos condiciones se ejecuten sendos bloques de instrucciones, convendrá hacerlo a través de la instrucción If en vez de a través de Select Case.

Las instrucciones Select Case se pueden anidar. Cada instrucción Select Case debe tener su correspondiente terminación End Select.

La instrucción Select Case presenta similitudes marcadas con la instrucción If - Then. Por ello, en general podremos conseguir resultados similares con ambas instrucciones y elegir usar una u otra dependerá de nuestro gusto y de cuál se adapte mejor a nuestros intereses, que en general serán ahorrar código y conseguir claridad para cumplir el objetivo. Otras veces será interesante anidar ambas instrucciones.

Prueba el siguiente código:

Option Explicit
Dim A As Integer

Private Sub Form_Load()
Show
A = 12
Select Case A
    Case 12
        Print "A vale 12"
    Case Is < 14
        Print "A es menor que 14"
    Case 160 To 200
        Print "A está comprendida entre 160 y 200"
    Case Else
        Print "No se ha verificado ninguna de las condiciones previstas"
End Select
End Sub



El resultado es que se muestra en pantalla "A vale 12". Sin embargo, a pesar de que la hipótesis  A < 14 se cumple, no llega a evaluarse y por tanto las instrucciones asociadas a este caso no se ejecutan.

ESTRUCTURAS DE DECISIÓN CON VISUAL BASIC

INSTRUCCIÓN SI … ENTONCES (IF … THEN) Y SI … ENTONCES – SINO (IF … THEN – ELSE)

La sintaxis a emplear con Visual Basic es muy similar a la que se estudia en los cursos de algoritmia y pseudocódigo, con la sustitución del Si por If, del Entonces por Then, del SiNo por Else y del Finsi por End If. La única salvedad a tener en cuenta es que Visual Basicpermite además de la escritura en bloques la escritura en una sola línea.

 
Sintaxis en bloque:

If [condición] Then
Instrucción 1
Instrucción 2
·
·
·
Instrucción n
Else
Instrucción A
Instrucción B
·
·
·
Instrucción Z
End If
 

Sintaxis en una sola línea:

If [condición] Then Instrucción 1 Else Instrucción A
 
También es posible encadenar varias acciones derivadas de un Then o de un Else en una sola línea. Sin embargo, recomendamos usar la opción de sintaxis en una sola línea exclusivamente para desarrollos sencillos como puede ser una instrucción en caso de que se cumpla la condición y otra en caso de que no se cumpla. Si intervienen varias instrucciones, siempre resultará más legible usar el formato de bloque.

La instrucción If ... Then es anidable dentro de sí misma, siendo siempre preferible el formato de bloque cuando se vayan a generar anidamientos.


Ejemplo:

If A > 7 And B < 5 Then
    Print "A es mayor que 7 y B menor que 5"
End If



También válido es:

If A > 7 And B < 5 Then Print "A es mayor que 7 y B menor que 5"


Si introducimos una cláusula Else el modelo es:

If A > 7 And B < 5 Then
    Print "A es mayor que 7 y B menor que 5"
Else
    Print "A no es mayor que 7 ó B no es menor que 5"
End If



También válido:

If A > 7 And B < 5 Then Print "A es mayor que 7 y B menor que 5" _
Else Print "A no es mayor que 7 ó B no es menor que 5"


EJERCICIO EJEMPLO CON IF THEN ELSE EN VISUAL BASIC

Crear un programa que pida un número entero distinto de cero y nos muestre en pantalla un mensaje indicándonos si el número es par o impar.

Nota: El procedimiento a emplear será basado en el uso del operador Mod.


 

SOLUCIÓN

Crearemos un Label de solicitud del número, un Textbox de entrada, un Command Button y un Label para el cálculo y el resultado. Le ponemos los nombres y organizamos los controles en pantalla como nos parezca correcto (no tiene por qué coincidir con lo que ponemos aquí). Los nombres que hemos empleado nosotros son: LabelPideNumTextNentero, CommandHallar yLabelResultado.

Option Explicit
Dim Num As Integer
Dim Res As Integer

Private Sub Form_Load()
Form1.Caption = "Determina naturaleza par o impar"
CommandHallar.Caption = "Determinar"
LabelPideNum = "Introduzca un nº entero"
End Sub

Private Sub CommandHallar_Click()
Num = Val(TextNentero)
Res = Num Mod 2
LabelResultado.FontSize = 10
LabelResultado.FontBold = True
If Res = 0 Then
    LabelResultado = "El número es par"
Else
    LabelResultado = "El número es impar"
End If
End Sub
 

Gráficamente:



Hemos escrito el If ... Then – Else como un bloque en vez de como una única línea. El motivo para ello es que aporta mayor claridad y facilidad de interpretación.

lunes, 5 de agosto de 2013

clase 4

1 - Subrutinas de código

Se denomina subrutina a una porción de código que tiene como principal función ejecutar una determinada tarea. Estas tienen un nombre para poder identificarlas y luego poder llamarlas para poder utilizarlas.
Las subrutinas tienen un principio y un fin y estas pueden tener distinto tipo de alcance, o sea pueden ser de tipo privadas opúblicas.
En el siguiente ejemplo se muestra una subrutina que crea visual basic automáticamente cuando en un formulario insertamos un botón llamado Command1 y desde la ventana de eventos seleccionamos el evento click del mismo

Private Sub Command1_Click()

End Sub

Ahora, si colocamos por ejemplo un control TextBox llamado TextPedidos y hacemos doble click sobre el mismo, se crea el procedimiento por defecto para los TextBox, que es el evento Change

Private Sub TextPedidos_Change()

End Sub

En estos 2 últimos ejemplos tenemos una subrutina o procedimiento de tipo Privado, esto quiere decir que la podemos utilizar solo en el formulario o módulo donde está declarada o escrita
La palabra sub le sigue el nombre de la rutina que la identifica. En este caso Command1_click() y en el otro ejemplo TxtPedidos_Change().
Si quisiéramos que estos procedimientos se puedan llamar desde otro formulario, lo que tendríamos que hacer es cambiar el alcance del procedimiento, en ves de Private Sub cambiarlo por Public Sub. si hacemos esto, ese procedimiento de código puede ser utilizado desde cualquier parte del proyecto.

Subrutinas y Procedimientos propios


También podemos crear nuestros propios Procedimientos y Subrutinas de código para ejecutar una determinada tarea.
Para crear un procedimiento de código se debe escribir la palabra Private sub o Public sub (depende el alcance), seguida del nombre del procedimiento (un nombre que queramos) y los parámetros, si es que le enviaremos parámetros (los parámetros son opcionales). Además el procedimiento debe ser escrito en un lugar vacío de la ventana de código, es decir nno se puede crear un procedimiento dentro de otro
Un ejemplo para crear un procedimiento:
Private Sub ProcedimientoBorrar()

label1 = ""
label2 = ""
label3 = ""

End Sub

En este ejemplo creamos un procedimiento muy simple que tendrá la función específica de borrar el contenido de 3 controles label.
¿ Pero ahora te preguntarás como hago para que se ejecute el procedimiento que he creado ?.
Muy fácil. Solo debemos escribir el nombre del procedimiento en el lugar donde queremos que se ejecute. Por ejemplo supongamos que tenemos un formulario con 3 controles Label (Label1, Label2 y Label3), También un Commandbutton llamado Command1 y en la ventana de código hemos escrito el procedimiento del ejemplo anterior. Si nosotros queremos llamar al procedimiento, que borrará el contenido de los label cuando hagamos click en el Command1 lo haríamos así:

Private Sub command1_click()

ProcedimientoBorrar

End Sub

Al presionar el Command1 visual basic detectaría el nombre ProcedimientoBorrar, y automáticamente saltaría al lugar donde creamos el procedimiento y ejecutaría las líneas de código que haya en ese procedimiento.
También podemos llamar a un procedimiento utilizando la palabra Call, que quiere decir llamar, seguida del nombre del procedimiento, pero en este caso si utilizamos call y nuestro procedimiento contiene parámetros, debemos pasarlos entre paréntesis ( los parámetros de procedimientos y funciones se explican a continuación)
una vez que se ha terminado de ejecutar las instrucciones que estén dentro del bloque del procedimiento, volvería a la línea siguiente de donde fue llamado el mismo, y ejecutaría todas las líneas restantes de código. En este caso no ejecutaría nada mas por que no hemos puesto ninguna otra instrucción debajo de ProcedimientoBorrar.
La principal ventaja de crear procedimientos de código es que evita tener que escribir varias veces las mismas instrucciones en un programa, el código se hace mucho mas funcional y entendible, se pueden dividir un problema (una rutina), en varios procedimientos y probarlos independientemente, y además la posibilidad de enviar parámetros a los procedimientos


1.1 - Pasar parámetros a los procedimientos:

Se utilizan los parámetros en los procedimientos para que el procedimiento no ejecute siempre las mismas líneas de código y pueda variar, teniendo la posibilidad de hacerlo mas dinámicamente. En ciertas ocaciones no es necesario enviar parámetros, pero en otras es prácticamente fundamental. Los parámetros son datos, casi de cualquier tipo, que se pasan seguido del nombre del procedimiento, y si es mas de uno deben ir separados por comas (,). Ejemplo:

DatosPersonales "Luciano", 25, "La plata"

En este ejemplo pasamos tres parámetros: El primero es un nombre y es un dato de tipo String y por ende debe ir entre comillas. El segundo es un número y el tercero también un string. , o sea una cadena de caracteres
Pero la cosa no queda acá. Si nosotros vamos a pasar parámetros a un procedimiento, cuando creamos el procedimiento debemos establecer que tipo de parámetros va a recibir el mismo. Ejemplo:
Private Sub DatosPersonales(nombre As String, edad As Integer, ciudad As String)

Label1 = nombre
Label2 = edad
Label3 = ciudad

End Sub

siguiendo, el ejemplo anterior creamos un procedimiento con tres parámetros. Cada parámetro se declara como se hace con las variables, o sea que debemos darles un nombre a la variable y definir el tipo de dato ( sin utilizar la palabra Dim ) que recibirá cuando las llamemos.
Ahora podríamos por ejemplo, en el evento click de un Command1, llamar al procedimiento y pasarle los parámetros.
Coloca un Command1 , 3 controles Label, copia en la ventana de código el procedimiento anterior llamado DatosPersonales, y ahora pega el siguiente código
Private sub command1_click()

DatosPersonales "Luciano", 25, "La plata"

End sub

Al presionar el botón se llamará al procedimiento que habíamos creado anteriormente, y le pasará los valores de los parámetros en el orden en que estén establecidos declarados en el procedimiento. Esto quiere decir que el primer parámetro con el valor "Luciano" se almacenará o asignará a la variable nombre , el valor 25 se le asignará a la variable edad y el último valor a la variable ciudad.
Después que las variables ya cargaron el valor las podemos utilizar dentro del procedimiento, como en el ejemplo anterior que le asignamos a un control Label1 el contenido de la variable nombre, al Label2 el contenido de edad y al Label3 el contenido de la variable ciudad.
Es muy importante respetar el orden en que pasamos los parámetros en un procedimiento, por que por ejemplo en el caso anterior si hubiésemos pasado los parámetros de esta forma:

DatosPersonales 25, "Luciano", "La plata"

el segundo parámetro "Luciano" se almacenaría en la variable Edad que es de tipo Integer y se produciría un error en tiempo de ejecución por no coincidir los tipos de datos, ya que la variable espera un valor numérico de tipo Integer y nosotros le estamos pasando una cadena de caracteres, un dato de tipo String
Otra cosa importante es que cuando creamos, por ejemplo un procedimiento que va a recibir 2 parámetros, cuando lo llamemos, no podemos enviarle solo 1 parámetro, debemos obligatoriamente pasarle los 2 parámetros que hubiésemos declarado en el mismo. Un ejemplo que daría un error en tiempo de ejecución por no pasar adecuadamente los parámetros sería:

Private Sub sumar(a As Integer, b As Integer)

Label1 = a + b

End Sub
hasta aquí creamos un procedimiento llamado sumar que recibirá 2 parámetros de tipo Integer, si nosotros llamamos al procedimiento y le pasamos un solo valor, por ejemplo:
Call sumar ( 456 )

Esto daría un error de compilación por que el procedimiento espera recibir 2 parámetros ..y nosotros le estamos pasando o enviando solo uno de ellos.
Precisamente el cartel de error que te mostraría visual basic sería el siguiente:

vista del error en tiempo de compilación

Nota: hay una sentencia llamada Optional que SI permite pasar parámetros de forma opcional, por ejemplo:

 Private Sub Con_Parametro_Opcional(Nombre As String, _
                                   Optional Email As String)

MsgBox Nombre

MsgBox Email


End Sub

Ahora si llamas a la rutina anterior, y omites el parámetro Email, esta no dará error, por ejemplo:

Call Con_Parametro_Opcional("Maria")

Nota: Los parámetros opcionales, si o si deben estar declarados al final de la lista de parámetros, por ejemplo esto no se puede hacer:

Private sub una_Rutina ( Optional Email As String, Nombre as String )

Función IsMissing

Esta función se utiliza cuando utilizamos parámetros opcionales en una función o procedimiento, y nosotros, dentro del mismo queremos saber y averiguar si se han enviado los parámetros opcionales
El uso de IsMissing muy simple. Esta función retorna el valor True si NO se ha enviado el parámetro que queremos comprobar, y devuelve False si el parámetro ha sido enviado:
por ejemplo , colocar dos CommandButton

Private Sub Mostrar_Dato(Optional Nombre As Variant)
    
    ' Si IsMissing devuelve Verdadero, es por que no se envíó
    If IsMissing(Nombre) = True Then
        MsgBox " NO Se ha enviado el parámetro NOMBRE ", vbInformation
    Else
        MsgBox " Se ha enviado el parámetro NOMBRE ", vbInformation
    End If
    

End Sub

'Acá No se envía el parámetro
Private Sub Command1_Click()
    Mostrar_Dato
End Sub

'Acá Si se envía el parámetro

Private Sub Command2_Click()
    Mostrar_Dato "María"
End Sub



1.3 - Pasar parámetros por valor y por referencia ( ByVal y ByRef )

los parámetros en las funciones y procedimientos, se pueden enviar de dos maneras: por Valor y por Referencia.
Si están declarados como ByVal, los mismos serán por valor, si se declaran como ByRef serán por referencia.
La diferencia entre uno y otro método de paso de parámetros, es que en ByVal se envía una copia de la variable, y de esta manera si se efectúa un cambio en el procedimiento, solo tendrá efecto dentro del procedimiento o función, una ves que termine y finalice el mismo, la variable original pasará a valer el dato que tenía, es decir no se modifica
En los parámetros enviados por Referencia, lo que se hace es enviar un puntero de la variable original. Entonces, si en la función o procedimiento se cambia el valor de la variable, el cambio seguirá manteniéndose una ves que finalice la ejecución del procedimiento o función.

1.4 - Ejemplo de envío de parámetros por Valor ( ByVal )


Código de ejemplo
Private Sub Command1_Click()

Dim Un_Valor As Long

Un_Valor = 100


'Se envía la variable por Valor ( ByVal )

Call Sumar(Un_Valor)

'Muestra el valor que es 100, ( no se modificó en la función Sumar )
MsgBox Un_Valor


End Sub

Sub Sumar(ByVal Valor As Long)
'Modifica la variable
Valor = Valor + 100

End Sub

 

En el ejemplo anterior hay una Sub llamada Sumar que recibe como parámetro una variable enviada por valor con ByVal ( es decir es una copia de la variable original ). al presionar el Commmand1.
Al entrar en la Sub Sumar, el dato se modifica ( Valor = Valor + 100). Cuando finaliza el procedimiento Sumar y retorna a la línea siguiente de la llamada a la Sub sumar, muestra mediante un MsgBox el valor de la misma, en este caso es 100, y NO 200 que es el cambio que tuvo dentro del procedimiento Sumar ( Valor = Valor + 100 ).
Con esto queda visto que en realidad al enviarla como ByVal, se envía una copia de la variable original y cualquier cambio que se produzca, será solo en el ámbito del procedimiento o función

 

1.5 - Ejemplo de envío de parámetros por Referencia ( ByRef )

Este ejemplo es igual que el anterior, pero en la Sub sumar , la variable Valor se declara con ByRef ( por Referencia )
Código
Private Sub Command1_Click()

Dim Un_Valor As Long

Un_Valor = 100


'Se envía la variable por Referencia ( ByRef ) con el valor 100

Call Sumar(Un_Valor)

'Muestra el valor que ahora es 200, ( ya que se modificó en la Sub Sumar)
MsgBox Un_Valor


End Sub

Sub Sumar(ByRef Valor As Long)
'Modifica la variable
Valor = Valor + 100

End Sub

 

Al probar el código, ahora el Msgox al mostrar el valor de la variable, es de 200, y NO de 100 como en el ejemplo de ByVal.
Esto demuestra que al enviar la variable como referencia, si la misma se modifica dentro del procedimiento o función, se está modificando la variable REAL, es decir cualquier cambio que se le haga a la misma, se mantendrá, ya que se está modificando la variable Real ( no es una copia )
Nota Importante: cuando no se indica a un parámetro de una función o Rutina ni ByVal, ni ByRef, se asume que la misma se está enviando como referencia (ByRef).
Es decir lo siguiente recibe el parámetro como Referencia
Sub Sumar(Valor As Long)
.. que es lo mismo a esto:
Sub Sumar(ByRef Valor As Long)


2 - Las Funciones en visual basic


Las funciones son casi exactamente iguales que los procedimientos con respecto a la forma en que se los llama y se los crea o declara en el código, en como se le pasa los parámetros etc..
La diferencia fundamental con respecto a los procedimientos o subrutinas es que estos, luego de ejecutar el código que tengan en su interior, al final retornan un valor, y este valor luego lo podemos utilizar para una determinada tarea. En cambio los procedimientos, solo ejecutan el código que contienen y luego mueren por decirlo de alguna manera.

Para declarar o crear una función podríamos escribir lo siguiente:
Private Function Total(Valor1 As Integer, Valor2 As Integer) As Long

Total = Valor1 + Valor2

End Function

Seguramente notaste que declaramos la función llamada Total, y al final de los parámetros dice As Long , esto es por que como dijimos las funciones retornan o devuelven un valor, o sea que en este caso la función es de tipo Long, o mejor dicho devolverá un valor de tipo Long., y luego ese valor devuelto lo podemos utilizar en otra parte del programa.
Las Funciones pueden retornar casi cualquier tipo de datos, como números, cadenas, fechas, arreglos y vectores
Para llamar a la función anterior podríamos hacerlo de la siguiente manera:
Label1.caption = Total 502, 1478

En este caso el control Label1 llamaría a la función Total , la función realizaría la suma de los valores pasados como parámetros y por último el valor final de la suma se lo asignaría al control label1.
Nota : En el siguiente link , hay un ejemplo de una función que retorna un array de tipo string

3 - Ejercicios de ejemplo sobre procedimientos y funciones


Estos ejercicios y ejemplos tratan los temas vistos en esta sección, podés descargarlos en los enlaces de abajo. Los archivos en formato zip, contienen el código fuente y la descripción de los mismos en el mismo código fuente.

  1. Ejemplo que llama a una subrutina, desde otra subrutina
  2. Ejemplo en el que creamos un procedimiento sencillo para sumar valores
  3. Ejemplo que utiliza un procedimiento dentro de otro procedimiento
  4. Este ejercicio ejecuta un procedimiento dependiendo de una condición, utilizando una estructura de control if - then
  5. Este ejercicio utiliza un procedimiento que recibe parámetros numéricos y los multiplica
  6. Ejemplo de como utilizar un procedimiento que recibe un parámetro de tipo boolean
  7. Ejemplo que muestra como pasar parámetros de tipo string y algunas cosas mas
  8. Ejemplo que muestra una sencilla función que suma 2 variables y luego retorna el valor, mostrándolo en un control label
  9. Ejemplo de una función de tipo integer que recibe 2 parámetros
  10. Ejemplo de una función de tipo boolean que es ejecutada de acuerdo a una condición If.