Formulaire-VBA avec condition
Bonjour,
Je suis nouvelle sur ce forum et je sèche quelque peu. Je suis en contrat pro et je dois aujourd'hui développer une sorte de tableau de bord pour le suivi de chauffeur.
J'ai donc un fichier excel (ci-joint) ou est saisie par un formulaire les horaires effectué et celles ci sont alors reporté dans un onglet.
Je souhaite que ces informations soit reportées dans l'onglet "2019" en respectant bien entendu le nom du chauffeur.
PS: si il est possible de faire un cumul à la semaine et au mois sur l'onglet "Reporting_SM2019" ça serait vraiment fantastique.
J'espère avoir été clair dans mes explications, je ne vois vraiment pas comment faire sans VBA.
Bonjour,
La personne qui a fait ce fichier avait l'air de ne pas trop être mal partie, mais bon, elle exporte les dates et les heures comme du texte, c'est dommage... Du coup ça génère un premier problème, je l'ai corrigé à ma sauce dans le programme d'export de ton formulaire.
La base de données est déclarée dans le gestionnaire de nom comme un tableau, avec une mise en forme par défaut des colonnes dates et heures.
Dans la feuille de planning, j'ai utilisé une fonction SOMME.SI.ENS pour ramener l'heure de départ d'un chauffeur en particulier suivant la date du jour.
Je te laisse regarder tout ça:
Tu trouveras des cours de VBA et d'Excel sur ce site
Bonjour,
Merci pour cette réponse rapide!
C'est moi qui ai créé ce fichier en piochant à droite à gauche donc merci.
Merci beaucoup pour la formule, j'étais persuadée que cela nécessitait une maccro.
J'ai un petit soucis cependant je vous ai fait une capture d'écran. Les données récoltées par le formulaire se colle de façon décalées.
J'ai tenté d'analyser le code mais je ne vois pas de modification par rapport à mon test.
Pourriez vous m'aiguiller?
Bonjour,
Oui je peux t'aiguiller, le soucis est simple mais il faut y penser, regardons ces 4 lignes:
Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = Format(Me.TextBox1, "dd/mm/yyyy")
Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = Me.ComboBox1
Range("C" & Rows.Count).End(xlUp).Offset(1, 0) = Format(Me.TextBox2, "hh:mm")
Range("D" & Rows.Count).End(xlUp).Offset(1, 0) = Format(Me.TextBox3, "hh:mm")Le premier soucis que je vois, c'est que tu as un calcul redondant, tu recalcules à chaque affectation de valeur la dernière ligne remplie du tableau,et c'est aussi ce qui te fait ce bug.
Quand on déclare un tableau dans le gestionnaire de noms, que la dernière ligne du tableau soit remplie ou non, ton code s'arrêtera à cette ligne, en clair, tu vas écrires sur une nouvelle ligne du tableau dans la colonne A, ce qui aura pour effet de redimensionner le tableau en lui ajoutant une ligne, la ligne suivante va donc s'arrêter à cette dernière ligne, et écrire sur la suivante (ligne 3), puis la suivante en ligne 4, et ainsi de suite.
Ce qu'il convient de faire ici, c'est de calculer en une fois la ligne de fin du tableau, en colonne A par exemple, et vérifier si la cellule est vide (si on écrit dessus ou non), ce qui donnera :
der_lig = Range("A" & Rows.Count).End(xlUp).row
if range("a" & der_lig) <> "" then
der_lig = der_lig+1
end if
Range("A" & der_lig)= Format(Me.TextBox1, "dd/mm/yyyy")
Range("B" & der_lig)= Me.ComboBox1
Range("C" & der_lig) = Format(Me.TextBox2, "hh:mm")
Range("D" & der_lig)= Format(Me.TextBox3, "hh:mm")d'ailleurs tu peux enlever le Me devant les noms des contrôles (si tu n'as pas écris Option Explicit quelque part), comme tu écris ce code dans le formulaire, il comprendra directement que tu parles des contrôles de ce formulaire, c'est pareil que quand tu écris juste Range() sans préciser la feuille, ça prend la feuille active.
Au fait, j'ai vu que tu déclarais une variable objet de type Control, et tu fais une boucle sur des contrôles:
For Each Ctrl In Saisies1.Controls
NextD'ailleurs tu peux remplacer Saisies1 par Me.
Si tu ne comptes pas te servir de cette boucle, tu devrais enlever la déclaration de variable et cette boucle
Au passage, tu commences à exporter ta date, puis tu arrêtes l'export si la liste n'a pas de valeur valide, je ne suis pas trop d'accord avec ce genre de procédure:
If Me.ComboBox1.ListIndex = -1 Then Exit SubEventuellement, tu devrais vérifier si tous tes contrôles sont remplis, et gérer la validité de la valeur de la liste ailleurs que dans le programme d'export, mais c'est toi qui vois, je te mets simplement en garde, tu vas te retrouver avec des lignes qui ne contiennent que des dates dans ta base de données, les bases de données à trou, ce n'est pas génial...
Au passage, la saisie de tes heures semble déconner un peu, je n'ai pas réussi à écrire 20:00 dans la deuxième boite de saisie par exemple, et quand j'essaye d'écrire 12:12 en tapant 1212 ça donne : 12:2.
Je te transmets le fichier avec les corrections citées plus haut:
Ps: j'ai désactivé Option.Explicit en passant cette ligne en commentaire, car je déteste avoir à tout déclarer et préciser
Bonjour,
Et merci pour ces détails. mais je suis encore bloquée quand je retourne sur mon fichier d'origine j'ai de nouveau le décalage.
J'ai copié le code que vous m'avez laissé dans le fichier.
Pourriez vous m'aider à nouveau?
Private Sub commandButton1_Click()
If Me.ComboBox1 = "" Then
MsgBox "saisir identité chauffeur"
Me.ComboBox1.SetFocus
Exit Sub
End If
' Valider
Dim Ctrl As Control
' Stockage Date
der_lig = Range("A" & Rows.Count).End(xlUp).Row
If Range("a" & der_lig) <> "" Then
der_lig = der_lig + 1
End If
Range("A" & der_lig) = Format(Me.TextBox1, "dd/mm/yyyy")
Range("B" & der_lig) = Me.ComboBox1
Range("C" & der_lig) = Format(Me.TextBox2, "hh:mm")
Range("D" & der_lig) = Format(Me.TextBox3, "hh:mm")
MsgBox " Information validée, merci."
For Each Ctrl In Saisies1.Controls
Next
Unload Me
Saisies1.Show
End SubJ'ai également essayé avec ce code.
Bonjour,
je peux aider à nouveau, mais pas sur la seule base du code, il me manque le fichier comme information très importante par exemple.
Oui voici le fichier, jai juste des heures à insérer dans la feuille "Etat".
Merci encore
Re,
J'ai déplacé ce que tu avais saisis et supprimé la ligne pour n'avoir plus qu'une ligne vide dans le tableau, puis j'ai mis mon ancien code pour faire la saisie, et ça fonctionne bien, attention à ne garder qu'une seule ligne vide dans ton tableau au départ, sinon si tu as la ligne 2 qui est vide, et la ligne 3, que toutes deux sont des lignes du tableau, le programme écrira sur la ligne 3, car le programme ne va pas vérifier que la ligne 2 est remplie.
Je te transmets le résultat de mon test:
Merci beaucoup je clos donc le sujet.
Cordialement,