Parámetros opcionales

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
valenteres
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Parámetros opcionales

Mensaje 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
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Parámetros opcionales

Mensaje 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
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Parámetros opcionales

Mensaje 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!!
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
valenteres
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Mensaje 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
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Parámetros opcionales

Mensaje 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
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
valenteres
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Mensaje 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
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Parámetros opcionales

Mensaje 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
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Parámetros opcionales

Mensaje por mauricio »

A mi me funciono sin problemas con la B...

Y "nunca" utilices un MsgBox dentro de una función...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
valenteres
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Mensaje 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
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Parámetros opcionales

Mensaje 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 :)
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
valenteres
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Mensaje 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
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Parámetros opcionales

Mensaje por SLV-es »

En LibO 4.4.6 funciona perfectamente
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Responder