Página 1 de 1

Parámetros opcionales

Publicado: Dom Feb 28, 2016 11:33 pm
por valenteres
Buenas noches.

Estoy intentando pasar parámetros opcionales a una función.
Siguiendo el manual de Mauricio Baeza, al entrar en la función compruebo si tiene asignado un valor, y si no es así le asigno un valor por defecto.
En mi caso paso un parámetro no opcional y 4 opcionales. De los 4 parámetros opcionales unas veces me interesa pasar unos y otras otros.
El código utilizado es el siguiente:

Código: Seleccionar todo

Sub Prueba

Dim Aux as Double

Aux = ParOpcional(1)
 
End Sub


Function ParOpcional(A as integer, Optional B as Double, Optional C as Double, Optional D as Double, Optional E as Double) as Double

Select case A

	Case 1
		MsgBox "B= " & B
		If IsMissing(B) Then B=5
		MsgBox "C= " & C
		If IsMissing(C) Then C=6
		MsgBox "D= " & D
		If IsMissing(D) Then D=7
		MsgBox "E= " & E
		If IsMissing(E) Then E=8
	Case 2
		MsgBox B
		If IsMissing(B) Then B=1
		MsgBox C
		If IsMissing(C) Then C=3
		MsgBox D
		If IsMissing(D) Then D=5
		MsgBox E
		If IsMissing(E) Then E=7
	Case 3
		MsgBox B
		If IsMissing(B) Then B=2
		MsgBox C
		If IsMissing(C) Then C=4
		MsgBox D
		If IsMissing(D) Then D=6
		MsgBox E
		If IsMissing(E) Then E=8
	Case Else
		MsgBox B
		If IsMissing(B) Then B=11
		MsgBox C
		If IsMissing(C) Then C=12
		MsgBox D
		If IsMissing(D) Then D=13
		MsgBox E
		If IsMissing(E) Then E=14

End Select

ParOpcional = A + B^0.5 - C/2 + D/11 - E*5

End Function
Este código funciona bien como muestro en la siguiente captura de pantalla:
Opcionales01.png
En cambio, cuando intento pasar algunos de los parámetros opcionales da problemas
Cambiando la línea de llamada a la función :

Código: Seleccionar todo

Aux = ParOpcional(1)
Por otra en la que se da uno de los parámetros opcionales:

Código: Seleccionar todo

Aux = ParOpcional(1,,,,3,)
El valor de la variable las variable a las que no se ha dado valor adquieren el valor 448 y no se reconocen como Missing
Opcionales02.png
¿Como puedo ingresar el valor de algunos de los parámetros opcionales y que el resto los siga reconociendo como "Missing"

Un saludo

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 12:03 am
por mauricio
Obtienes el error 448, por que intentas usar una variable opcional que NO has pasado:

Código: Seleccionar todo

    Select case A

       Case 1
          If IsMissing(B) Then B=5
          MsgBox "B= " & B
          If IsMissing(C) Then C=6
          MsgBox "C= " & C
          If IsMissing(D) Then D=7
          MsgBox "D= " & D
          If IsMissing(E) Then E=8
          MsgBox "E= " & E
Saludos

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 1:04 am
por mauricio
Solo por curiosidad, con Python podría ser así:

Código: Seleccionar todo

def opt(a, **kwargs):
    'Valores predeterminados'
    default = {'b': 11, 'c': 12, 'd':13, 'e': 14}
    'Valores si a'
    values = {
        1: {'b': 5, 'c': 6, 'd':7, 'e': 8},
        2: {'b': 1, 'c': 3, 'd':5, 'e': 7},
        3: {'b': 2, 'c': 4, 'd':6, 'e': 8},
    }
    if a in values:
        default = values[a]
    'Actualizamos solo las variables opcionales pasadas'
    default.update(kwargs)
    result = a + default['b']**0.5 - default['c']/2 + default['d']/11 - default['e']*5
    return result

print (opt(1))

print (opt(2, e=3))

print (opt(3, b=5, d=10))
Me encanta Python!!

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 8:32 am
por valenteres
Buenos días:

La pregunta es ¿Como puedo identificar en Basic esta situación?
¿Como puedo diferenciar si el valor B=448 es un valor válido de B o es el valor de Error 448?

Un saludo y muchas gracias

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 2:42 pm
por SLV-es
Como te ha comentado mauricio, aquí primero utilizas la variable B que quizás no se ha pasado, y luego verificas si no se ha pasado y en ese caso, le asignas un valor

Código: Seleccionar todo

MsgBox "B= " & B
If IsMissing(B) Then B=5
Esto es erróneo.

Lo correcto es comprobar primero si se ha pasado, y si no asignarle una valor. Luego utilizarla.

Código: Seleccionar todo

If IsMissing(B) Then B=5
MsgBox "B= " & B
Lo mismo se aplica al resto de variables de tu macro.

Primero tienes que identificar si se ha pasado la variable (si es missing), y si no se ha pasado, asignarle el valor por defecto.
Luego, ya puedes utilizar la variable. Si no es missing (se pasó), tomará el valor que se le pasó a la función.

+info en http://wiki.open-office.es/Modos_de_pas ... fice_Basic

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 3:01 pm
por valenteres
Buenos días:
Muchas gracias a los dos.

Algo debo estar haciendo mal, porque el comportamiento sigue siendo el mismo.
He simplificado el código y he puesto el siguiente:

Código: Seleccionar todo

Option Explicit

Sub Prueba

Dim Aux as Double

Aux = ParOpcional(1,,3,4,5)

End Sub


Function ParOpcional(A as integer, Optional B as Double, Optional C as Double, Optional D as Double, Optional E as Double) as Double

If IsMissing(B) Then B=-99
      MsgBox "B= " & B
If IsMissing(C) Then C=-99
      MsgBox "C= " & C
If IsMissing(D) Then D=-99
      MsgBox "D= " & D
If IsMissing(E) Then E=-99
      MsgBox "E= " & E

End Function
El resultado sigue siendo el mismo. El valor que presenta es B=448, el resto de valores toma los valores aportados como opcionales.

Un saludo

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 4:11 pm
por SLV-es
Creo recordar que existían algunos términos que no se podían utilizar como nombres de variables; y ahora que lo comentamos, creo que la B era una de ellos

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 4:24 pm
por mauricio
A mi me funciono sin problemas con la B...

Y "nunca" utilices un MsgBox dentro de una función...

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 7:37 pm
por valenteres
Buenas tardes:

No lo consigo. He actualizado Libre Office a la versión 5.0.5.2 y sigue igual.
De momento puede pasar sin los parámetros opcionales.

Muchas gracias

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 8:20 pm
por SLV-es

Código: Seleccionar todo

Option Explicit

Sub Prueba
  Dim Aux as Double
  Aux = ParOpcional(1,,3,4,5)
End Sub

Function ParOpcional(A as integer, Optional B, Optional C, Optional D, Optional E) as Double
If IsMissing(B) Then B=-99
      MsgBox "B= " & B
If IsMissing(C) Then C=-99
      MsgBox "C= " & C
If IsMissing(D) Then D=-99
      MsgBox "D= " & D
If IsMissing(E) Then E=-99
      MsgBox "E= " & E
End Function
Funciona :)

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 9:00 pm
por valenteres
Algo he visto:

En Apache OpenOffice 4.1.2 funciona perfectamente
En Libre Office 5.0.5.2 sigo teniendo los mismos problemas

Ahora tengo un dilema:
- Apache me daba problemas con los gráficos
- Libre Office me da problemas con los parámetros opcionales

solución ¿?

Un saludo

Re: Parámetros opcionales

Publicado: Lun Feb 29, 2016 9:23 pm
por SLV-es
En LibO 4.4.6 funciona perfectamente