Saltar navegación

Documentación de FlexPro 2025

Notas sobre el trabajo con FlexPro VBA

Este tema le ofrece algunos consejos sobre los problemas que pueden surgir al programar en Visual Basic.

Uso de la instrucción Set al asignar la propiedad Value a variables

Problemas al utilizar valores de color de tipo OLE_COLOR

Eliminación de objetos FlexPro de una lista dentro de un bucle For-Each

Conversión de números en cadenas con la función CStr

Evitar mensajes de error en acciones totalmente automatizadas

Evaluación de expresiones en VBA (nota para desarrolladores de C/C++)

Uso de la instrucción Set al asignar la propiedad Value a variables

Al asignar la propiedad Value de un objeto ValueObject a una variable, hay que asegurarse de que la propiedad Value es de tipo Variant y puede devolver no solo campos o valores escalares, sino también valores complejos, señales y listas. Los valores complejos, señales y listas son en sí mismos objetos en FlexPro y deben ser asignados a variables usando la instrucción Set.

La siguiente instrucción solo es una asignación de valor válida si el valor de oValueObject no es ni complejo, ni señal, ni lista:

Dim vtValue As Variant

Dim oValueObject As ValueObject

    ...

vtValue = oValueObject.Value

Si oValueObject.Value es complejo, una señal o una lista, se muestra el mensaje de error "Object does not support this property or method". Utilice la instrucción Setcuando asigne valores complejos, señales o listas:

set vtValue = oValueObject.Value

Si al escribir una macro no se sabe si un valor es complejo o real en tiempo de ejecución, puede utilizarse la instrucción IsObject para garantizar que no se produzca ningún error al ejecutar la macro:

If IsObject(oValueObject.Value) Then

    Set vtValue = oValueObject.Value

Else

    vtValue = oValueObject.Value

End If

Si el valor de oValueObject es un objeto, se utiliza la instrucción Set, en caso contrario el valor debe asignarse con "=".

Problemas al utilizar valores de color de tipo OLE_COLOR

El tipo OLE_COLOR es un tipo de datos estándar de OLE para almacenar valores de color RGB. El tipo de datos se declara - en C/C++ - como un valor long sin signo. VBA no admite valores sin signo. Por este motivo, a veces pueden surgir problemas al utilizar OLE_COLOR. El siguiente código conduce al mensaje de error "La variable utiliza un tipo de automatización no admitido en Visual Basic":

If ActiveDatabase.ActiveObject.Selection.FillFormat.Color <> _

    fpColorRed Then

    ...

End If

Este mensaje de error puede evitarse de dos maneras. O bien se convierte el valor de color en un valor long antes de la comparación

If CLng(ActiveDatabase.ActiveObject.Selection.FillFormat.Color) <> _

    fpColorRed Then

    ...

End If

o se introduce una variable del tipo OLE_COLOR, se le asigna el valor de color y luego se utiliza la variable recién introducida para la comparación:

   Dim clr As OLE_COLOR

   clr = ActiveDatabase.ActiveObject.Selection.FillFormat.Color

   If clr <> fpColorRed Then

       ...

   End If

Eliminación de objetos FlexPro de una lista dentro de un bucle For...Each

Debe evitarse el borrado de objetos FlexPro de una lista mediante un bucle For...Each, ya que puede dar lugar a resultados no deseados o provocar que no se recorran todos los elementos de la lista.

Si desea eliminar los elementos de cualquier lista de objetos FlexPro, el siguiente código, por ejemplo, producirá el resultado deseado:

While oColl.Count > 0

    oColl.Remove 1

Wend

o

While oColl.Count > 0

    oColl(1).Delete

Wend

Conversión de números en cadenas con la función CStr

Si utiliza la función CStr para convertir números en cadenas, tenga en cuenta que esta función siempre utiliza la región y las opciones de idioma (Locale) actuales para la conversión. En un sistema español, los dígitos antes y después del decimal se separan con una ",", mientras que en un sistema inglés se utiliza ".". Si desea realizar la conversión numérica independientemente de la configuración del sistema, debe utilizar la función de la API de Windows SetLocaleInfo para cambiar temporalmente la configuración del sistema. Puede ver cómo se utiliza esta función de la API en el ejemplo Un filtro de importación personalizado.

Evitar mensajes de error en acciones totalmente automatizadas

En el caso de acciones totalmente automatizadas que deban ejecutarse sin interacción del usuario, debe garantizarse en primer lugar que todos los errores se traten en las propias macros (uso coherente de la instrucción On Error). Además, en el entorno Visual Basic, en Extras > Opciones en la pestaña General, el ajuste de Interrupción en caso de error debe establecerse en En caso de errores no procesados, ya que de lo contrario el flujo del programa puede detenerse en caso de posibles errores permitidos, se muestra el error y se requiere una acción del usuario (véase también la propiedad DisplayAlerts del objeto Application).

Evaluación de expresiones en VBA (nota para desarrolladores de C/C++)

A diferencia de C/C++, donde las expresiones solo se evalúan de izquierda a derecha el tiempo necesario durante la evaluación de la condición, VBA siempre evalúa la expresión completa.

La siguiente expresión C/C++

 (1) if(exp1 && exp2)

        ...

corresponde en VBA a

 (2) If exp1 And exp2 Then

        ...

Si en (1) exp1 ya devuelve False en (1), exp2 ya no se evalúa, sino que el código de la instrucción If se ejecuta inmediatamente. En (2) exp2 se evalúa independientemente de si exp1 devuelve False o no. Si se supone que exp1 devuelve True para que exp2 sea válido, la instrucción debe descomponerse en VBA:

If exp1 Then

    ...

    If exp2 Then

        ...

    End If

        ...

End If