Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Planning via userform Selection d'une plage et couleur cellule

6 réponses
Avatar
Alex
Bonjour =E0 tous,

Je travaille sur un projet de formulaire pour g=E9rer le planning de 5
personnes.

Dans ce formulaire, la personne s=E9lectionne son nom puis rentre une
date de d=E9but et une date de fin. Je voudrais que ces dates soient
interpret=E9es sur ma feuille "planning" sous forme de couleur de fond
de cellules.

Mon soucis est le suivant :

Je ne sais pas comment faire la recherche de la premi=E8re date puis de
la seconde date dans la colonne A de ma feuille "Planning" et de
s=E9lectionner non pas la plage o=F9 se trouve les date, mais la m=EAme
plage selon le nom de la personne (les 5 noms sont =E0 partir de la
colonne B =E0 F).

Je vous remercie par avance de votre aide.

Alex

6 réponses

Avatar
FdeCourt
Salut,

Une méthode peut être un peu compliqué, mais qui fonctionne. Je l'ai
un peu adapter à ta problématique :
Sub test()
dateDebut = Cells(6, 3).Value
dateFin = Cells(6, 4).Value
collab = Cells(6, 5).Value
'Pour trouver les intervalles de date
'la ligne de la date de début est intervalle(0)
'la ligne de la date de fin est intervalle(1)
intervalle = Split(IntervalleDate(dateDebut, dateFin, 1, 2), "|",
2)

'pour trouver la colonne cu collaborateur
colonne = colonneCollaborateur(collab, 2, 1)
Range(Cells(intervalle(0), colonne), Cells(intervalle(1),
colonne)).Interior.ColorIndex = 4

End Sub
Function colonneCollaborateur(nom, colonneDebut, ligne) As Integer
Dim x As Integer, colonneFin As Integer, collaborateur()
colonneFin = Cells(ligne, 255).End(xlToLeft).Column
collaborateur = Range(Cells(ligne, colonneDebut), Cells(ligne,
colonneFin))
x = 1
Do Until collaborateur(1, x) = nom
x = x + 1
Loop
colonneCollaborateur = x + colonneDebut - 1
End Function
Function IntervalleDate(dateDebut, dateFin, colonneDate, lgnDebut)
Dim lgn As Double, dateRange(), debut As Double, fin As Integer
lgn = Cells(65536, colonneDate).End(xlUp).Row
dateRange = Range(Cells(lgnDebut, colonneDate), Cells(lgn,
colonneDate)).Value
debut = lgn - lgnDebut + 1
fin = 1
Do Until dateRange(debut, 1) <= dateDebut And debut > 0
debut = debut - 1
Loop
Do Until dateRange(fin, 1) >= dateFin
fin = fin + 1
Loop
IntervalleDate = debut + lgnDebut - 1 & "|" & fin + lgnDebut - 1
End Function

Cordialement,

F.
Avatar
Alex
Bonsoir F.

Merci de ta réponse. En effet, ta solution est très difficile pour
moi.

Je pensais à un truc plus simple, comme recherche dans ma colonne A la
premiere date (Retenir le numéro de la ligne "date1" ) puis recherche
la seconde date (retenir le numéro de ligne "Date2"). Apres en
fonction du nom (si Alex alors en colonne B, si Bruno alors colonne C)
selection de la plage de "date1" à "date2" en fond rouge par exemple.

Peux tu m'aider dans ce sens ?

Merci encore de votre aide.

Alex
Avatar
Alex
Voici ce que j'ai tenté d'écrire, mais dès le départ, j'ai un probl ème
dans la ligne de commande de recherche de la valeur de mon
textbox.value, donc je n'arrive pas à tester la suite :

Private Sub BtnValid_Click()

Sheets("Planning").Select
Columns("A:A").Select

Dim Rech1 As Long
Dim Rech2 As Long

'Ici ca coince déja sur mon recherche

Selection.Find(What:="Plann.DDD.Value", After:¬tiveCell,
LookIn:=xlFormulas _
, LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse).Activate
'Ici je veux dire que ma recherche = au n°ligne de la recherche
ActiveCell.Rows = Rech1
'Ici idem avec la deuxieme date

Selection.Find(What:="Plann.DDF.Value", After:¬tiveCell,
LookIn:=xlFormulas _
, LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse).Activate
ActiveCell.Rows = Rech2
'Apres en fonction du nom selection de la bonne colonne
If Me.NOM = "Alex" Then
Range("B," & Rech1 & ":B," & Rech2).Select
With Selection
.Interior.ColorIndex = 40
End With
Else end if
'Après meme condition avec un autre nom...
If Me.NOM ="Bruno" then ...
End Sub


Merci par avance de votre aide
Alex
Avatar
FdeCourt
Salut,

Ma solution n'est pas si compliquée !
Il y a trois procédures :
Deux fonctions, que tu ne devrais pas avoir besoin de modifier
une macro qui appelle successivement ces deux fonctions, et qui est la
seule que tu peux avoir besoin de modifier.

Créés un nouveau module que tu appelles "fonctions", dans lequel tu
mets ces deux fonctions :
'________________________
Function colonneCollaborateur(nom, colonneDebut, ligne) As Integer
Dim x As Integer, colonneFin As Integer, collaborateur()
colonneFin = Cells(ligne, 255).End(xlToLeft).Column
collaborateur = Range(Cells(ligne, colonneDebut), Cells(ligne, _
colonneFin))
x = 1
Do Until collaborateur(1, x) = nom
x = x + 1
Loop
colonneCollaborateur = x + colonneDebut - 1
End Function
Function IntervalleDate(dateDebut, dateFin, colonneDate, lgnDebut)
Dim lgn As Double, dateRange(), debut As Double, fin As Integer
lgn = Cells(65536, colonneDate).End(xlUp).Row
dateRange = Range(Cells(lgnDebut, colonneDate), Cells(lgn, _
colonneDate)).Value
debut = lgn - lgnDebut + 1
fin = 1
Do Until dateRange(debut, 1) <= dateDebut And debut > 0
debut = debut - 1
Loop
Do Until dateRange(fin, 1) >= dateFin
fin = fin + 1
Loop
IntervalleDate = debut + lgnDebut - 1 & "|" & fin + lgnDebut - 1
End Function
'____________________

Ensuite, créés un autre module, dans lequel tu va mettre la macro qui
appelle ces deux fonctions :
'____________________
Sub test()
dateDebut = Cells(6, 3).Value
dateFin = Cells(6, 4).Value
collab = Cells(6, 5).Value
'Pour trouver les intervalles de date
'la ligne de la date de début est intervalle(0)
'la ligne de la date de fin est intervalle(1)
intervalle = Split(IntervalleDate(dateDebut, dateFin, 1, 2), "|",
_
2)

'pour trouver la colonne cu collaborateur
colonne = colonneCollaborateur(collab, 2, 1)
Range(Cells(intervalle(0), colonne), Cells(intervalle(1), _
colonne)).Interior.ColorIndex = 4

End Sub
'____________________

Dans cette macro, il y a deux variables : intervalle et colonne.
Ces deux variables vont être renseignées par le résultat des fonction s
que tu as copiés précédement.

Voici une description de ces deux variables :

intervalle = Split(IntervalleDate(dateDebut, dateFin, 1, 2), "|",
_
2)

Le résultat de la fonction IntervalleDate est un texte qui se présente
ainsi "ligne|colonne" Le split à pour objectif de séparer la ligne de
la colonne, et transforme la variable "intervalle" en un tableau avec
deux entrées.
la fonction "IntervalleDate" s'appelle avec les arguments suivants :
- dateDebut : correspond à la valeur de la date de début (qui est
saisie par l'utilisateur dans le formulaire)
- dateFin : correspond à la valeur de la date de fin (qui est saisie
par l'utilisateur dans le formulaire)
- colonneDate : correspond à la colonne dans laquelle se trouvent les
dates (colonne A = 1, colonne B = 2, etc.....)
- lgnDebut correspond à la ligne à partir de laquelle commence la
liste de date (dans ton tableau, il peut y avoir une entete de
colonne, et les dates ne commencent qu'à la ligne 2)

Donc dans ton cas, ce que tu as besoin de faire c'est :
intervalle = Split(IntervalleDate(Plann.DDD.Value,
Plann.DDF.Value, 1, 2), "|", _
2)

Pour la variable colonne, le principe est le même :
colonne = colonneCollaborateur(collab, 2, 1)
- ou collab correspond au nom du collaborateur
- 2 correspond à la colonne à partir de laquelle commencer la
recherche
- 1 correspond à la ligne ou se trouvent les noms de collaborateurs.

Par contre le résultat de cette formule est une valeur simple
indiquant la colonne, d'ou l'absence du split.

J'espère avoir été clair.

Cordialement,

F.
Avatar
Alex
Re Bonjour à Tous,

Je viens de lire la nouvelle réponse de F., mais entre temps j'avais
étudié ma solution avec mon niveau macro plus simple dirons nous et
vous propose ci dessous ma solution plus basic que celle proposée par
F. mais qui fonctionne. A répeter autant de fois qu'il a de personnes
et de sites :


If Me.CHAR = True Then
Range("A1").Select
Columns("A:A").Select
'Si Ad.Système recherche N°ligne 1
If Me.NOM = "Ad. Système" Then
Cells.Find(What:Íate(Me.DDD.Value), After:¬tiveCell,
LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse).Activate

ActiveCell.Select
i = ActiveCell.Row
NumLigne1 = i
'Recherche N°Ligne 2
Range("A1").Select
Columns("A:A").Select
Cells.Find(What:Íate(Me.DFD.Value), After:¬tiveCell,
LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse).Activate

ActiveCell.Select
j = ActiveCell.Row
NumLigne2 = j
'Selection et mise en forme de la plage
Range("B" & NumLigne1 & ":B" & NumLigne2).Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 90
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Selection.Merge
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With

Range("B" & NumLigne1 & ":B" & NumLigne2).Value = "CHAR."

Range("C" & NumLigne1 & ":C" & NumLigne2).Select
Selection.Merge
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("C" & NumLigne1 & ":C" & NumLigne2).Value = Me.OBS
Else: End If

Je vais comme essayer la seconde version de F. et vous dirai si j'y
suis arrivé.
Encore un grand merci.
Cordialement
Alex
Avatar
FS
Bonjour,

Une autre approche possible avec un CommandButton dans la feuille
planning et ce bout de code attaché au bouton :

Private Sub CommandButton1_Click()
Dim d1 As Range, d2 As Range, nom As Range

Set d1 = Application.InputBox _
("Date début (sélectionner la cellule) :", Type:=8)
Set d2 = Application.InputBox _
("Date fin (sélectionner la cellule) :", Type:=8)
Set nom = Application.InputBox _
("Nom du salarié (sélectionner la cellule) :", Type:=8)

Cells(d1.Row, nom.Column). _
Resize(d2.Row - d1.Row + 1).Interior.ColorIndex = 44

End Sub

L'utilisateur sélectionne à la souris les dates de début et de fin ainsi
que son nom. Il n'y a pas ainsi à faire de recherche dans la colonne des
dates, c'est le salarié qui s'en charge :)
Un exemple minimal :

http://www.cijoint.fr/cjlink.php?file=cj201001/cij8EmfoDe.xls

Si ton formulaire est un UserForm, tu peux obtenir le même
fonctionnement avec des contrôles RefEdit.
Pour sécuriser ce genre d'approche il faut gérer les cas d'erreur
possible (quand l'utilisateur annule par exemple, ou choisis une cellule
hors des plages demandées).

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Alex a écrit :
Bonjour à tous,

Je travaille sur un projet de formulaire pour gérer le planning de 5
personnes.

Dans ce formulaire, la personne sélectionne son nom puis rentre une
date de début et une date de fin. Je voudrais que ces dates soient
interpretées sur ma feuille "planning" sous forme de couleur de fond
de cellules.

Mon soucis est le suivant :

Je ne sais pas comment faire la recherche de la première date puis de
la seconde date dans la colonne A de ma feuille "Planning" et de
sélectionner non pas la plage où se trouve les date, mais la même
plage selon le nom de la personne (les 5 noms sont à partir de la
colonne B à F).

Je vous remercie par avance de votre aide.

Alex