[Catégorie ENCORE modifiée .Net -> VBA] Passer au format heures par vba [Résolu]

- - Dernière réponse :  FMAILYS - 23 nov. 2012 à 22:14
Bonjour

Sur un fichier excel, j'aimerais par le biais d'une vba faire la chose suivante

Quand je saisis 12.50 dans une cellule donnée, j'aimerais que le format qui s'affiche soit 12h50.

J'aimerais aussi avoir une msg box qui m'indique "Attention, vous devez saisir en centièmes d'heures" quand je ne saisi pas un chiffre qui se termine par 25,50,75 ou 00.

Quelqu'un pourrait il m'aiguiller sur une éventuelle façon de faire

Merci par avance

Cdt
Afficher la suite 

17 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
3
Merci
Salut

Complexe.
Pour le format, aucun format ne peut transformer 12.50 en 12h50.
Au mieux, tu peux obtenir 12h,50 avec le format de cellule ##\h,00
Il faut donc transformer le chiffre en texte, mais celui-ci ne sera plus exploitable en tant que chiffre pour l'utiliser dans des calculs, par exemple.

Ce qui suit suppose que les cellules à surveiller sont toujours des chiffres, avec ou sans formatage de la cellule.

Pour vérifier le contenu, la difficulté consiste à savoir quand il faut faire cette analyse.
Si tu mets du code dans Worksheet_Change, la Sub se déclenchera dès que tu écris un des chiffres, alors qu'il ne faut faire cette analyse qu'une fois le chiffre entier saisi, c'est à dire quand tu quitte la cellule.
Hélas, il n'existe pas de "Validate" sur les cellules Excel.
Il faut donc le coder :
Dans Worksheet_SelectionChange (pas Change mais SelectionChange), il faut détecter que tu es dans la cellule (ou groupe de cellules) devant faire l'objet de ce contrôle de saisie, mais ne pas faire le contrôle pour l'instant.
On va mémoriser l'adresse de la cellule que l'on relira plus tard.
Pour définir cette mémoire, mets cette déclaration dans la partie "Déclarations" de ta page de code :
Private oOldRange As Range

Dans Worksheet_SelectionChange, il faut détecter que l'on a sélectionné une de nos cellules à contrôler :
On va supposer que le groupe de cellules à surveiller correspond au Range B2 à D300 (voir en fin de code) :
    Dim oRange As Range
    Dim PartieDecimale As Long
    ' Test si la précédente position faisait partie de notre plage à surveiller
    If Not oOldRange Is Nothing Then
        ' Ressort si on arrive ici à cause d'un Select fait dans cette même procédure
        If Target.Address = oOldRange.Address Then Exit Sub
        ' On était dans notre plage juste avant
        If Not IsNumeric(oOldRange.Value2) Then
            ' Le contenu n'est pas un chiffre valide
            ' On se repositionne dessus + alerte
            oOldRange.Select
            MsgBox "La cellule " & oOldRange.Address & " doit contenir un chiffre"
        Else
            ' Ok, c'est bien un chiffre : Vérifie la syntaxe
            ' Rappel : Même si on applique un format d'affichage à la cellule,
            '   son contenu reste un chiffre (.Value2)
            ' Récupère ce qui est après la virgule, en centième
            PartieDecimale = CLng((oOldRange.Value2 - Int(oOldRange.Value2)) * 100)
            Select Case PartieDecimale
                Case 0, 25, 50, 75
                    ' Ok, tout va bien
                Case Else
                    ' Pas glop
                    ' On se repositionne dessus + alerte
                    oOldRange.Select
                    MsgBox "La cellule " & oOldRange.Address & " doit comporter les " & _
                           "décimales 00, 25, 50 ou 75"
            End Select
        End If
    End If
    ' Pas de test si plusieurs cellules sont sélectionnées
    If Target.Cells.Count > 1 Then Exit Sub
    ' Vérifie si la cellule sélectionnée fait partie de notre plage à surveiller
    Set oRange = Intersect(Target, Range("B2:D300"))
    If Not oRange Is Nothing Then
        ' La cellule active fait partie de notre zone
        Set oOldRange = Target
    Else
        ' Non, on est en dehors de cette plage
        Set oOldRange = Nothing
    End If

Sujet intéressant.
Il est rare que je colle du code tout cuit, mais bon, c'est pas tous les jours jeudi.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 133 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour,
Formate donc les cellules concernée ===>> format personnalisé ===>> hh "h" mm
Tu devras par contre saisir "normalement", par exemple 12:50 qui se transformera automatiquement en 12 h 50
J'observe qu'il a encore une fois fallu qu'un administrateur déplace ta discussion !
Regarde où elle a été déplacée et prends-en bonne note car, à continuer ainsi, tu nous décourageras de te répondre

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
0
Merci
PS : Dans la ligne
PartieDecimale = CLng((oOldRange.Value2 - Int(oOldRange.Value2)) * 100)
si le nombre d'heures entières peut dépasser 32767, remplace INT par FIX
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
0
Merci
Mais y-a pas de quoi
Commenter la réponse de cs_Jack
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour, jack,
Ne sois pas trop étonné. Cela traduit probablement un comportement faisant partie d'un "lot de comportements habituels". A commencer par l'habitude de ne pas se "fouler" pour rechercher la section adéquate, et ce en dépit du fait qu'on le lui signale plusieurs fois !
Mais sois par ailleurs rassuré : j'ai lu (et d'autres probablement également) avec intérêt ton code et ton approche. . Tu n'es donc pas dans le désert.
Amitiés.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Merci beaucoup
Pour ucfoutu, il doit m avoir dans le nez depuis le debut mais c pas grave
Cdt
Commenter la réponse de FMAILYS
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
il doit m avoir dans le nez depuis le debut mais c pas grave

Je modifierai avec plaisir ma réaction lorsque tu auras de ton côté commencé à faire les efforts (!) qui te sont demandés et redemandés en vain.
Relis donc mes messages dans ton autre discussion récente : ceci explique probablement cela.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Je suis d'accord mais je suis un novice dans la programmation
mon job c plus les ressources humaines
On me demande d'optimiser des choses et on m'a conseillé d'aller sur ce site
pour mon autre discussion, j'ai des idées pour pouvoir faire avancer le projet mais ne sais pas comment les mettre en application.

Merci beaucoup

Cdt
Commenter la réponse de FMAILYS
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Le fait de prendre le temps et le soin, par exemple, de choisir la bonne section pour ouvrir une discussion n'a absolument rien à voir avec tes connaissance en programmation.
Regarde en haut de cette page ! Tu y vois quoi ? === >>
Accueil > Forum > Visual Basic 6 > Langages dérivés > VBA > [Catégorie ENCORE modifiée .Net -> VBA] Passer au format heures par vba
En rouge, là où il a fallu la déplacer (où elle aurait dû être ouverte)
En bleu la remarque de l'administrateur qui a dû effectuer ce déplacement.
Dur dur, de prendre notre de tout cela et d'ouvrir dorénaavant les discussion VBA dans la section adéquate : Accueil > Forum > Visual Basic 6 > Langages dérivés > VBA ? . Quel rapport avec le fait que tu sois ou non "novice en programmation" ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Je te remercie
tu me l'as une fois et j'en ai pris note
Maintenant, si je ne pe trouver d'aide sur ce site, j'irais sur les autres qui sont un peu plus conciliant et compréhensible

Cdt
Commenter la réponse de FMAILYS
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
C'est comme tu veux, ma foi.
Bonne chance.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
peut on repartir sur de bonnes bases et pourrais tu accepter de m'aider à réaliser mon projet
Cdt
Commenter la réponse de FMAILYS
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
peut on repartir sur de bonnes bases et pourrais tu accepter de m'aider à réaliser mon projet
Oui (bien évidemment) si tu :
1) respectes le règlement ===>> Tapez le texte de l'url ici. et t'y conformes
2) poses dorénavant tes questions :
-- dans la section adéquate
-- en isolant la difficulté technique spécifique et isolée que tu rencontres, en montrant le code tenté
-- après avoir utilisé le moteur de recherche de ce forum pour tenter d'y trouver une solution déjà existante parmi les discussions ouvertes et les code déposés
Ce sera alors avec plaisir.
En ce qui concerne maintenant la présente discussion : jack t'a donné un code. L'as-tu essayé ? ======>>
------- si oui : te convient-il ? si oui ===> clique sur le tag "réponse acceptée" au niveau du message/solution. Si non ===>>> pourquoi, avec précision ?
------- si non : esssaye-le et reviens


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Je te remercie et suis ok pour repartir sur de bonnes bases
Le code de Jack fonctionne et je l'en remercie
J'essaie de travailler sur le code de l'autre discussion sur la copie de données de plusieurs feuilles vers un classeur
J'y mettrais le code de départ et expliquerais ce que je comprends dans ce code et tu me diras si tu es ok.

Comment puis je mettre cette discussion résolue

Cdt
Commenter la réponse de FMAILYS
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Comment puis je mettre cette discussion résolue

En ce qui concerne maintenant la présente discussion : jack t'a donné un code. L'as-tu essayé ? ======>>
------- si oui : te convient-il ? si oui === > clique sur le tag "réponse acceptée" au niveau du message/solution

Clique donc sur le tag "réponse acceptée" au niveau du message dans lequel jack a mis son code.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
0
Merci
Faut pas s'affoler, ucfoutu.
Toi comme moi, grâce à nos ages avancés, sommes aussi passés par cette phase de passion et d'inconnu qui nous aura valu le premier prix d'impatience et, parfois, d'incompréhension.
Soyons fair-play et laissons le temps aux choses pour ce faire.
Les bouddhistes disent "Cool ..."
Commenter la réponse de cs_Jack
0
Merci
Merci Jack
Et bonjour

Je vous remercie de votre sincèrité et j'apprécie mais sans prendre la défense de ucfoutu, il a raison ça m'a permis de commencer à coder

Si vous voulez, j'ai poser une question à l'instant sur ma discussion sur le regroupement de données de plusieurs feuilles

Cdt
Commenter la réponse de FMAILYS