remonter l'affichage d'une ligne à un endroit precis

khephrens

XLDnaute Occasionnel
bonjour au forum

sur le fichier joint, onglet "2015", j'ai une liste verticale des jours de l'année.
J'aimerais, en saisissant le numéro du mois dans la cellule D2, que l'affichage de ma liste commence sous la cellule B5, a partir du premier jour du mois choisi en cellule D2.
j'aimerai la même chose en saisissant une date précise dans la cellule C2

j'espère être assez clair dans ma demande.
merci pour votre aide
kheph:)
 

Pièces jointes

  • planning absences 2015 1onglet.xls
    369.5 KB · Affichages: 32

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : remonter l'affichage d'une ligne à un endroit precis

Bonsoir khephrens

Un essai dans le fichier joint. Le code est dans le module de code de la feuille "2015":
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Quoi, tablo, i&
On Error GoTo ErrPasDate
  If Not Intersect(Target, [d2]) Is Nothing Then
    Quoi = CDate("01/0" & Target & "/" & Year([a4]))
  ElseIf Not Intersect(Target, [b2]) Is Nothing Then
    Quoi = Int([b2].Value2)
  Else
    Exit Sub
  End If

  tablo = Range("b6:b371").Value2
  For i = LBound(tablo) To UBound(tablo)
    If Int(tablo(i, 1)) = Quoi Then Exit For
  Next i
  If i <= UBound(tablo) Then Application.Goto Cells(5 + i, "a"), True
  Exit Sub
ErrPasDate:
End Sub

Edit: v2 -> corrigé v1 si B2 ou D2 ne sont pas des saisies valides (date ou mois)
 

Pièces jointes

  • khephrens-planning absences onglet 2015 v2.xlsm
    119.6 KB · Affichages: 38
Dernière édition:

khephrens

XLDnaute Occasionnel
Re : remonter l'affichage d'une ligne à un endroit precis

bonjour ma pomme.
excellent c'est exactement ce que je souhaitais. :)
néanmoins je ne comprends pas le code, si vous avez un peu de temps pour mettre des commentaires explicatifs, cela me ferait progresser:)
je vous remercie et bonne journéee
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : remonter l'affichage d'une ligne à un endroit precis

Bonsoir khephrens,

[...] néanmoins je ne comprends pas le code, si vous avez un peu de temps pour mettre des commentaires explicatifs, cela me ferait progresser [...]

[FONT=&amp]Préambule :[/FONT]
[FONT=&amp]J’ai toujours eu des difficultés pour utiliser la méthode FIND en vba pour rechercher des dates. J’use d’un palliatif qui consiste à rechercher la date désirée au sein d’une boucle sur la plage de recherche. [/FONT]

[FONT=&amp]Une date est fondamentalement un nombre décimal dont la partie entière représente la date du jour et la partie décimale l’heure. Par exemple 14/07/2015 12:00 est représenté par 42199,5 où 42199 est le numéro de série de 14/07/2014 et 0.5 représente l’heure (12:00 en fraction de jour). C’est le fait de formater la cellule en date qui force la représentation sous forme date.[/FONT]

[FONT=&amp]Lorsqu’une cellule X est formatée en date, X.value renvoie une date sous le format « date courte » de Windows (souvent jj/mm/aaa = 14/07/2014, pour un Windows français) alors que X.Value2 renvoie la valeur réelle sous-jacente qui est 42199,5. La propriété Value2 est indépendante du type de formatage de la date.[/FONT]

[FONT=&amp]En prenant la partie entière de X.value2, on ne conserve que la date du jour et on élimine les heures.[/FONT]

[FONT=&amp]Int(X.value2) [/FONT][FONT=&amp]renvoie 42199 qui interprétée sous forme date est le 14/07/2014.[/FONT]

[FONT=&amp]La macro est composée de trois parties :[/FONT]

[FONT=&amp]1) - [/FONT][FONT=&amp]Rechercher si la valeur modifiée sur la feuille « 2015 » est la cellule B2 ou D2[/FONT]

[FONT=&amp] Si c’est le cas, on fixe la date à rechercher Quoi[/FONT]

[FONT=&amp] Si ce n’est pas le cas, on sort de la macro[/FONT]

2) [FONT=&amp]- Si on a passé la première étape, on va rechercher la valeur Quoi dans la plage des dates Range("b6:b371")
Dès qu’on a trouvé la date Quoi dans la plage, on sort de la boucle.
[/FONT]
[FONT=&amp]3) - [/FONT][FONT=&amp]Si on est sorti de la boucle après avoir trouvé la date Quoi, on va se positionner sur la cellule dans laquelle on a trouvé la valeur Quoi.

[/FONT]
[FONT=&amp]Partie 1 :[/FONT]
[FONT=&amp]On cherche l’intersection entre la cellule D2 et Target qui est la zone qui a changé dans la feuille « 2015 ». Si cette intersection n’est pas vide, alors c’est bien la cellule D2 qui a été modifiée.[/FONT]
[FONT=&amp]Si c’est la cellule D2 qui a été modifiée, on calcule la date à rechercher (sous forme de son numéro de série). On construit la date qui est le premier jour du mois D2 et de l’année en A4 soit :[/FONT]

[FONT=&amp]"01/0"[/FONT][FONT=&amp] & Target & "/" & Year([a4])[/FONT][FONT=&amp] puis on convertit cette chaine de caractère en « Vrai date » par la fonction CDATE() :[/FONT][FONT=&amp] CDATE("01/0" & Target & "/" & Year([a4])) [/FONT]

[FONT=&amp]En fait, je pense qu’il serait plus judicieux d’utiliser l’instruction : [/FONT][FONT=&amp]Quoi = DateSerial(Year([a4]), Target, 1) [/FONT][FONT=&amp]– DateSerial étant indépendant de la date « format court ».[/FONT]

[FONT=&amp]Sinon, on cherche l’intersection entre la cellule B2 et Target qui est la zone qui a changé dans la feuille « 2015 ». Si cette intersection n’est pas vide, alors c’est bien la cellule B2 qui a été modifiée.[/FONT]
[FONT=&amp]Si c’est la cellule B2 qui a été modifiée, on calcule la date à rechercher (sous forme de son numéro de série). On prend tout simplement la propriété Value2 de la cellule B2 (identique à Target) :[/FONT]
[FONT=&amp]Quoi = Int([b2].Value2)- [/FONT][FONT=&amp]on prend la partie entière pour éliminer l’éventuelle présence d’heure.[/FONT]

[FONT=&amp]On a maintenant ( pour le cas 1 ou 2) la date Quoi à rechercher sous forme de numéro de série.[/FONT]

[FONT=&amp]Si Target n’est ni la cellule D2 ni la cellule B2, on quitte la procédure. On obtient le code :[/FONT]
VB:
  Private Sub Worksheet_Change(ByVal Target As Range)
Dim Quoi, tablo, i&

  If Not Intersect(Target, [d2]) Is Nothing Then
    Quoi = DateSerial(Year([a4]), Target, 1)
  ElseIf Not Intersect(Target, [b2]) Is Nothing Then
    Quoi = Int([b2].Value2)
  Else
    Exit Sub
  End If
[FONT=&amp]

[/FONT]
[FONT=&amp]Partie 2 :[/FONT]
[FONT=&amp]On recherche dans la plage [/FONT][FONT=&amp]Range("b6:b377")[/FONT][FONT=&amp]la cellule qui sera égale à Quoi.[/FONT]

[FONT=&amp]On commence par transférer les valeurs de la plage [/FONT][FONT=&amp]"b6:b377" [/FONT][FONT=&amp]dans le tableau « tablo » en mémoire :[/FONT]

[FONT=&amp]tablo = Range("b6:b371").Value2 [/FONT][FONT=&amp](rappel : on prend la propriété Value2 qui est le numéro de série de la date et qui est indépendante du format « date courte » de Windows.[/FONT]

[FONT=&amp]On boucle sur les lignes de ce tableau à deux dimensions : 366 lignes et une colonne.[/FONT]
[FONT=&amp]For[/FONT][FONT=&amp] i = LBound(tablo) To UBound(tablo)[/FONT]

[FONT=&amp]On compare Quoi (numéro de série de la date à rechercher) à chaque élément de tablo :[/FONT]
[FONT=&amp]Si on a trouvé la valeur Quoi, alors on sort de la boucle sinon on passe à l’élément suivant de tablo[/FONT]
[FONT=&amp](on prend la partie entière des éléments du tablo pour éliminer d’éventuelle présence d’heure)[/FONT]

[FONT=&amp]If[/FONT][FONT=&amp] Int(tablo(i, 1)) = Quoi Then Exit For[/FONT]


[FONT=&amp]Partie 3 :[/FONT]
[FONT=&amp]Si on est sorti par la fin normale de la boucle, alors i vaut [/FONT][FONT=&amp]UBound[/FONT][FONT=&amp](tablo)+1 [/FONT][FONT=&amp]et aucun élément de tablo n’était égal à Quoi.[/FONT]
[FONT=&amp]Si on est sorti avant la fin normale de la boucle, alors i est la ligne de tablo dont l’élément est égal à Quoi et i est inférieur ou égal à [/FONT][FONT=&amp]UBound[/FONT][FONT=&amp](tablo)[/FONT][FONT=&amp]. Dans ce cas, on fait défiler l’écran de manière à placer la cellule contenant Quoi en haut à gauche.[/FONT]

[FONT=&amp]Pour cela, on emploie l’instruction [/FONT][FONT=&amp]Application.Goto Cellule, True[/FONT][FONT=&amp] qui va placer Cellule dans le coin supérieur gauche et faire défiler l’écran (paramètre True)[/FONT]

[FONT=&amp]La cellule égale à Quoi est sur la ligne 5 + i (la plage des dates commence à la ligne 6) et en colonne A.[/FONT]
[FONT=&amp]If[/FONT][FONT=&amp] i <= UBound(tablo) Then Application.Goto Cells(5 + i, "a"), True[/FONT]


[FONT=&amp]Une dernière chose : [/FONT]
[FONT=&amp]Nous ne maitrisons pas les saisies de l’utilisateur et nous ne pouvons pas être certains que les cellules B2 ou D2 soient bien des dates ou des numéros de mois. De même, la dernière cellule de la plage B377 est vide en cas d’année non bissextile.[/FONT]
[FONT=&amp]Tous ces cas provoquent une erreur à l’exécution de la procédure. On va intercepter ces erreurs et se brancher à l’étiquette [/FONT][FONT=&amp]ErrPasDate [/FONT][FONT=&amp]qui va nous permettre de quitter la procédure sans rien faire.
[/FONT]
[FONT=&amp]On arrive au code suivant :[/FONT]
VB:
    Private Sub Worksheet_Change(ByVal Target As Range)
Dim Quoi, tablo, i&
On Error GoTo ErrPasDate
  If Not Intersect(Target, [d2]) Is Nothing Then
    Quoi = DateSerial(Year([a4]), Target, 1)
  ElseIf Not Intersect(Target, [b2]) Is Nothing Then
    Quoi = Int([b2].Value2)
  Else
    Exit Sub
  End If

  tablo = Range("b6:b371").Value2
  For i = LBound(tablo) To UBound(tablo)
    If Int(tablo(i, 1)) = Quoi Then Exit For
  Next i
  
  If i <= UBound(tablo) Then Application.Goto Cells(5 + i, "a"), True
  Exit Sub
ErrPasDate:
End Sub

Et changeons notre chagrin en plaisir :( :) Regarde la pièce jointe 921609 C'est le moment de la sortir :eek: (cette image)
 

Pièces jointes

  • Bitte1bit.jpg
    Bitte1bit.jpg
    65.8 KB · Affichages: 29
Dernière édition:

khephrens

XLDnaute Occasionnel
Re : faire cohabiter calendrier 1900 et 1904 dans une meme feuille

Bonjour le forum,
j'utilise dans le fichier joint onglet "2015", le calendrier 1904 dans "fichier /options/options avancées" pour pouvoir utiliser un calcul d'heures négatives dans ma feuille.

or depuis que j'utilise cette option "calendrier 1904", pour calculer des heures négatives, la macro installée dans la "feuille5(2015 (2))" ne fonctionne plus. elle permet de faire glisser le fichier à une date précise ou à un debut de mois souhaité en fonction d'un valeur dans les cellule D2 ou B2. quand je dechoche l'option "calendrier 1904" la macro fonctionne tres bien mais du coup ce sont le sheures négatives qui ne se calculent plus.. donc dilemme.. :)

comment peut-on faire cohabiter calcul des heures négatives et fonctionnement de cette macro?
merci pour votre aide à tous
 

Pièces jointes

  • gestion planning martialv1 .xlsm
    221.3 KB · Affichages: 36
  • gestion planning martialv1 .xlsm
    221.3 KB · Affichages: 33
  • gestion planning martialv1 .xlsm
    221.3 KB · Affichages: 35

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : faire cohabiter calendrier 1900 et 1904 dans une meme feuille

Bonsoir khephrens,

[...] comment peut-on faire cohabiter calcul des heures négatives et fonctionnement de cette macro? [...]

Un essai dans le fichier joint. Le code modifié est:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Quoi, tablo, i&
  ActiveSheet.Unprotect
  On Error GoTo ErrPasDate
    If Not Intersect(Target, [d2]) Is Nothing Then
      Quoi = DateSerial(Year([a4]), Target, 1)
      If ActiveWorkbook.Date1904 Then Quoi = Quoi - 1462
    ElseIf Not Intersect(Target, [b2]) Is Nothing Then
      Quoi = Int([b2].Value2)
    Else
      ActiveSheet.Protect
      Exit Sub
    End If
    
    tablo = Range("b6:b371").Value2
    For i = LBound(tablo) To UBound(tablo)
      If Int(tablo(i, 1)) = Quoi Then Exit For
    Next i
    If i <= UBound(tablo) Then
      Application.GoTo Cells(5 + i, "a"), True
    End If
ErrPasDate:
  ActiveSheet.Protect
End Sub

Edit: v4.b qui prend en compte la protection de la feuille
 

Pièces jointes

  • khephrens-planning absences onglet 2015 v4b.xlsm
    213.3 KB · Affichages: 35
Dernière édition:

khephrens

XLDnaute Occasionnel
Re : faire cohabiter calendrier 1900 et 1904 dans une meme feuille

Bonjour mapomme,
tout d'abord un grand merci pour ton aide.
le fichier fonctionne sur la cohabitation des deux calendrier 1900 et 1904 mais maintenant j'ai un bug lorsque je pose un congé ou une recup ( en selectionnant les cellules matin et apres midi puis en cliquant sur le type d'absence). je pense que c'est lié à la protextion de la feuille mise en place dans thisworbook. avant que interviennes pour le probleme des calendrier cela fonctionnait..
faut il supprimer la protection de la feuille? ou y -a t-il un moyen de contourner le probleme?
décidemment il faut que je prenne des cours excel:) tu en donnes??:)

ps: je vous joins le dernier fichier.
 

Pièces jointes

  • gestion planning martialv1 .xlsm
    219.7 KB · Affichages: 34
  • gestion planning martialv1 .xlsm
    219.7 KB · Affichages: 36
  • gestion planning martialv1 .xlsm
    219.7 KB · Affichages: 35

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : remonter l'affichage d'une ligne à un endroit precis

Bonsoir khephrens,

Voir le fichier joint. Les codes de "module2" et de "2015 (2)" ont été légèrement modifiés.

Attention : le code de la feuille "2015", lui, n'a pas changé et ne fonctionne pas.
 

Pièces jointes

  • khephrens-planning absences onglet 2015 v4c.xlsm
    216.7 KB · Affichages: 29
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 902
Membres
103 982
dernier inscrit
krakencolas