Recherche sur une zone variable

Chris57

XLDnaute Occasionnel
Bonjour à tous,

voilà mon pb : je cherche un moyen simple de tester les 6 cellules au dessus de celle sélectionnée, si l'une d'elle contient une date, celle-ci doit être stockée dans une variable.

Le truc c'est qu'après ce test je me retrouve à nouveau dans la cellule sélectionnée de départ.

Cette cellule de départ peut varier et être n'importe où dans un tableau.

ça ressemble à ça :
_____A_________B_________C________
1_01/01/06___02/01/06___03/01/06__ etc...
2___xxx________xxx________xxx
3___xxx________xxx________xxx
4___xxx________xxx________xxx
5___xxx________xxx________xxx
6___xxx________xxx________xxx
7__________________________________
8_07/01/06___08/01/06___09/01/06__ etc...
9___xxx________xxx________xxx
10__xxx________xxx________xxx
11__xxx________xxx________xxx
12__xxx________xxx________xxx
13__xxx________xxx________xxx
____________________________________
si je clique dans une cellule contenant un 'xxx', il faut que la date qui se situe au dessus soit placée dans une variable, puis retour à ma cellule 'xxx'.
 

Chris57

XLDnaute Occasionnel
Effectivement le nombre de lignes est toujours le même entre deux cellules dates, mais il est de 6 (mon exemple est mal dessiné). Mais peu importe.

Merci pour ton aide, mais j'avoue ne pas comprendre ces lignes. Si tu as le temps, pourrais-tu m'expliquer ?
 

ERIC S

XLDnaute Barbatruc
re

tu ouvres vba par

alt F11

tu double -clic sur le nom de la feuille qui t'intéresse

tu sélectionnes (au lieu de général) worksheet et
SelectionChange
tu copies le code (voir ci-après)

ce code basic, à chaque fois que tu sélectionnes une cellule de ta feuille stocke dans madate le contenu de la cellule située

même colonne que la cellule activée (Target.column)
et pour la ligne les dates sont en 1,7,13,19..
si target.row est entre 1 et 6 il faut pointer ligne 1, entre 7 et 12 il faut pointer ligne 7..

int((target.row-1)/nbligne) donne 0 pour target.row entre 1 et 6, donne 1 entre 7 et 12..

donc
1 + Int((Target.Row-1) / nbligne) * nbligne

fera 1 entre les lignes 1 & 6
7 entre 7 et 12
13...

le code est donc:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
nbligne = 6
madate = Cells(1 + Int((Target.Row-1) / nbligne) * nbligne, Target.Column)
End Sub

il devait y avoir une erreur sur la première formule.

A tester et adapter

A+
 

Chris57

XLDnaute Occasionnel
C'est plus clair maintenant ! Mais je n'arrive pas à l'adapter à mon cas... :eek:

En fait mon tableau commence à la ligne 3, donc en ligne 3 il y a une date, puis 6 lignes, puis une date puis 6 lignes etc...

J'ai tenté
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
nbligne = 7
madate = Cells(3 + Int((Target.Row - 1) / nbligne) * nbligne, Target.Column)
End Sub

mais c'est pas bon....

Quoi qu'il en soit je te remercie pour ces réponses rapides !!!
 

ERIC S

XLDnaute Barbatruc
re

tu peux aussi faire plus pro et plus adaptable

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
nbligne = 7
ceb=3
madate = Cells(deb + Int((Target.Row - deb) / nbligne) * nbligne, Target.Column)
End Sub

A+
 

ERIC S

XLDnaute Barbatruc
rere

j'ai les doigts qui dérapent..

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
nbligne = 7
deb=3
madate = Cells(deb + Int((Target.Row - deb) / nbligne) * nbligne, Target.Column)
End Sub



la variable est deb et non ceb

A+
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Chris, Éric, bonsoir le forum,

Comme ce problème m'intéressait, j'ai essayé la macro d'Éric mais j'avais des bugs selon les lignes où se trouvaient mes dates.

Je propose ce code qui semble fonctionner quelles que soient les lignes comportant des dates :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim x As Integer 'déclare la variable x
Dim madate As Date 'déclare la variable madate

'si la ligne de la cellule active est inférieure à 7, sort de la procédure
If Target.Row < 7 Then Exit Sub

For x = -1 To -6 Step -1 'boucle de -1 à -6
'condition : si la cellule décalée de x vers le haut n'est pas vide et
'si elle contient une date
If ActiveCell.Offset(x, 0).Value DIFFÉRENT_DE '' And IsDate(ActiveCell.Offset(x, 0)) Then
madate = DateValue(ActiveCell.Offset(x, 0).Value) 'definit la variable madate
MsgBox madate 'message affichant madate (tu effaceras cette ligne)
Exit For 'sort de la boucle
End If 'fin de la condition
Next x 'prochaine valeur de la boucle
End Sub

Remplace DIFFÉRENT_DE par les symboles consécutifs Inférieur, Suprérieur qui ne passent pas dans ce forum...
 

Discussions similaires

Réponses
25
Affichages
677

Statistiques des forums

Discussions
312 345
Messages
2 087 471
Membres
103 553
dernier inscrit
jhnm