Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Bonsoir le Forum,
Cela faisait longtemps que je ne vous ai pas soliciter, mais je but sur un problème.😱
J'ai un usf avec lequel je veus effectuer une recherche dans un tableau en fonction d'une date et un texte pour alimenter les controles de mon usf. Ceci afin de pouvoir modifier la ligne concernée.
Malheureusement il ne me trouve jamais ma recherche.
Je vous met ci-dessous mon code:
Code:
Sub recherche()
Dim Plage As Range, Cellule As Range
Dim wsbd As Worksheet
Set wsbd = Sheets("Pointage")
Set Plage = wsbd.Range("A2:K" & wsbd.Range("A65536").End(xlUp).Row)
For Each Cellule In Plage
If ((Cellule.Value = CDate(UserForm1.DTPicker1.Value)) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
With UserForm1
.ComboBox1.Value = Cellule.Offset(0, 2).Value
.ComboBox7.Value = Cellule.Offset(0, 4).Value
.ComboBox3.Value = Cellule.Offset(0, 5).Value
.ComboBox4.Value = Cellule.Offset(0, 6).Value
.ComboBox5.Value = Cellule.Offset(0, 7).Value
.ComboBox6.Value = Cellule.Offset(0, 8).Value
.ComboBox8.Value = Cellule.Offset(0, 9).Value
.TextBox1.Value = Cellule.Offset(0, 10).Value
End With
Else: MsgBox "Aucun éléments trouvés pour cette période!", vbInformation: Exit Sub
End If
Next Cellule
End Sub
Petite précision (je pense que cela pourrais venir de là, mais suis pas sûr), ma combobox2 est alimenté par 2 colonnes comme ceci:
Code:
Me.ComboBox2.Clear
For Each d In Range(Sheets("Item").[A2], Sheets("Item").[A65000].End(xlUp))
j = 0
Me.ComboBox2.AddItem
Me.ComboBox2.List(j, 0) = d & " " & d.Offset(0, 1)
Me.ComboBox2.List(j, 1) = d.Row
j = j + 1
Next d
Pourriez-vous me dire d'ou viens le problème?
Merci d'avance pour votre aide.
Bonjour le forum 🙂,
Je ne sais pas si ça t'aidera, mais 2 remarques :
Tu analyses toute la plage A:K alors que d'après le remplissage de ton combobox, la colonne A devrait suffire.
Tu fait des comparaisons de dates, or suivant le format, tu peux avoir des surprises (les heures comprises par exemple)... Essaie peut-être
Code:
If ([B][COLOR=red]CDate[/COLOR][/B](Cellule.Value = CDate(UserForm1.DTPicker1.Value)) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
ou pour être sûr de ton test, certe un peu plus lourd mais fiable, tu peux comparer Day, Month et Year.
Bonne journée 😎
Re tout le monde,
en cherchant un peu effectivement le format du dtpicker est dd/mm/yy hh:mm:ss, alors que le format date de ma colonne A est dd/mm/yyy.
J'ai changé le CustomFormat dans les propriétés du dtpicker en dd/mm/yyyy, mais cela ne change rien. Pour m'en rendre compte j'ai modifié mon msgbox comme ceci:
Code:
MsgBox "Aucun éléments trouvés pour la date du!" & " " & UserForm1.DTPicker1.Value & Chr(10) & "concernant" & " " & UserForm1.ComboBox2.Value, vbInformation: Exit Sub
Dans celui-ci cela me renvoi toujours la date et l'heure.
Je ne me rappel plus comment imbriqué (forcer) le format date avec dtpicker1.value!
C'est simple je sais mais là j'ai un bug du cerveau lol.
Edit: j'ai réussis à mettre le format du dtpicker en dd/mm/yyyy, cela par le biais de l'initialize, en mettant DtPicker1.value= Date, alors que j'avais mis Now!!
alors après ananlyse de ton fichier ton format date en colonne A était jj/mm/yy hh:mm:ss, il suffisait de le constater dans la barre de formule,donc logique que cela ne trouve pas de concordance (quel âne ce cheval!). En ayant biensût également mis le format dtpicker1.value= Date.
Maintenant que tu as rétablit cette erreur, ça marche tout seul!!!!😀
Tiens voilà que je me parle tout seul!!!!!
Bon je me met mon code ici, si jamais j'ai d'autres questions à me poser 😛😎🙄😀
Code:
Sub recherche()
Dim Plage As Range, Cellule As Range
Dim wsbd As Worksheet
Set wsbd = Sheets("Pointage")
Set Plage = wsbd.Range("A2:D" & wsbd.Range("A65536").End(xlUp).Row)
For Each Cellule In Plage
If ((Cellule.Value = CDate(Format(UserForm1.DTPicker1, "dd/mm/yyyy"))) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
With UserForm1
.ComboBox1.Value = Cellule.Offset(0, 2).Value
.ComboBox7.Value = Cellule.Offset(0, 4).Value
.ComboBox3.Value = Cellule.Offset(0, 5).Value
.ComboBox4.Value = Cellule.Offset(0, 6).Value
.ComboBox5.Value = Cellule.Offset(0, 7).Value
.ComboBox6.Value = Cellule.Offset(0, 8).Value
.ComboBox8.Value = Cellule.Offset(0, 9).Value
.TextBox1.Value = Cellule.Offset(0, 10).Value
End With
If Not ((Cellule.Value = CDate(Format(UserForm1.DTPicker1, "dd/mm/yyyy"))) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
MsgBox "Aucun éléments trouvés pour la date du" & " " & UserForm1.DTPicker1.Value & Chr(10) & "concernant" & " " & UserForm1.ComboBox2.Value, vbInformation: Exit Sub
End If
End If
Next Cellule
End Sub
Soyons sérieux, merci GIBI et JNP, vous étiez sur la bonne piste, alors que je cherchais l'erreur ailleurs! Bon wek-end.
pour ce qui est du format, à l'initialisation de l'usf, remplace
Code:
DTPicker1.Value = Now
par
Code:
DTPicker1.Value = Date
Autre soucis, dans cette boucle:
Code:
For Each Cellule In Plage
If (CDate(Cellule.Value = CDate(UserForm1.DTPicker1.Value)) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
With UserForm1
.ComboBox1.Value = Cellule.Offset(0, 2).Value
.ComboBox7.Value = Cellule.Offset(0, 4).Value
.ComboBox3.Value = Cellule.Offset(0, 5).Value
.ComboBox4.Value = Cellule.Offset(0, 6).Value
.ComboBox5.Value = Cellule.Offset(0, 7).Value
.ComboBox6.Value = Cellule.Offset(0, 8).Value
.ComboBox8.Value = Cellule.Offset(0, 9).Value
.TextBox1.Value = Cellule.Offset(0, 10).Value
End With
Else: MsgBox "Aucun éléments trouvés pour cette période!", vbInformation: Exit Sub
End If
Next Cellule
tu demandes à en sortir dès que l'information n'est pas trouvé, ce qui fait que la plage ne sera jamais analysée en totalité.
Par contre, quand la condition est remplie, là il faut quitter la boucle. J'ai également ajouter une variable booléenne lorsque la recherche n'aboutis pas. En bleu les modifications/ajouts afin (je l'espère) que tu comprennes.
Code:
Sub recherche()
Dim Plage As Range, Cellule As Range
Dim wsbd As Worksheet[B][COLOR=Blue], Trouve As Boolean[/COLOR][/B]
Set wsbd = Sheets("Pointage")
Set Plage = wsbd.Range("A2:[B][COLOR=Blue]A[/COLOR][/B]" & wsbd.Range("A65536").End(xlUp).Row)
[B][COLOR=Blue] Trouve = False[/COLOR][/B]
For Each Cellule In Plage
If (CDate(Cellule.Value = CDate(UserForm1.DTPicker1.Value)) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
With UserForm1
.ComboBox1.Value = Cellule.Offset(0, 2).Value
.ComboBox7.Value = Cellule.Offset(0, 4).Value
.ComboBox3.Value = Cellule.Offset(0, 5).Value
.ComboBox4.Value = Cellule.Offset(0, 6).Value
.ComboBox5.Value = Cellule.Offset(0, 7).Value
.ComboBox6.Value = Cellule.Offset(0, 8).Value
.ComboBox8.Value = Cellule.Offset(0, 9).Value
.TextBox1.Value = Cellule.Offset(0, 10).Value
End With
[B][COLOR=Blue] Trouve = True
Exit For[/COLOR][/B]
End If
Next Cellule
[COLOR=Blue][B] If Not Trouve Then MsgBox "Aucun éléments trouvés pour cette période!", vbInformation[/B][/COLOR]
End Sub
Edit: j'oubliai: Tu n'as pas besoin de faire la recherche dans toutes le colonnes, la colonne A suffit:
Code:
Set Plage = wsbd.Range("A2:A" & wsbd.Range("A65536").End(xlUp).Row)
Bonjour Skoobi,
Heureux de te croiser sur mon fil.
Tu as bien raison, je m'en étais rendut compte. J'avais contourner le problème avec cette méthode:
Code:
For Each Cellule In Plage
If ((Cellule.Value = CDate(Format(UserForm1.DTPicker1, "dd/mm/yyyy"))) And (Cellule.Offset(0, 3).Value = UserForm1.ComboBox2.Value)) Then
With UserForm1
.ComboBox1.Value = Cellule.Offset(0, 2).Value
.ComboBox7.Value = Cellule.Offset(0, 4).Value
.ComboBox3.Value = Cellule.Offset(0, 5).Value
.ComboBox4.Value = Cellule.Offset(0, 6).Value
.ComboBox5.Value = Cellule.Offset(0, 7).Value
.ComboBox6.Value = Cellule.Offset(0, 8).Value
.ComboBox8.Value = Cellule.Offset(0, 9).Value
.TextBox1.Value = Cellule.Offset(0, 10).Value
End With
Cellule.Select 'ceci pour coder mon bouton modifier
Exit Sub
End If
Next Cellule
For Each Cellule In Selection
If ((Cellule.Value <> CDate(Format(UserForm1.DTPicker1, "dd/mm/yyyy"))) And (Cellule.Offset(0, 3).Value <> UserForm1.ComboBox2.Value)) Then MsgBox "Aucun éléments trouvés pour la date du" & " " & UserForm1.DTPicker1.Value & Chr(10) & "concernant" & " " & UserForm1.ComboBox2.Value, vbInformation: Exit For: Exit Sub
Next Cellule
Mais ta méthode est bien plus propre, je vais donc m'en servir de ce pas!!!😛
Merci, preuve que l'on apprende tous les jours.
Autre casse tête, dans mon USF j'ai la frame1 avec plusieurs checkbox correspondant au jour de la semaine L= Lundin M=Mardi, etc...
J'ai réussit à cocher automatiquement le bon chekbox en fonction du jour 'avec weekday dans un textbox comme référence).
Egalement un checkbox L->V qui coche de L à V, et L->D qui coche L à D.
Jusque là pas de problème.
Ce que je souhaite c'est de pouvoir créer autant de lignes que de checkbox cochez.
Je m'explique aujourd'hui nous sommes Samedi donc checkbox S est coché.
Je coche en plus checkbox V donc dans avec mon bouton valider je voudrais un ligne
avec en col A la valeur DTPicker1.value -1, colB la valeur "Vendredi", puis le reste des valeur de mes contrôles
ligne suivante col A la valeur Dtpicker1.value, colB la valeur "Samedi", puis le reste des valeurs de mes contrôles.
Donc dans le même raisonnement si j'utilise checkbox L->V cela me coche 5 checkbox, donc 5 lignes, checkbox L->D cela me coche 7 checkbox, donc 7 lignes.
J'avoue je n'ai encore rien codé, j'en suis encore à me triturer le cerveau avec la méthode à utiliser.😕
Count, Array (car le count n'est jamais le même, si aujourd'hui Samedi et je coche "L", comment récupérer DtPicker1.value -6, etc....) c'est donc une variable qui change en fonction du jour ou l'on saisie.
Je ne sais pas si je suis clair ou obscure. Si c'est simple je me suicide avec une feuille excel!!😀
Sympa merci!
Je pense avoir saisie le besoin à condition que les dates seront toujours créées en fonction de la semaine en cours.
Ex: si jour actuel = Samedi et si Lundi coché cela va créée la date J-5 et non J+2.
En bleu mes ajouts/modifs comme d'hab:
Code:
Private Sub CommandButton1_Click()
[B][COLOR=Blue] Dim MaDate As Date
For i = 1 To 7
If Me.Controls("checkbox" & i).Value Then
MaDate = DTPicker1.Value + i - Weekday(DTPicker1, vbMonday)[/COLOR][/B]
With Sheets("Pointage")
Nl = .Range("A65536").End(xlUp).Row + 1 'Dans quelle ligne je vais écrire
.Range("A" & Nl).Value = [COLOR=Blue][B]MaDate[/B][/COLOR] 'Date
.Range("C" & Nl).Value = ComboBox1.Value 'Chef d'atelier
.Range("D" & Nl).Value = ComboBox2.Value 'Opérateur
.Range("E" & Nl).Value = ComboBox7.Value 'Ligne
.Range("F" & Nl).Value = ComboBox3.Value 'Tâches
.Range("G" & Nl).Value = ComboBox4.Value 'Heures
.Range("H" & Nl).Value = ComboBox5.Value 'Absences
.Range("I" & Nl).Value = ComboBox6.Value 'Heures
.Range("J" & Nl).Value = ComboBox8.Value 'Prime
.Range("K" & Nl).Value = TextBox1.Value 'Commentaires
End With
[COLOR=Blue][B] End If
Next[/B][/COLOR]
If Not TextBox1.Value = "" Then
a = MsgBox("Voulez-vous une alerte pour cet évènement?", vbYesNo)
If a = 7 Then Exit Sub
If a = 6 Then
Alerte
End If
End If
For i = 1 To 8
Me.Controls("Combobox" & i).Value = ""
Next i
For j = 1 To 9
Me.Controls("CheckBox" & j).Value = False
Next j
TextBox1.Value = ""
End Sub
Si c'est simple je me suicide avec une feuille excel!!😀
Je profite que tu sois encore connecté pour intervenir.
Je n'ai pas encore testé ton code, mais à la lecture, si je comprend bien, mon commandbuton1 va appliquer madate en fonction de mon chexkbox, pour cela ok c'est pas mal je pensais à quelque chose du genre.
La où cela se complique est si je garde samedi coché + lundi, est-ce que cela va me créer 2 lignes distinct en un clic, malgré ma référence cellule + N1? Une pour lundi, l'autre pour samedi?
Edit: Arfffffff, ça marchhhhhhhe. C'était avec une simple boucle for!🙁😱🙄
J'en étais sûr, mais cela me parraissait trop simple pour fonctionner, j'étais partie avec si checkbox1 coché, faire une boucle sur label1, etc..... Une usine à gaz en somme.
File moi ta feuille excel que je me trucide😛😉😀
A chercher le compliquer, on passe à côté du simple, suis humain quoi!! lol
Me suffit de remplir la colB avec la formule suivante:
pour la peine j'ai franchit le pas et suis devenus supporter! 😉
Vala c'est fait. Surtout plus pratique pour poster des fichiers.
Edit: pour ceux que cela interresse je met mon fichier sur le fil.
Je vous ai laissé les images dans l'usf, à vous de mettre les vôtre, en vous inspirants du code dans l'initialize.
Pour éviter le 'Chef d'atelier tout en restant clair dans ton code :
-> sélectionner ton UserForm1
-> sélectionner ta ComboBox1 (un seul clic)
-> dans la fenêtre Propriétés, ligne (Name)
-> remplacer par exemple ComboBox1 par ComboBoxChefAtelier
Ce que je ne pourrais pas faire si chaque combos avait un nom spécifique 😉
Car dans certain cas je ne veus agir que sûr un certain nombre de combos et non tous (ex: combos 3 à 7).
Donc s'ils sont numérotés cela facilte les choses. A moins biensûr de finir chaque nom avec un numéro ex: cbxchefatelier1, delà récupérer le N° avec Right quelquechose.
Pour l'usf par contre tu as bien raison rien ne m'aurait empêché de le faire suis bête lol.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD