Oui, bien vu Ousk. Hello aussi. :yaisse2:Citation:
Juste un détail : Déclare c as range, c'est plus mieux
Version imprimable
Oui, bien vu Ousk. Hello aussi. :yaisse2:Citation:
Juste un détail : Déclare c as range, c'est plus mieux
Bonjour Godzesla,
Je ne suis pas administrateur de mon poste et je n'ai pas les droits pour télécharger les fichiers indiqués. De ce fait, je ne peux tester ton application et les administrateurs ne veulent pas m'aider sur le coup.
Tant pis et dommage.
Je dois donc supprimer ton envoi de mon répertoire. (dur, dur).
Merci beaucoup pour ton aide
A+
Pas sympas tes collègues !!!! :aie:
Bonjour,
Voici le code que j'ai fait, j'arrive à sélectionner la cellule où se trouve le Nom de l'agent, mais rien à faire pour sélectionner la date.
Un petit coup de main ? :cry:
Merci par avance
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 Private Sub CmbOk_Click() Dim cell As Object Dim val As Variant Dim FirstAddress As String Nom = CmbNom val = TxtDu If val = "" Or CmbNom = "" Then Exit Sub ActiveSheet.Activate With ActiveSheet.UsedRange.Cells Set cell = .Find(Nom, LookIn:=xlValues) If Not cell Is Nothing Then FirstAddress = cell.Address Do cell.Select Set cell = .FindNext(After:=ActiveCell) Loop While Not cell Is Nothing And cell.Address <> FirstAddress Else MsgBox "La recherche n'a donné aucun résultat." End If End With End Sub
(je n'ai pas relu ton code mais la recherche n'est pas le souci.)
Dans quelle colonne se trouve le nom ?
Dans quelle colonne se trouve la date ?
Je suppose que CmbNom est le nom du combo contenant le nom que tu sélectionnes;
Tu dis.
Bonjour,
CmbNom est bien le nom du Combo
TxtDu est le nom de la TextBox où j'inscrit la date à rechercher (pas dans le code, ce que j'avais fait ne fonctionnant pas, je l'ai supprimé)
Le Nom colonne B6:B50
la Date colonnes lignes 4 et 5 colonnes B à FZ
Format ligne 4 :jjj (ven)
Foramt ligne 5 : jj (30)
Re,
As-tu essayé ce que je t'ai proposé ?Citation:
Un petit coup de main ?
J'ai bien peur que non car ton Find recherche tous les noms qui correspondent (???) et je ne vois rien du tout pour la date.
Comment veux tu chercher sur le numéro du jour alors que tu as 3 mois dans la même feuille. Dat gaat niet. :aie:
Ok, je viens de relire tout et je crois avoir compris ton problème.
Tu dois effectuer une triple recherche :
- Une recherche pour le nom, colonne A,
- une recherche pour la plage du mois, ligne 2,
- et une recherche pour le jour, ligne 5.
Comme pour le nom ce n'est pas un problème, je passe au mois.
Le mieux aurait été d'avoir un mois par feuille...
Si ton responsable ne veut pas en entendre parler ou si tu as des raisons "raisonnables", tu vas devoir tester les cellules fusionnées puisque ton mois de janvier se trouve dans 62 cellules fusionnées, février dans 56, etc.
Bon courage les années bissextiles.
Dis déjà si tu pourrais placer tes mois dans des feuilles séparées, pour Excel, ce n'est pas plus cher (!)
Après on verra ce qu'on fait.
Considérez-moi comme une mule si vous voulez, mais avec mon système 1 recherche et juste un calcul pour la colonne du jour !
Par ailleurs, une feuille par moi c'est vachement mieux, de fait.
Pour des raisons pratiques (celles des utilisateurs) il faut absolument 3 mois par feuille.
Godzestlla, tu n'es pas une mule, j'ai essayé ton code avant de mettre celui-ci en place, mais sans succès.
Comme ça paraît très compliqué, je vais laisser tomber, je vous prie de m'excuser de vous avoir fait perdre votre temps.
Les utilisateurs se contenteront de ce qu'il y a et les chefs aussi.
Encore merci et je vous réitère mes excuses :oops:
Mais si c'est facile.
tant pis.
A+
Je ne peux pas perdre mon temps et surtout vous faire perdre le vôtre pour des demandes "Farfelues" d'utilisateurs qui ne s'intéressent même pas à la façon dont je le fait et du temps passé. Il faut que ça marche un point c'est tout.
Cette fois-ci ils se contenteront de ce que j'ai fait avec votre aide.
Ils vont hurlés mais tant pis.
Merci encore à tous et acceptez mes excuses
C'est toi qui sait. ;)
Je viens de faire un petit truc que tu pourrais tester. Il ne s'agit que d'une méthode te permettant de saisir la date. Elle simplifierait le problème de recherche que je t'expliquerai. Mais avant teste ça.
Tu crées un userform tout propre dans un nouveau classeur, tu places deux combobox dans l'userform et tu mets ce code dans la feuille de code de l'usf.
Ensuite tu exécutes.
L'intérêt ? Je te l'expliquerai plus tard.
Code:
1
2
3 Private Sub ComboBox1_Click() MaJCombo2 ComboBox1.ListIndex + 1 End Sub
Code:
1
2
3
4
5
6
7
8 Private Sub UserForm_Activate() Dim Mois As Byte For Mois = 1 To 12 ComboBox1.AddItem Format(DateSerial(2009, Mois, 1), "mmmm") Next ComboBox1 = Format(Now, "mmmm") MaJCombo2 Month(Now) End Sub
Code:
1
2
3
4
5
6
7
8 Sub MaJCombo2(Mois) Dim Jour As Variant ComboBox2.Clear For Jour = CDate("1/" & Mois & "/" & Year(Now)) To CDate("1/" & (Mois + 1) & "/" & Year(Now)) - 1 ComboBox2.AddItem Format(Jour, "dd mmmm yyyy") Next ComboBox2.ListIndex = 0 End Sub
Voilà j'ai mis en place ce que tu m'as demandé
Peux-tu mettre un mois par feuille ? Réponds-moi là dessus, ça simplifierait grandement le problème.
On peut faire avec mais je vois une solution qui passerait par les collections
Nommer les plages selon le mois et pour chaque plage nommée l'adresse des jours du mois.
Si on n'a qu'un mois par feuille, un simple tableau suffit.
Tu dis
Je pourrais faire en sorte qu'à l'ouverture de la feuille, un seul mois paraisse, les 2 autres étant cachés (en cachant les colonnes), mais il doit y avoir impérativement 1 trimestre par feuille, désolé.
Ok, ça va compliquer un peu mais ce n'est pas très sorcier.
Là tout de suite je dois m'absenter mais je verrai ça à mon retour (en début d'après-midi)
A tout'
Tout vient à point qui sait attendre... dit-on...
Tu ne nous as pas tout dit :( Les dates sont sur deux lignes, ce qui n'a aucune importance... mais aussi sur deux colonnes fusionnées, ce qui empêche une m'thode de recherche des plus simple. On n'a pas idée de faire des choses pareilles.
J'avais deux solutions :
Te faire tout reprendre en mettant deux fois la même date sur deux cellules conjointes, matin et après-midi, l'une des deux cellules prenant la couleur du fond... Pour l'aspect, ça revenait au même.
Ou bien essayer de faire avec (:evilred:)
J'ai choisi le plus amusant... et donc... de faire avec :mouarf:
On sait maintenant que Find ne trouve pas les données dans des cellules fusionnées.
Cela implique un petit travail de fond :
Consiste à nommer les dates dans les cellules "dd" fusionnée, ligne 5
Pour ça je t'ai fait deux petits utilitaires :
- un pour nommer ces dates en automatique
Le code suivant s'applique aux deux premiers trimestres.
A placer dans un module standard
Code:
1
2
3
4
5
6
7
8
9
10
11
12 Sub initTrimestre1() Dim NoCol As Integer Worksheets("Feuil1").Select '******* A modifier pour trimestres suivants NoCol = 2 'Colonne B '******* Ligne suivante à modifier pour trimestres suivants For jour = CDate("1/1/" & Year(Now)) To CDate("1/4/" & Year(Now)) - 1 Cells(5, NoCol).Value = Format(jour, "dd") Range(Cells(5, NoCol), Cells(5, NoCol + 1)).Name = Format(jour, "mmmmdd") NoCol = NoCol + 2 Next End Sub
Pour l'adapter aux deux trimestres suivants, il suffit de modifier les date de débuts et de fins de trimestres.Code:
1
2
3
4
5
6
7
8
9
10
11
12 Sub initTrimestre2() Dim NoCol As Integer Worksheets("Feuil2").Select '******* A modifier pour trimestres suivants NoCol = 2 'colonne B au départ '******* Ligne suivante à modifier pour trimestres suivants For jour = CDate("1/4/" & Year(Now)) To CDate("1/7/" & Year(Now)) - 1 Cells(5, NoCol).Value = Format(jour, "dd") Range(Cells(5, NoCol), Cells(5, NoCol + 1)).Name = Format(jour, "mmmmdd") NoCol = NoCol + 2 Next End Sub
Le dernier utilitaire est là pour supprimer tous les noms du classeur (si jamais tu souhaitais renoncer à la solution que je te propose :cry:)
L'application ? Toujours aussi simpleCode:
1
2
3
4
5
6 Sub SupprimerNomDeChamp() Dim nom As Name For Each nom In ActiveWorkbook.Names nom.Delete Next End Sub
Trois combobox dans un userform et c'est tout !
ComboBox1 contient les mois de l'année
ComboBox2 contient les dates du mois sélectionné dans le combobox1
ComboBox3 contient les noms ds la colonne A
ComboBox3 n'est accessible qu'une fois le mois et la date sélectionnés
Si toutes tes feuilles trimestrielles sont renseignées, et une fois les initialisations réalisées avec les initTrimestre1, 2, 3 et 4, tu peux tester ce code
Code à placer dans la feuille de code de l'userform
Une précision : Les noms de champs ont la forme "NomDuMois &Date" ex : "janvier15", non reconstitué en recherche par le nom.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 Private Sub ComboBox1_Click() Select Case ComboBox1.ListIndex + 1 Case 1, 2, 3 Worksheets("Feuil1").Select Case 4, 5, 6 Worksheets("Feuil2").Select Case 7, 8, 9 Worksheets("Feuil3").Select Case 10, 11, 12 Worksheets("Feuil4").Select End Select MaJCombo2 ComboBox1.ListIndex + 1 End Sub Private Sub ComboBox1_Enter() ComboBox2.Clear 'efface le ComboBox2 End Sub Private Sub ComboBox2_Click() ComboBox3.Enabled = True 'autorise l'accès au combobox3 contenant les noms End Sub Private Sub ComboBox3_Click() Dim c As Range, LaDate As String, NoCol As Integer 'Recherche de la colonne Date LaDate = Format(CDate(ComboBox2), "mmmmdd") NoCol = TrouverColonne(LaDate) 'Recherche du nom With ActiveSheet.Range("A6:A" & Range("A" & Rows.Count).End(xlUp).Row) Set c = .Find(ComboBox3) If Not c Is Nothing Then NoLig = c.Row End With Cells(NoLig, NoCol).Select End Sub Private Sub UserForm_Activate() Dim Mois As Byte Worksheets("Feuil1").Select ComboBox3.RowSource = Range("A6:A" & Range("A" & Rows.Count).End(xlUp).Row).Address For Mois = 1 To 12 ComboBox1.AddItem Format(DateSerial(2009, Mois, 1), "mmmm") Next ' ComboBox1 = Format(Now, "mmmm") MaJCombo2 Month(Now) ComboBox3.Enabled = False End Sub Sub MaJCombo2(Mois) Dim jour As Variant, Fin as double Fin = IIf(Mois = 12, CDate("1/" & Mois & "/" & Year(Now)) + 30, CDate("1/" & (Mois + 1) & "/" & Year(Now)) - 1) ComboBox2.Clear For jour = CDate("1/" & Mois & "/" & Year(Now)) To Fin ComboBox2.AddItem Format(jour, "dd mmmm yyyy") Next ComboBox3.ListIndex = -1 '***** (*) ****** End Sub Function TrouverColonne(LaDate As String) Range(LaDate).Select TrouverColonne = ActiveCell.Column End Function
Bonne soirée
Une remarque :
Dans la ligne de code suivante, pourquoi mettre "du premier jour du trimestre courant au premier jour du trimestre suivant" pour parcourir ts les jours du trimestre
Explication :Citation:
For jour = CDate("1/4/" & Year(Now)) To CDate("1/7/" & Year(Now)) - 1
Les mois ne comprennent pas le même nombre de jours. Donc, le seul moyen de ne pas se tromper est d'aller jusqu'au 1er du mois suivant ... moins 1
Edit
Au point où tu en es, tu pourrais aller un peu plus loin pour empêcher l'utilisateur de toucher à la feuille de calculs.
Un combo renseigné des types d'arrêts (congé, rtt, maladie, déplacement, et tsé tes rats...)
Un select case sur la sélection et l'affection d'un code ou d'une couleur ou des deux selon le type.
Juste une idée.
Bonjour ouskel'n'or
Merci pour le code, sacré boulot.
Je l'ai donc mis en place, cependant il coince sur la ligne "Range" du code suivant :
Le message est : "Erreur d'exécution "1004" - La méthode "Range" de l'objet_global a échoué.
Lorsque je passe la souris dessus "LaDate="février05"" est indiqué
Quel est le soucis ?Code:
1
2
3
4
5 Function TrouverColonne(LaDate as String) Range(LaDate).Select TrouverColonne=ActiveCell.column End Function