Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/08/2011, 17h50   #1
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
Par défaut affichage d'une horloge dynamique sous exel

bonjour


j'ai besoin de votre aide
je suis en train de développer une application , je suis débutant en vba j'ai pas réussi a crée un macro pour l'affichage dynamique de l'heure , minute et seconde lors de l'ouverture de chaque feuille de mon classeur j'ai aussi un autre problème j'ai un tableau de 8 ligne je veux masquer les lignes selon le temps
exemple:
pour la première ligne il doit être masqué si le temps actuel dépasse
7.20 et un de ces cellules est encore vide
le 2 ligne doit être masqué sil le temps actuel dépasse 08.20 et l'un de ces cellules est encore vide
.
.
.
la dernière ligne doit être masque si le temps actuel dépasse 14.20 et l'un de ces cellules est encore vide
merci d'avance pour votre aide
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/08/2011, 18h40   #2
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Précisez le contexte d'affichage de l'heure dynamique en Excel VBA

Bonjour,
Citation:
Envoyé par frihat mohamed Voir le message
créer une macro pour l'affichage dynamique de l'heure , minute et seconde lors de l'ouverture de chaque feuille de mon classeur
Où voulez-vous afficher dynamiquement l'heure ?

Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
10:19:33
L'heure s'est affichée dynamiquement dans la fenêtre d'Exécution immédiate.

En quoi l'heure qui s'affiche sur la barre des tâches de Windows n'est pas suffisante ?
Comme il s'agit d'une heure dynamique, indiquez la fréquence de rafraichissement de l'affichage telle que toutes les secondes.

Citation:
Envoyé par frihat mohamed Voir le message
lors de l'ouverture de chaque feuille de mon classeur
Pourquoi déclencher l'affichage de l'heure dynamique sur ouverture d'une feuille ?

Indiquez comment vous voulez détecter l'ouverture de chaque feuille. Avec Workbook_SheetActivate ?
Code :
1
2
3
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 
End Sub
Citation:
Envoyé par frihat mohamed Voir le message
j'ai un tableau de 8 ligne je veux masquer les lignes selon le temps
Définir en constante le nom de la feuille ou son indice où se trouve le tableau. Si ce tableau est dans chaque feuille, le préciser.

Donnez la déclaration des constantes sur la définition de la première ligne à traiter et commenter chaque déclaration selon le modèle ci-joint.
Exemple :
Code :
1
2
3
Option Explicit ' Gestion dynamique de l'heure
Public Const rowFirst = 1 ' Première ligne à masquer
Public Const rowLast = rowFirst + 7 ' Dernière ligne à masquer
Si ces constantes diffèrent par feuille, créer autant de constantes qu'il y a de feuilles.
Indiquez les constantes d'heure : 7.20, 8.20, etc. en précisant les unités 7 h 20 ou 00:07:00 s ?
Ou indiquez la constante de la 1ere heure puis la constante de délai et éventuellement la constante de la dernière heure.

Citation:
Envoyé par frihat mohamed Voir le message
la dernière ligne doit être masque
Donnez comment vous avez personnalisé le code de l'enregistreur de macro pour masquer une ligne.
___________

En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/08/2011, 19h34   #3
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
bonjour merci pour votre réponse
je veux ajouter le temps dans une cellule de chaque feuille de classeur par exemple dans la cellule D8 sous la format 6h.20 ou 6 :20.12
pour masquer les lignes
je dois faire pour chaque ligne une comparaison entre le temps actuel contenue de la cellule D8 et le temps cible
le temps cibles pour chaque ligne est
ligne 1 : 07.20
ligne 2 : 08.20

ligne 1 : 09.20

ligne 1 : 10.20
ligne 1 : 11 .20
ligne 1 : 12.20
ligne 1 : 13.20
ligne 1 : 14.20

la condition pour masquer une ligne est la suivante
si l'un de cellules de cette ligne est vide et le temps actuel > temps cible de ce ligne alors ce ligne doit être masqué

je suis débutant en vba
j'ai pas compris votre code "?time " ou je dois mettre ce code ??? dans un module??
MERCI
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/08/2011, 20h25   #4
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Datation de l'ouverture d'une feuille

1. La fenêtre d'Exécution immédiate du VBE

Citation:
Envoyé par frihat mohamed Voir le message
j'ai pas compris votre code "?time " ou je dois mettre ce code ??? dans un module??
1. Ouvrir le Visual Basic Editeur (Alt+F11) que l'on nommera par l'abréviationVBE.

2. Pour ouvrir la fenêtre d'Exécution immédiate du VBE,
tapez le raccoursi clavier Ctrl+G ou
cliquez sur le VBE menu "Affichage" > "Fenêtre d'Exécution"

Copier-coller et valider par ENTER :
10:19:33
L'heure actuelle s'affiche dans votre fuseau horaire. On met en bleu foncé le résultat affiché dans la fenêtre d'Exécution.

Le "?" est l'abréviation de Debug.Print :
07:20:00
C'est la constante de début de masquage de la 1ere ligne de votre tableau.
Debug.Print ou "?" est un moyen pratique de tester des fonctions VBA.

2. Datation de l'ouverture de la feuille en D8

Le problème s'est considérablement simplifié depuis que vous avez parlé de temps actuel par rapport à un temps d'ouverture de la feuille en D8. On n'a pas besoin de maintenir une vraie horloge dynamique en D8 mais uniquement de sauver l'heure d'ouverture.

Je reformule l'énoncé. Modifier si nécessaire.
A 7 h 20 du matin, la ligne 1 de la feuille ouverte (ou de toutes les feuilles ? Si c'est le cas, le préciser) doit être masquée si une de ses cellules est vide. Cela signifie qu'il faut déclarer les constantes de n° de la colonne de début et la colonne de fin pour la ligne à masquer parce qu'on ne va pas parcourir potentiellement toutes les colonnes que Excel peut fournir.

Citation:
Envoyé par frihat mohamed Voir le message
je dois faire pour chaque ligne une comparaison entre le temps actuel contenue de la cellule D8 et le temps cible
Le problème c'est de voir quand il faut faire cette comparaison.
Car vous parlez de temps actuel. Hors le temps actuel ne s'arrête jamais. Parler plutôt d'heure d'ouverture en D8 qui est une heure fixe.

Donnez un exemple de chronologie concrète.
Ouverture de la feuille disons à 7 h 00.
Au bout de 20 minutes, la ligne 1 est masquée si condition remplie.
Une heure plus tard, la seconde ligne est masquée si le classeur est toujours ouvert. Etc.

Dans votre scénario, indiquez le cas où on ferme le classeur avant 14 h 20.
On le réouvre avant 14 h 20 et on le ferme à 15 h.

Le but de cette chronologie est de savoir quand le traitement pour masquage doit être lancé.
Est ce un traitement périodique lancé automatiquement à partir de l'ouverture du classeur ou est-ce un traitement à la demande de l'utilisateur qui souhaite masquer les lignes par rapport à l'heure d'ouverture ?

3. Démarrez le module ModClock

Cliquez sur l'Excel menu "Outils" > "Options" > onglet "General" option [x] R1C1 reference style
Cela facilitera les conversions de n° de colonne sinon vous devriez calculer la position des n° de colonne dans l'alphabet.

Vous pouvez commencer le projet maintenant en déclarant les constantes.
Cliquez sur le VBE menu "Insérer" > "Module"
Dans les propriétés de Module 1, renommer le en ModClock.

Vous avez parlé de la cellule d'heure d'ouverture.
Décrivez là par la constante de sa rangée 8 et le nom de sa colonne D en coordonnées R1C1.

Dans le module ModClock, copier-coller et compléter le code suivant :
Code :
1
2
3
4
5
6
7
Option Explicit ' Gestion dynamique de l'heure
Public Const rowTabFirst = 1 ' Première ligne du tableau à masquer
Public Const rowTabLast = rowTabFirst + 7 ' Dernière ligne à masquer
 
Public Const rowHourOpen = rowTabLast + 1 ' Rangée de la datation d'ouverture de la feuille
Public Const colHourOpen = 4 ' Colonne "D" de la datation d'ouverture de la feuille
Public Const hourMaskStart = #07:20:00# ' Heure de masquage de la 1ere ligne
Créez, dans le module ModClock, la constante de délai entre deux masquage des autres lignes.

Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
Code :
? hourMaskStart + TimeSerial(1, 0, 0)
08:20:00

C'est la seconde heure pour le masquage de rowMaskFirst + 1. Il faut parler en utilisant les constantes que vous définissez parce que ce sera ce que fera votre macro.

Après avoir défini la constante de délai entre deux masquages,
remplacez le premier paramètre de TimeSerial(), à savoir la constante numérique 1 par le nom de votre constante de délai que vous venez de définir. Le résultat dans la fenêtre d'Exécution immédiate sera bien sûr identique à savoir : 08:20:00

Poster la nouvelle version de ModClock en ajoutant les constantes utiles au projet et la procédure -- au moins son nom si elle est vide -- qui fera la comparaison pour masquage des lignes.
Le but est que vous définissez et commentez vos constantes, votre nom significatif de macro.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/08/2011, 21h20   #5
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
j'ai pas réussi à ouvrir la fenêtre d'excution
j'ai indiqué par le temps actuel notre temps donc la ligne 1 doit être masqué si le temps actuel dépasse 07.20 et l'un des cellules est vide . la compraison est alors entre le temps actuel et 07.20.
j'ai pas compris votre code assez bien
merci
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/08/2011, 21h32   #6
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel

Citation:
Envoyé par frihat mohamed Voir le message
j'ai pas réussi à ouvrir la fenêtre d'excution
Il faut m'indiquer où quelque chose ne marche pas.
Dans quelle langue est votre Excel ? Quelle est sa version ?

Citation:
Envoyé par MattChess Voir le message
Ouvrir le Visual Basic Editeur (Alt+F11) que l'on nommera par l'abréviation VBE.
Est-ce que l'éditeur VBE du Visual Basic for Application d'Excel s'est ouvert en avant plan de la feuille Excel ?

Citation:
Envoyé par MattChess Voir le message
Pour ouvrir la fenêtre d'Exécution immédiate du VBE,
tapez le raccoursi clavier Ctrl+G ou
cliquez sur le VBE menu "Affichage" > "Fenêtre d'Exécution"
Est-ce que vous avez ce menu ? Sinon listez moi tous les items de menu "Affichage" ainsi que leurs raccourcis claviers.

La fenêtre d'Exécution immédiate (Ctrl+G) s'ouvre généralement sous la fenêtre d'Edition.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/08/2011, 21h37   #7
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
j'ai excel 2003 en anglais oui vbe s'est ouvert en avant plan

j'ai trouvé l'onglet de la fenetre d'exuction dans le menu affichge mais en clikantsur cette onglet rien ne se passe

la comparaison du temps doit être faite entre le tems actuel et le teps cible de chaque ligne on doit pas utilisé le temps d'ouverture de classeur car l'utilisateur peut ouvrir le classeur une seule fois pour remplir tous les lignes come il peut ouvrir le classeur 3 fois 5 fois ....
donc la comparaison doit être fait indépendamment du temps d'ouverture de classeur
merci
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/08/2011, 21h44   #8
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Excel VBE Immediate Window (Ctrl+G)

Citation:
Envoyé par frihat mohamed Voir le message
j'ai trouvé l'onglet de la fenetre d'exéction dans le menu affichage
En anglais, le nom de la fenêtre d'Exécution est dans le menu "View" > "Immediate Window" (Ctrl+G)

Citation:
Envoyé par frihat mohamed Voir le message
en cliquant sur cet onglet rien ne se passe
Si rien ne se passe, c'est que cette fenêtre est peut-être déjà ouverte.
Recherchez parmi les fenêtres ouvertes :
Project VBAProject, Edition, Properties, Immediate, Locals, Watches...

Vous parlez d'onglet (Tab) dans Excel 2003, recherchez éventuellement le Developer Tab.

Citation:
Envoyé par frihat mohamed Voir le message
la comparaison du temps doit être faite entre le temps actuel et le temps cible de chaque ligne
Le temps actuel c'est le moment où on lance la macro. Qui, quand et comment cette macro est lancée ? Indiquez sur quel évènement, la macro doit s'exécuter, si c'est périodique automatiquement ou sur demande de l'utilisateur ?
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/08/2011, 22h00   #9
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
j'ai vérifie les fenêtres ouvertes mais j'ai pas trouvé la fenêtre d'exection
l'événement de déclenchement du macro est l'activation de la feuille de classeur
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/08/2011, 22h50   #10
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Comment rendre visible la fenêtre d'Excécution d'Excel VBA

VBE menu "Tools" > "Options" > Dernier onglet "Docking"
Cochez l'option [x] Immediate Window

Quand on désélectionne cette option [ ] Immediate Window,
cette fenêtre remplace la fenêtre de code [Code pane].
Voyez-vous la fenêtre d'Exécution immédiate en renplacement de la fenêtre de Code ?
Si on clique sur un Module, la fenêtre d'Exécution immédiate disparait, cachée par la fenêtre de code.

Si on coche "Docking" > [x] Immediate Window et que la fenêtre n'est toujours pas visible, utilisez la méthode suivante sans changer le focus une fois le raccoursi saisi :

Tapez le raccourci clavier Ctrl+G
Même si vous ne voyez pas la fenêtre d'Exécution immédiate, tapez à l'aveugle et validez par ENTER :
Code :
MsgBox "From Immediate Window"
Voyez-vous la boite de message "From Immediate Window" ?
Dans ce cas, la fenêtre d'Exécution immédiate est en dehors de l'écran (dans l'hyperspace)

La méthode pour tenter de la faire apparaître est de minimiser Excel puis de le remettre en fenêtre normale. Parfois cela permet à la fenêtre d'Exécution immédiate de réapparaitre. Une autre méthode consiste à tenter de changer la résolution de l'écran.

Pouvez-vous voir les autres fenêtres de Debug telles que celle pour les variables locales ?
Cliquez sur le VBE menu "View" > "Locals Window" ou "View" > "Watch Window"

Comparez avec la capture d'écran dans : Using the Immediate Window

Lire également Immediate Window Can't Be Viewed by Dave. 02-24-2010 09:31 PM sans aller jusqu'à patcher la Registry.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/08/2011, 23h06   #11
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
merci pour votre reponse
j'ai pas trouvé docking j'ai pas compris mémé l'utilité de fentere d'execution
on ne peut pas afficher le temps par un macro??
merci pour votre aide

j'ai trouvé le code suivant:


# Dans la partie workbook du classeur, insérer le code suivant


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 'On initialise le timer système dès l'ouverture du classeur
Private Sub Workbook_Open()
# 'Utilisation de l'API SetTimer toutes les secondes (1000 millisecondes) pour appeler la procédure UpDateTime
SetTimer Application.hWnd, 0, 1000, AddressOf UpDateTime
End Sub
#
# 'A la fermeture du classeur, on nettoie la place en supprimant l'appel au timer système
Private Sub Workbook_BeforeClose(Cancel As Boolean)
# 'On utilise le handle de l'application et l'ID de l'objet liés lors de l'initialisation du timer
KillTimer Application.hWnd, 0
End Sub
#
#
# 'Dans un module séparé, insérer le code suivant
# '==============================================
#
# 'On définit les 2 APIs systèmes qui seront utilisées
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
#
# 'La fameuse fonction UpDateTime qui va se charger d'écrire dans la cellule voulue l'heure actuelle à chaque seconde
Public Sub UpDateTime (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
# 'Afin que la feuille ne se ferme pas de manière inoportune suite à une erreur interne
# '(lors de l'édition d'une cellule ou l'accès à certaines boîtes de dialogue par exemple)
On Error Resume Next
# 'On écrit l'heure selon le format HH:MM:SS sur 24 heures.
# Worksheets(1).Cells(1.1).Value = Format(Time,"HH:MM:SS")
On Error Goto 0
End Sub
le code que j'ai envoyé marche tres bien maintenant je veux un macro pour masqué les lignes selon les conditions indiqués

j'ai trouvé un code pour afficher l'heure en format hh:mm:s
mon tableau contient 6 colonnes
a l'activation de la feuille qui contient le tableau la comparaison entre le temps affiché dans la cellule A1 et le temps cible de chaque ligne doit être faite
je pense à associé a chaque ligne une constante exemple pour la ligne 1:
a=A1-07:20:00
et un autre variable vide boolean pour vérifier la 2 condition " l'un des cellules est vide"


Code :
1
2
3
4
5
6
7
8
9
10
11
vide=false
i=1
while i<=8et  vide = false
if cells(1,i)=" "  then 
 vide = true
end if
i=i+1
wend
le code pour masqué une ligne selon ces conditions est alors
if a>0  and  vide = true then rows(1).hide
end if
merci de me corriger ce code
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/08/2011, 10h21   #12
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Revue du fragment de code : une cellule est-elle vide ?

Bravo d'avoir commencé.

Citation:
Envoyé par frihat mohamed Voir le message
maintenant je veux un macro pour masqué les lignes
A moins d'être un hiérarchique en colère par rapport à un subordonné, on n'utilise pas "je veux un macro" [I want a macro].
En français diplomatique surtout dans un forum, on préfère "je souhaiterai une macro" ou "j'aimerai une macro pour masquer les lignes". [I would like]
Editez votre message pour changer l'expression.

Dans le message précédent, le modérateur a regroupé tous vos messages consécutifs. Cela signifie qu'il faut prendre le temps nécessaire pour bien lire chaque question et y répondre avant de poster des messages consécutifs.

Le modérateur a inséré pour vous avant la première ligne la balise [code] et après la dernière ligne de code la balise [/code]
Dans l'éditeur du forum, vous trouverez dans la barre d'outil le bouton "#" qui ajoute automatiquement ces deux balises si vous sélectionnez toutes les lignes de votre code dans votre message. Cela permettra de conserver l'indentation du code à l'intérieur du bloc While ... Wend

1. Option Explicit pour commencer un module

Commencer toujours votre module par :
Code :
Option Explicit ' Commentaire qui explique ce que fait le module
Voir mon message #4, chapitre 3. Cela force à déclarer les variables.

2. Déclaration et utilisation de Boolean

Créer un nom de procédure et y mettre le traitement pour tester si une cellule est vide plutôt que d'écrire un fragment de code qui commence par vide=false. Le fait que false soit en minuscule et collé au "=" montre que ce code n'a pas été saisi dans un module du VBE. Toujours présenter un code validé par le VBE.

Suivre les instructions du message #4, chapitre 3 et compléter le module ModClock puisque c'est ainsi que Module1 a été renommé.

Déclarer les types avec l'instruction Dim plutôt de dire que vide est un Boolean.
Par contre on peut trouver un nom plus complet tel que isCellEmpty, le préfixe "is" permettant de se rappeler que c'est un Boolean. Et on peut même commenter la déclaration.
  • On ne teste pas vide = false mais on utilise : Not vide
  • De même, on ne teste pas vide = true mais directement : vide


C'est la propriété des Boolean. On n'a pas besoin de les comparer avec False ou True.

3. Variable d'indice de rangée indRow et de colonne indCol

On n'utilise jamais de variable sur une seule lettre telle que i car c'est impossible de les substituer pour améliorer la lisibilité.
Utilisez indCol pour montrer qu'il s'agit d'une indice de colonne. Déclarer cette variable avec le type As Integer

Comme il faudra masquer d'autre ligne que la première, prévoir également d'utiliser indRow pour l'indice de rangée. C'est là qu'interviennent les constantes déclarées dans le message #4.

Remplacer i = 1 par :
si le tableau commence en colonne définie par la constante :
Code :
1
2
Public Const colTabFirst = 1 ' Première colonne du tableau où on masque les lignes
Public Const colTabEnd = 6 ' Dernière colonne du tableau
Ces deux constantes doivent être déclarées en début du module ModClock après les autres constantes déjà définies.
Les voilà les deux constantes que je vous demandais avec un commentaire.
Il reste une constante à déclarer et commenter. Son nom et sa valeur sont en violet dans le message #4.

La règle est basique. Pas ou peu de constante numérique ou chaîne littérale dans une procédure.
Déclarer la constante correspondante avec un nom parlant pour vous et utiliser la dans vos procédures.

Si le tableau contient 6 colonnes, on voit déjà un bug parce qu'on n'a pas déclaré la constante colTabEnd = 6 et le code utilise une autre constante numérique inconnue i <= 8

4. Comparaison horaire

Dans l'expression a = A1 - 07:20:00
choisir un nom de variable sur plus d'une lettre représentative de l'opération. S'il s'agit d'une durée, remplacer par durationMask ou n'importe quel nom commençant par time ou date ou ce que vous voulez relatif à ce qu'il y a faire mais par "a" qui n'a aucune signification. Il faut surtout déclarer son type. Vous verrez à la fin de ce message que l'on peut se passer de cette variable.

Dans le message #3, vous avez parlé de D8. Qu'est-ce que vient faire A1 maintenant ? Encore un problème d'absence de constantes.
Relisez mon message #4 chapitre 3, la cellule où on range le temps est identifiée par deux constantes rowHourOpen et colHourOpen.
On va accéder à sa valeur par : Cells(rowHourOpen, colHourOpen).Value

De même on a défini la constante hourMaskStart, ce n'est pas pour voir l'erreur de syntaxe A1 - 07:20:00. Utiliser la constante hourMaskStart puisqu'elle a été créée pour cela.
Notez l'utilisation des "#" autour de l'heure du premier masquage lors de la déclaration de la constante dans le module ModClock du message #4 chapitre 3. C'est le format VBA pour les constantes horaires.

Plutôt que de passer par la variable intermédiaire a en plus sur une seule lettre : If a > 0
remplacer par :

Code :
If Cells(rowHourOpen, colHourOpen).Value > hourMaskStart And isCellEmpty Then
Prendre le temps de relire le message #10 et répondre aux questions.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 13h11   #13
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour
J'ai l'impression qu'une usine à gaz des ressources est entrain d'être montée. N'oublions pas la fonction principale d'Excel. Mais bon.

Peut être il faudrait augmenter le temps de rafraichissement pour ne pas surdimensionner le besoin (10 secondes à la place d'une seconde par exemple)

Ci-après une proposition pour cacher les lignes répondant aux 2 critères.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub UpDateTime(ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Dim c As Range
 
On Error Resume Next
Application.ScreenUpdating = False
With Worksheets(1)
    .Cells(1, 1).Value = Format(Time, "HH:MM:SS")
    For Each c In .Range("A5:A200").SpecialCells(xlCellTypeVisible)
        DoEvents
        c.EntireRow.Hidden = DateDiff("s", Time, c.Value) <= 0 And Application.CountA(c.Offset(0, 1).Resize(1, 8)) = 0
'Pas la peine de continuer la boucle
        If DateDiff("s", Time, c.Value) > 0 Then Exit For
    Next c
End With
Application.ScreenUpdating = True
On Error GoTo 0
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/08/2011, 13h56   #14
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Vers une simplification de l'application de masquage de ligne

Citation:
Envoyé par mercatog Voir le message
J'ai l'impression qu'une usine à gaz des ressources est entrain d'être montée.
Je n'ai toujours pas vu l'intérêt de maintenir une horloge dynamique temps réel dans la cellule D8 alors qu'elle s'affiche dans le coin droit de la barre des tâches de Windows sans qu'Excel y soit pour quelque chose. Si on a besoin dans Excel du temps actuel, on peut l'obtenir par Time. Inutile donc de l'afficher périodiquement dans une cellule pour le relire sur activation d'une feuille. On risque tout au plus d'avoir un temps "actuel" selon la précision de la période de rafraîchissement.

Citation:
Envoyé par mercatog Voir le message
Peut être il faudrait augmenter le temps de rafraichissement pour ne pas surdimensionner le besoin (10 secondes à la place d'une seconde par exemple)

Le but était de conclure que l'on n'a pas besoin d'une horloge dynamique temps réel pour régler un problème basique de masquage de ligne selon une contrainte horaire à heure fixe et de cellule vide.

Je n'ai même pas voulu entrer dans une solution à base du méga complexe AddressOf, de handle d'application, de timer temps réel à la milliseconde près, de DoEvents() alors qu'on en est, après 14 messages, à déclarer les constantes du projet comme le délai entre deux masquages de lignes à partir d'une heure fixe et à afficher la fenêtre d'Exécution immédiate dans le VBE.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 17h37   #15
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
Par défaut RE : GESTION DE TEMPS

bonjour
MERCI Mattchess et Marcatog pour vos remarques si pertinentes .
pour que les choses soient plus claires je dois vous mettre dans le cadre du problème:
A fin d'obliger les techniciens de chaque équipe (chaque équipe travaille8 heures)
à enregistrer les données demandées après chaque heure , j'ai proposé l'idée de masquer chaque ligne à la fin de chaque heure avec une marge de 20 min si le technicien n'a pas terminé cette ligne.
en effet j'ai remarqué que les techniciens ont l'habitude à remplir tous dans la dernier minute
"
Je n'ai toujours pas vu l'intérêt de maintenir une horloge dynamique temps réel dans la cellule D8 alors qu'elle s'affiche dans le coin droit de la barre des tâches de Windows sans qu'Excel y soit pour quelque chose. "
oui vous avez raison , j'aimerai mettre l'horloge dynamique dans chaque feuille active du classeur juste pour la forme de plus il est plus facile pour le technicien de voir le temps dans la feuille que dans la barre de taches de Windows

pour la fréquence de rafraichissement 1 seconde ou 10seconde c'est la même


pour le code suivant:
Code :
 ? hourMaskStart + TimeSerial(1, 0, 0)
est- ce que je peux enlever "?"
@ mercatog merci pour votre code
j'ai des questions à propos ce code
quelle est l'utilité de la procédure updatetime ??
LE CODE SUIVANT :
Code :
.Cells(1, 1).Value = Format(Time, "HH:MM:SS")
sert à afficher le temps réel dans la cellule A1??
mais vous n'avez pas précisé la fréquence de rafraichissement
j'ai pas compris
Code :
.SpecialCells(xlCellTypeVisible)
et
et dans le code
Code :
DateDiff("s", Time, c.Value)
time est ce q 'elle représente le temps réel et "s" que représente -t-elle ?
j'ai pas compris
Code :
Application.CountA(c.Offset(0, 1).Resize(1, 8)) = 0
et @MattChess voici le code que j'ai fait
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit ' Gestion dynamique de l'heure
Public Const rowTabFirst = 1 ' Première ligne du tableau à masquer
Public Const rowTabLast = rowMaskFirst + 7 ' Dernière ligne à masquer
 
 Public Const colTabFirst = 1 ' Première colone du tableau à masquer
Public Const colTabLast = colMaskFirst + 5  ' Dernière colone à masquer
Public Const rowHourOpen = rowMaskLast + 1 ' Rangée de la datation d'ouverture de la feuille
Public Const colHourOpen = 4 ' Colonne "D" de la datation d'ouverture de la feuille
Public Const hourMaskStart = #6:20:00 AM# ' constante de masquage
 
 Dim isCellEmpty As Boolean
 Dim indCol As Integer
 Dim indRow  As Integer
 With activeWorksheets
 
 For indRow = rowTabFirst To rowTabLast
 
 indCol = colTabFirst
 isCellEmpty = False
 While indCol <= colTabLast And Not isCellEmpty
 If .Cells(indRow, indCol) = "" Then isCellEmpty = True
 End If
 indCol = indCol + 1
 Wend
 
If .Cells(rowHourOpen, colHourOpen).Value > hourMaskStart + TimeSerial(indRow, 0, 0) And isCellEmpty Then
   .Rows(indRow).Hidden = True
   End If
   Next
 
   End Sub
merci pour votre aide je suis très content de vos réponses
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/08/2011, 19h12   #16
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Citation:
quelle est l'utilité de la procédure updatetime ??
J'ai repris le code que tu as trouvé sur le net et je l'ai adapté à ton cas.

Regarde dans ton code les commentaires explicatifs. En plus, l'aide est gratuit (F1 sur l'instruction non claire).

Le code commenté (légèrement)

Dans un module standard
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Const tRaff As Long = 10000 '10000 ms 'Constatnte Temps de rafraichissement en ms
 
'Debut du timer avec un temps derafraichissement de tRaff (ms)
Sub Debut()
 
SetTimer Application.hWnd, 0, tRaff, AddressOf CacherLignes
End Sub
 
'Fin du timer
Sub Fin()
 
KillTimer Application.hWnd, 0
End Sub
 
Sub CacherLignes(ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Dim c As Range
 
On Error Resume Next
Application.ScreenUpdating = False
With Worksheets(1)
    'On écrit en A1 le temps réel mis à jours chaque tRaff (ms), ici chaque 10s
    .Cells(1, 1).Value = Format(Time, "HH:MM:SS")
    'On parcourt les cellules visibles de A5 à A200
    For Each c In .Range("A5:A200").SpecialCells(xlCellTypeVisible)
        'Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.
        DoEvents
        'On compare la différence en secondes entre maintenant et le temps en chaque cellule de la colonne A
        'et si les 8 cellules B à I sont vides, alors on cache la ligne
        c.EntireRow.Hidden = DateDiff("s", Time, c.Value) <= 0 And Application.CountA(c.Offset(0, 1).Resize(1, 8)) = 0
        'Pas la peine de continuer la boucle si le temps en A > maintenant
        If DateDiff("s", Time, c.Value) > 0 Then Exit For
    Next c
End With
Application.ScreenUpdating = True
On Error GoTo 0
End Sub
Dans le module ThisWorkbook
Code :
1
2
3
4
5
6
7
8
9
Option Explicit
 
Private Sub Workbook_Open()
Debut
End Sub
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Fin
End Sub
Ceci étant, personnellement je n'adopterai pas (d'une manière catégorique) cette approche. Mais ça reste un avis personnel.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 19h21   #17
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Masquage de lignes à horaires fixes en Excel VBA

Et le fin mot "End" de l'histoire est apparu dans votre dernière ligne 31 car on peut y lire "End Sub".
Comme il était vraisemblablement plus de 7 h 20 du matin, le début de la procédure commençant par "Sub " suivi du nom de votre procédure a été étrangement masquée...

La solution devient concrète à partir du moment où on change le commentaire après Option Explicit pour un commentaire résolument réaliste sur ce que le module ModMask doit faire contrairement au titre initial de la discussion :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Option Explicit ' Masquage de lignes à horaires fixes
Public Const rowTabFirst = 1              ' Première ligne du tableau à masquer
Public Const rowTabLast = rowTabFirst + 7 ' Dernière ligne à masquer
 
Public Const colTabFirst = 1              ' Première colonne du tableau à masquer
Public Const colTabLast = colTabFirst + 5 ' Dernière colone à masquer
 
Public Const hourMaskStart = #7:20:00 AM# ' Heure du 1er masquage
Public Const delayMask = 1                ' Délai entre deux masquages en heure
 
' Gadget de l'heure courante Time copiée périodiquement en D8
Public Const rowHourOpen = rowTabLast + 1 ' Rangée de l'heure ... courante
Public Const colHourOpen = 4              ' Colonne "D" de l'heure ... courante
 
' Masquer la ligne rowTabFirst à 7h20, rowTabFirst+1 à 8h20, ... rowTabLast à 14h20
Sub MasquerLignes()
Dim indCol As Integer, indRow  As Integer, timeMask As Double
 
    timeMask = hourMaskStart ' Première heure de masquage
    For indRow = rowTabFirst To rowTabLast
        For indCol = colTabFirst To colTabLast
            If Cells(indRow, indCol) = "" Then ' Cellule non encore remplie
                If Time > timeMask Then
                    Rows(indRow).Hidden = True
                    Debug.Print "Ligne " & indRow & " masquée à partir de : " & _
                        Format(timeMask, "HH:MM:SS")
                End If
 
                ' Même version avec la lecture de l'heure courante dans ... D8
'                If Cells(rowHourOpen, colHourOpen).Value > timeMask Then
'                    Rows(indRow).Hidden = True
'                End If
                Exit For ' Sortir de la ligne car une cellule a été trouvée vide
            End If
        Next
        timeMask = timeMask + TimeSerial(delayMask, 0, 0) ' Prochaine heure de masquage
    Next
End Sub
 
Sub AfficherLignes()
    Range(Rows(rowTabFirst), Rows(rowTabLast)).Hidden = False
End Sub
Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
Ligne 1 masquée à partir de : 07:20:00
Ligne 2 masquée à partir de : 08:20:00
Ligne 3 masquée à partir de : 09:20:00
Ligne 4 masquée à partir de : 10:20:00
Ligne 5 masquée à partir de : 11:20:00
Ligne 6 masquée à partir de : 12:20:00
Ligne 7 masquée à partir de : 13:20:00
Ligne 8 masquée à partir de : 14:20:00


Selon l'heure courante de lancement, vous pourrez lire dans la fenêtre d'Exécution immédiate les huit messages précédents écrits en bleu foncé.

Dans la fenêtre d'Exécution immédiate :
Les huit lignes masquées précédemment sont à nouveau visibles.

Si la fenêtre d'Exécution immédiate n'est pas accessible ou visible (voir message #10),
vous pourriez lancer la macro MasquerLignes() classiquement par l'Excel menu "Tools" > "Macros"
Sélectionner AfficherLignes ou MasquerLignes. Cliquez sur "Run".

Si vous souhaitez afficher le gadget de l'heure en D8 -- ce qui ne se sert strictement à rien dans cette application -- (les techniciens peuvent avoir leurs propres montres ou lirent l'heure dans la barre de tâches de Windows), vous allez prendre de la ressource processeur pour animer cette horloge et il est bien possible que les techniciens ne puissent plus saisir ce qu'ils doivent saisir avant la contrainte horaire fatidique. Comme cela on sera sûr que toutes les lignes seront masquées.

Citation:
Envoyé par frihat mohamed Voir le message
est- ce que je peux enlever "?"
Oui, il n'y a plus de question. Vous pouvez mettre en commentaire ou ... masquer Debug.Print qui affiche un message dans la fenêtre d'Exécution immédiate qui semble masquer dans votre Excel quelque soit l'heure.
___________

Si la discussion est résolue, vous pouvez cliquer sur le bouton

En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 20h15   #18
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
merci énormément pour vos réponse
le problème est résolu
franchement c'est la meilleur forum , j'y trouve toujours des solutions à mes problèmes grâce aux ses génies
Merci encore pour l'intérêt que vous avez porté à mon problème

bonsoir
@matchess
il reste une chose l'événement du déclenchement du macro
est-il possible de mettre l'activation d'une cellule de la ligne qui sera masqué un événement du déclenchement?
pour l'événement ""la feuille soit active" cette événement est déclenché seulement à l'ouverture de la feuille ?? c'est à dire si on ouvre la feuille normalement l'événement sera déclenché donc les lignes qui vérifient les conditions sera masqués on suppose que le technicien ne ferme pas la feuille , elle reste ouverte après un certain temps un autre ligne vérifie les conditions est ce qu'il sera masqué ?
ce pour ce raison je réfléchis à l 'événement une cellule de ligne est active
merci
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/08/2011, 23h02   #19
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Citation:
Envoyé par frihat mohamed Voir le message
l'événement de déclenchement de la macro est l'activation de la feuille du classeur
Code :
1
2
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
Citation:
Envoyé par frihat mohamed Voir le message
est-il possible de mettre l'activation d'une cellule de la ligne, qui sera masquée, (missing?) un événement du déclenchement?
Editez cette phrase pour une formulation plus simple.

Citation:
Envoyé par frihat mohamed Voir le message
pour l'événement ""la feuille soit active" cet événement est déclenché seulement à l'ouverture de la feuille ?
Un classeur peut s'ouvrir ou se fermer. Une feuille ne peut que s'activer ou se désactiver quand l'utilisateur change de feuille. Vous pouvez capturer la notion de première activation avec un Boolean Public déclaré dans le module standard ModMask.

Citation:
Envoyé par frihat mohamed Voir le message
l 'événement une cellule de ligne est active
Une cellule peut être sélectionnée ou non. On peut détecter le changement de sélection par :

Code :
1
2
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub
Vous trouvez tous les événements possibles de chaque type d'objet, dans la listbox "Workbook" sous (general) du VBE ou "Worksheet" pour une feuille.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 23h42   #20
Invité régulier
 
Inscription : mars 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 49
Points : 7
Points : 7
merci j'ai bien compris
j'ai fait ce code mais quand je l'ai exécutée un message est affiché
" end if without bolck if "
j'ai vérifié tous les structure if End if mais j'ai pas trouvé aucune erreur
le code est le suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Private Sub CommandButton1_Click()
 Dim ab As Range
 Dim lig As Integer
 Dim col As Integer
 
If (TextBox1.Value = " ") Or (TextBox1.Value = "") Then
 MsgBox ("Entrez votrE identifiant et votre mots de passe")
 Else
With Sheets("Sheet3")
   Set ab = .Range("D:P").Find(TextBox1.Text, lookat:=xlWhole)
  If ab Is Nothing Then
     MsgBox ("Erreur")
  Else
  lig = ab.Row
  col = ab.Column
   If TextBox2.Text = .Cells(lig, col + 1) Then
 
          If ComboBox1.List.ListIndex = 0 Then
 
            If ListBox1.List.ListIndex = 0 And col = 4 Then
 
           Me.Hide
           Unload Me
 
           Else
 
 
         If ListBox1.List.ListIndex = 1 And col = 6 Then
 
 
          Me.Hide
          Unload Me
 
         Else
        MsgBox "verifié le choix de la machine "
 
        End If
       End If
 
    Else
         If ComboBox1.List.ListIndex = 1 Then
 
         If ListBox1.List.ListIndex = 0 And col = 8 Then
 
          Me.Hide
         Unload Me
         Else
 
        If ListBox1.List.ListIndex = 1 And col = 10 Then
 
        Me.Hide
        Unload Me
        Else
 
      If ListBox1.List.ListIndex = 2 And col = 12 Then
        Me.Hide
       Unload Me
       Else
 
       If ListBox1.List.ListIndex = 3 And col = 14 Then
        Me.Hide
       Unload Me
 Else
 
     If ListBox1.List.ListIndex = 4 And col = 16 Then
        Me.Hide
       Unload Me
 
      Else
        MsgBox "verifié le choix de la machine "
       End If
       End If
       End If
       End If
       End If
 
     Else
 
     MsgBox "chosir area"
 
        End If
        End If
 
      Else
      MsgBox " Verifiez votre mots de passe"
      End If
     End If
     End If
 
End Sub
frihat mohamed est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h48.


 
 
 
 
Partenaires

Hébergement Web