Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Problème dans une fonction avec Optional

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'ai rédigé une fonction qui fonctionne :
VB:
Function ConvertirDecimalEnDegMin$(NbDec$, Optional signe As Boolean = False)
'Retranscrit une valeur décimale en format de TEXTE (qui ne doit pas dépasser 2 décimales après la virgule) en degrés et minutes
'- NbDec : un nombre décimal où les chiffres avant la virgule représentent les degrés et ceux après la virgule les minutes
'          Ex : 42,75 <=> 42° 75'
'- signe : si omis ou False --> pas de signe +/- avant la chaîne de caractères
'          si True --> un signe +/- (suivant la valeur du compteur) avant la chaîne de caractères
'          Ex (suivant que signe est False ou True) : signe omis ou False : 42,75 --> 42° 75'
'                                                     signe True (suivant la valeur de compt(1)) : + 42° 75' | - 42° 75'
'Magic_Doctor

Dim verif As Boolean, deg%, min As Byte, largo As Byte, pos As Byte

    verif = IIf(NbDec = Int(NbDec), True, False)            'vérifie si NbDec est entier ou pas
    deg = Int(NbDec)                                        'nombre de degrés (à gauche de la virgule)
    largo = Len(NbDec)
    pos = InStr(NbDec, ",")
    min = IIf(verif = False, Right(NbDec, largo - pos), 0)  'nombre de minutes (à droite de la virgule)

    ConvertirDecimalEnDegMin = IIf(signe, IIf(compt(1) = 1, "+ ", "- "), "") & deg & "°" & IIf(min = 0, "", " " & min & "'")

End Function
Il se trouve qu'il y a plusieurs compteurs (compt(x), variables déclarées en Public dans un module standard et qui ne peuvent avoir que 2 valeurs : 1 ou 2) et, plutôt que d'affecter une fonction pour chaque compteur, j'ai rédigé ceci :
VB:
Function ConvertirDecimalEnDegMin2$(NbDec$, Optional compteur As Byte)
'Retranscrit une valeur décimale en format de TEXTE (qui ne doit pas dépasser 2 décimales après la virgule) en degrés et minutes
'- NbDec : un nombre décimal où les chiffres avant la virgule représentent les degrés et ceux après la virgule les minutes
'          Ex : 42,75 <=> 42° 75'
'- compteur : un numéro de compteur (1, 2, 3...)
'             si omis --> pas de signe +/- avant la chaîne de caractères
'             si stipulé --> un signe +/- (suivant la valeur du compteur) avant la chaîne de caractères
'             Ex : compteur omis : 42,75 --> 42° 75'
'                  compteur stipulé : + 42° 75' | - 42° 75'
'Magic_Doctor

Dim verif As Boolean, deg%, min As Byte, largo As Byte, pos As Byte

    verif = IIf(NbDec = Int(NbDec), True, False)            'vérifie si NbDec est entier ou pas
    deg = Int(NbDec)                                        'nombre de degrés (à gauche de la virgule)
    largo = Len(NbDec)
    pos = InStr(NbDec, ",")
    min = IIf(verif = False, Right(NbDec, largo - pos), 0)  'nombre de minutes (à droite de la virgule)

    If IsMissing(compteur) Then
        ConvertirDecimalEnDegMin2 = deg & "°" & IIf(min = 0, "", " " & min & "'")
    Else
        ConvertirDecimalEnDegMin2 = IIf(compt(compteur) = 1, "+ ", "- ") & deg & "°" & IIf(min = 0, "", " " & min & "'")
    End If

End Function
Et là, si dans le paramétrage de la fonction j'omets un numéro de compteur (2ème argument), ça plante.
Le problème, je pense, doit être dans le "IsMissing".

Merci d'avance pour une explication.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour,
Merci d'avance pour une explication.
"By Design" Excel fait des choses concernant la reconnaissance des nombres lors des saisies...
Certaines sont transparentes et sont très utiles mais difficilement contournables.

pour ta saisie de texte sous forme décimale 7,5 pour 7° 5 et 7,52 pour 7° 52
je crois que nous sommes en plein dedans
le codage numérique interne intervient avant que ta macro ne fasse quoi que se soit ...

un contournement possible si tu ne veux te servir que du pavé numérique serait alors d'utiliser la correction automatique lors de la frappe...
Mais la frappe devra alors respecter une petite astuce
Frapper "/" avant le séparateur décimal utilisé ","
le remplacement de "/," par "°espace"
fera que le foutu "By Design" sera pris de court
la saisie sera 7° 5 au lieu de 7/,5
ou la saisie sera 7° 52 au lieu de 7/,52
le contenu sera reconnu comme texte et le restera.
nb :
- il ne pourra pas être directement possible de faire des calculs avec ces valeurs textes
- il n'y aura pas non plus de contrôle de validité de valeur ,5 ,52 ou ,527 (inferieur à ,60 en décimal)


 

Magic_Doctor

XLDnaute Barbatruc
Bon, problème réglé. La solution est, pour le moins, capillotractée :
IsMissing does not work on simple data types (such as Integer or Double) because, unlike Variants, they don't have a provision for a "missing" flag bit.
Or, j'avais déclaré "compteur" comme un Byte (jamais je ne dépasserai 250 compteurs...). D'où :
VB:
Function ConvertirDecimalEnDegMin2$(NbDec$, Optional compteur)
'Retranscrit une valeur décimale en format de TEXTE (qui ne doit pas dépasser 2 décimales après la virgule) en degrés et minutes
'- NbDec : un nombre décimal où les chiffres avant la virgule représentent les degrés et ceux après la virgule les minutes
'          Ex : 42,75 <=> 42° 75'
'- compteur : un numéro de compteur (1, 2, 3...)
'             si omis --> pas de signe +/- avant la chaîne de caractères
'             si stipulé --> un signe +/- (suivant la valeur du compteur) avant la chaîne de caractères
'             Ex : compteur omis : 42,75 --> 42° 75'
'                  compteur stipulé : + 42° 75' | - 42° 75'
'Magic_Doctor

Dim verif As Boolean, deg%, min As Byte, largo As Byte, pos As Byte
   
    verif = IIf(NbDec = Int(NbDec), True, False)            'vérifie si NbDec est entier ou pas
    deg = Int(NbDec)                                        'nombre de degrés (à gauche de la virgule)
    largo = Len(NbDec)
    pos = InStr(NbDec, ",")
    min = IIf(verif = False, Right(NbDec, largo - pos), 0)  'nombre de minutes (à droite de la virgule)
   
    If IsMissing(compteur) Then
        ConvertirDecimalEnDegMin2 = deg & "°" & IIf(min = 0, "", " " & min & "'")
    Else
        ConvertirDecimalEnDegMin2 = IIf(compt(compteur) = 1, "+ ", "- ") & deg & "°" & IIf(min = 0, "", " " & min & "'")
    End If

End Function
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Décidément, tous nos posts se sont croisés... Pas rafraîchi !

Il est vrai que IsMissing peut concerner beaucoup de choses, d'où Variant pour les variables optionnelles quand elles sont traitées par IsMissing. C'est logique.

Feliz año nuevo para vos, Modeste geedee y todos los del forum.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…