XL 2010 Problème dans Worksheet_Change(ByVal Target As Range)

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Sur ma feuille figure un tableau où l’on rentre des coordonnées en degrés sexagésimaux qui sont converties en degrés décimaux.
Dans les saisies (degrés sexagésimaux) figurent les colonnes des degrés et des minutes que j’ai volontairement mises en évidence (celle des secondes ne sont pas concernées par le problème).
Quand on rentre une donnée dans chacune des cellules des 2 colonnes qui nous intéressent, automatiquement, via macro événementielle, les cellules sont formatées ; à savoir :
Si la valeur est < 10 et <> 0, par exemple 5 (suivant la colonne) --> 05º ou 05’
Si la valeur = 0 ou > = 10, par exemple 25 (suivant la colonne) --> 25º ou 25’
Ça marche bien.

Seulement, je voudrais que l’on ne puisse rentrer que des valeurs entières et qu’automatiquement si l’on rentre, par erreur, une valeur décimale, seule la partie entière apparaisse. Par exemple :
Je rentre 38,7º --> 38º
Idem pour les minutes.

J’ai bidouillé une fonction qui me donne cette partie entière (marche bien), ne voulant pas utiliser Int(), car dans l’exemple précédent on aurait obtenu 39º.

Je tourne en rond depuis un moment, pas moyen de résoudre ce problème.

Merci d’avance pour toute aide.
 

Pièces jointes

  • Problème.xlsm
    33.5 KB · Affichages: 11

Magic_Doctor

XLDnaute Barbatruc
Merci pour vos réponses.

Autant pour moi, j'ai dû me planter en utilisant la fonction Int(). Mais là n'est pas le problème. Celui-ci réside dans ce que j'expliquais précédemment. Je pense qu'il peut être contourné directement dans la macro :
on rentre une valeur et celle-ci est automatiquement corrigée quand elle s'affiche après validation.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Peut être avec une modification de ce genre dans votre Worksheet_Change :
VB:
    If Not Intersect(Target, [L6:L7, L9:L10]) Is Nothing Then
        Application.EnableEvents = False
        Target = Int(Target)
        MiseEnFomeCoordonnées Int(Target), 1        'degrés
        Application.EnableEvents = True
    End If
    If Not Intersect(Target, [M6:M7, M9:M10]) Is Nothing Then
        Application.EnableEvents = False
        Target = Int(Target)
        MiseEnFomeCoordonnées Int(Target), , 1      'minutes
        Application.EnableEvents = True
    End If
 

Magic_Doctor

XLDnaute Barbatruc
Merci sylvanu, c'est exactement ce que je venais de trouver :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim col As Byte, colDD As Byte, coldeg As Byte, colmin As Byte, colsec As Byte

    On Error Resume Next 'sinon ça plante...
    
    col = Target.Column
    
    'Mise en forme des coordonnées (Degrés/Minutes) saisies en degrés sexagésimaux afin de faire précéder d'un "0" si le résultata est inférieur à 10 & <> 0
    If Not Intersect(Target, [L6:L7, L9:L10]) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = Abs(Int(Target.Value))
        Application.EnableEvents = True
        MiseEnFomeCoordonnées Target, 1        'degrés
    End If
    If Not Intersect(Target, [M6:M7, M9:M10]) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = Abs(Int(Target.Value))
        Application.EnableEvents = True
        MiseEnFomeCoordonnées Target, , 1      'minutes
    End If
    'Mise en forme des coordonnées (secondes) saisies en degrés sexagésimaux afin qu'elles aient toujours 3 décimales après la virgule, même si ce sont des "0"
    If Not Intersect(Target, [N6:N7, N9:N10]) Is Nothing Then MiseEnFomeCoordonnées Target, , , 1    'secondes
    'Mise en forme des coordonnées (Latitudes/Longitudes), après saisies en degrés sexagésimaux, en fonction du nombre de décimales après la virgule (pour qu'il n'y ait pas de "0" inutiles)
    If Not Intersect(Target, [L6:L7, L9:L10, M6:M7, M9:M10, N6:N7, N9:N10]) Is Nothing Then
        colDD = [Latitude3].Column
        MiseEnFomeCoordonnées Target.Offset(0, colDD - col)
    End If
        
    'Saisies rapides en degrés sexagésimaux : sélection de la cellule suivante pour la rentrée des données
    If Not Intersect(Target, [L6:L7, L9:L10, M6:M7, M9:M10]) Is Nothing Then Target.Offset(0, 1).Select
    If Not Intersect(Target, [N6]) Is Nothing Then Target.Offset(1, -2).Select
    If Not Intersect(Target, [N7]) Is Nothing Then Target.Offset(2, -2).Select
    If Not Intersect(Target, [N9]) Is Nothing Then Target.Offset(1, -2).Select
    If Not Intersect(Target, [N10]) Is Nothing Then Target.Select

End Sub
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
sans macro ni événementielle, ni validation ...

pour saisir des données sexagésimales :
utiliser la notation sexagésimale d'excel hh:mm:ss,xxx
la cellule doit etre formatée selon : [h]°mm\'ss\",000

pour utilisation décimale multiplier la valeur par 24
1592471072866.png
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Décidément, Excel c'est rigolo, on a toujours des surprises.
TOUT marche parfaitement maintenant, sauf dans un cas de figure.
Si (dans les degrés ou minutes) je rentre une valeur négative décimale, par exemple -5,1, j'obtiens curieusement -6. Bizarre !
 

Pièces jointes

  • Problème.xlsm
    32.5 KB · Affichages: 3

Magic_Doctor

XLDnaute Barbatruc
J'ai trouvé une solution qui semble marcher, mais franchement à la brut de décoffrage !
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim col As Byte, colDD As Byte, coldeg As Byte, colmin As Byte, colsec As Byte, cor as byte

    On Error Resume Next 'sinon ça plante...

    col = Target.Column

    'Mise en forme des coordonnées (Degrés/Minutes) saisies en degrés sexagésimaux afin de faire précéder d'un "0" si le résultata est inférieur à 10 & <> 0
    If Not Intersect(Target, [L6:L7, L9:L10]) Is Nothing Then
        Application.EnableEvents = False
        cor = IIf(Target <> Int(Target) And Target < 0, 1, 0)
        Target = Abs(Int(Target)) - cor
        Application.EnableEvents = True
        MiseEnFomeCoordonnées Target, 1        'degrés
    End If
    If Not Intersect(Target, [M6:M7, M9:M10]) Is Nothing Then
        Application.EnableEvents = False
        cor = IIf(Target <> Int(Target) And Target < 0, 1, 0)
        Target.Value = Abs(Int(Target.Value)) - cor
        Application.EnableEvents = True
        MiseEnFomeCoordonnées Target, , 1      'minutes
    End If
    'Mise en forme des coordonnées (secondes) saisies en degrés sexagésimaux afin qu'elles aient toujours 3 décimales après la virgule, même si ce sont des "0"
    If Not Intersect(Target, [N6:N7, N9:N10]) Is Nothing Then MiseEnFomeCoordonnées Target, , , 1    'secondes
    'Mise en forme des coordonnées (Latitudes/Longitudes), après saisies en degrés sexagésimaux, en fonction du nombre de décimales après la virgule (pour qu'il n'y ait pas de "0" inutiles)
    If Not Intersect(Target, [L6:L7, L9:L10, M6:M7, M9:M10, N6:N7, N9:N10]) Is Nothing Then
        colDD = [Latitude3].Column
        MiseEnFomeCoordonnées Target.Offset(0, colDD - col)
    End If
    
    'Saisies rapides en degrés sexagésimaux : sélection de la cellule suivante pour la rentrée des données
    If Not Intersect(Target, [L6:L7, L9:L10, M6:M7, M9:M10]) Is Nothing Then Target.Offset(0, 1).Select
    If Not Intersect(Target, [N6]) Is Nothing Then Target.Offset(1, -2).Select
    If Not Intersect(Target, [N7]) Is Nothing Then Target.Offset(2, -2).Select
    If Not Intersect(Target, [N9]) Is Nothing Then Target.Offset(1, -2).Select
    If Not Intersect(Target, [N10]) Is Nothing Then Target.Select

End Sub

Quoi qu'il en soit, je ne suis pas satisfait...
 

Pièces jointes

  • Problème.xlsm
    32.6 KB · Affichages: 1
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

rien de bizarre.
La partie entière de -5.1 est bien -6.
Si il te faut -5 alors utiliser Fix()
Int renvoie le premier entier négatif inférieur ou égal à nombre, alors que Fix renvoie le premier entier négatif supérieur ou égal à nombre.

Quoi qu'il en soit, je ne suis pas satisfait...
Pourquoi ne pas tester avec la validation proposée au post #2 ?
Autoriser Nombre entier et c'est fini...
eric
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonsoir Eriiiic,

Il est vrai que je ne m'étais jamais posé la question de ce que pouvait être exactement un entier négatif. Pourtant j'avais fait TC... Mais on nous emmerdait davantage avec les espaces vectoriels et les nombres complexes.
Ça marche !
Un grand merci.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 069
Messages
2 085 041
Membres
102 764
dernier inscrit
nestu