Conseils pour travailler avec FlexPro VBA

23.08.2021

Cette rubrique fournit des informations sur les problèmes qui peuvent survenir lors de la programmation en Visual Basic.

Utilisation de l'instruction Set lors de l'affectation de la propriété Value à des variables

Problèmes lors de l'utilisation des valeurs de couleur OLE_COLOR

Suppression d'objets FlexPro d'une collection dans une boucle For-Each

Conversion de nombres en chaînes de caractères à l'aide de la fonction CStr

Prévenir les messages d'erreur pour les processus entièrement automatisés

Évaluation des expressions dans VBA (Note pour les développeurs C/C++)

Utilisation de l'instruction Set lors de l'affectation de la propriété Value à des variables

Lorsque vous affectez la propriété Value d'un objet ValueObject à une variable, vous devez tenir compte du fait que la propriété Value est de type Variant et peut également renvoyer des valeurs complexes, des signaux et des listes en plus des valeurs scalaires et des tableaux. Les valeurs complexes, les signaux et les listes sont eux-mêmes des objets dans FlexPro et doivent être affectés à des variables à l'aide de l'instruction Set.

L'instruction suivante ne représente une affectation valide d'une valeur que si la valeur de oValueObject n'est ni complexe ni un signal ou une liste :

Dim vtValue As Variant

Dim oValueObject As ValueObject

    ...

vtValue = oValueObject.Value

Si oValueObject.Value est complexe ou est un signal ou une liste, le message d'erreur "Object does not support this property or method" apparaît. Pour affecter des valeurs, des signaux ou des listes complexes, vous devez donc utiliser l'instruction Set:

set vtValue = oValueObject.Value

Lorsque vous écrivez une macro et que vous ne savez pas si une valeur sera complexe ou réelle au moment de l'exécution, l'utilisation de l'instruction IsObject peut éviter des erreurs lors de l'exécution de la macro :

If IsObject(oValueObject.Value) Then

    Set vtValue = oValueObject.Value

Else

    vtValue = oValueObject.Value

End If

Si la valeur de oValueObject est un objet, l'instruction Set est utilisée ; sinon, la valeur doit être assignée en utilisant '='.

Problèmes lors de l'utilisation des valeurs de couleur OLE_COLOR

Le type OLE_COLOR est un type de données standard OLE permettant de stocker des valeurs de couleur RGB. En C/C++, le type de données est déclaré comme une valeur Long non signée. VBA ne prend pas en charge les valeurs non signées. Par conséquent, l'utilisation de OLE_COLOR peut occasionnellement causer des problèmes. Le code suivant peut générer le message d'erreur "Variable uses Automation type not supported in Visual Basic" :

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

    fpColorRed Alors

    ...

End If

Il y a deux façons d'éviter ce message d'erreur. La première consiste à convertir les valeurs de couleur en une valeur longue avant la comparaison :

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

    fpColorRed Alors

    ...

End If

La seconde consiste à introduire une variable OLE_COLOR, à lui attribuer la valeur de la couleur, puis à utiliser la nouvelle variable pour la comparaison :

   Dim clr As OLE_COLOR

   clr = ActiveDatabase.ActiveObject.Selection.FillFormat.Color

   Si clr <> fpColorRed alors

       ...

   End If

Suppression d'objets FlexPro d'une collection dans une boucle For...Each

La suppression d'objets FlexPro d'une collection à l'aide d'une boucle For...Each doit être évitée, car elle peut entraîner des résultats indésirables et certains éléments de la collection peuvent être manqués.

Si les éléments d'une collection d'objets FlexPro doivent être supprimés, le code suivant conduit au résultat souhaité :

Alors que oColl.Count > 0

    oColl.Remove 1

Wend

ou

Alors que oColl.Count > 0

    oColl(1).Delete

Wend

Conversion de nombres en chaînes de caractères à l'aide de la fonction CStr

Lorsque vous utilisez la fonction CStr pour convertir des nombres en chaînes de caractères, vous devez tenir compte du fait que la fonction utilise toujours les paramètres actuels de la région et des options linguistiques (Locale) pour la conversion. Dans le système allemand, un "," est utilisé pour séparer la partie entière d'un nombre décimal de sa partie fractionnaire, alors que le "." est utilisé dans le système britannique ou américain. Si vous souhaitez convertir des nombres indépendamment des paramètres du système, vous devez utiliser la fonction SetLocaleInfo de l'API Windows pour modifier temporairement les paramètres du système. Dans l'exemple Un filtre d'importation personnalisé, vous pouvez voir comment cette fonction API est utilisée.

Prévenir les messages d'erreur pour les processus entièrement automatisés

Pour les processus entièrement automatisés qui doivent s'exécuter sans interaction avec l'utilisateur, vous devez d'abord vous assurer que toutes les erreurs sont traitées par les macros elles-mêmes (utilisation cohérente de l'instruction On Error ). En outre, assurez-vous que le paramètre suivant est activé dans l'environnement Visual Basic : sous Outils > Options, dans l'onglet Général, le paramètre de piégeage des erreurs doit être défini sur Break on Unhandled Errors. Sinon, l'exécution du programme peut être interrompue si des erreurs autorisées se produisent, et l'erreur peut être affichée, ce qui nécessite une interaction de l'utilisateur (voir également la propriété DisplayAlerts de l'objet Application ).

Évaluation des expressions dans VBA (Note pour les développeurs C/C++)

Contrairement à C/C++, où les expressions ne sont évaluées que de gauche à droite pendant la durée nécessaire à l'évaluation de la condition, VBA évalue toujours l'expression complète.

L'expression C/C++ suivante

 (1) if(exp1 && exp2)

        ...

correspond à ce qui suit en code VBA

 (2) If exp1 And exp2 Then

        ...

Si dans (1) exp1 renvoie False, exp2 ne sera plus évalué et le code de l'instruction If sera exécuté immédiatement. Dans (2), exp2 est évalué indépendamment du fait que exp1 renvoie ou non False. Si exp1 doit retourner False pour valider exp2, l'instruction en VBA doit être désassemblée :

Si exp1 alors

    ...

    Si exp2 Alors

        ...

    End If

        ...

End If

Vous serez probablement intéressé par les articles suivants :