Planning de livraisons interactif avec demandes
Le plus simple avec les versions MAC 2016 et suivantes, est de consacrer une feuille comme formulaire en lieu et place d'USF. Ce qui peut aussi être moins compliqué.
Le formulaire reprend le principe fait par la macro "Soumettredemande" et le tableau présent sur la feuille "Demandes de livraisons" c'est bien cela?
Dans ce cas la solution avec la saisie des heures sous le format 7.5 pour 7:30 me semble correct
Le formulaire reprend le principe fait par la macro "Soumettredemande" et le tableau présent sur la feuille "Demandes de livraisons" c'est bien cela?
On resterait sur ce qui a été fait plutôt que d'utiliser une userform.
Si ok je revois le code pour partir avec un chiffre avec décimal dans l'inputbox. donc soit 7 ou 7.5
il faudra toutefois changer l'information au niveau de l'inputbox genre ceci ? -> InputBox("Entrez l'heure de début au format décimal :", "Heure début")
Oui c'est cela avec un exemple --> InputBox("Entrez l'heure de début au format décimal par ex 7.5 pour 7h30 :", "Heure début")
L'avantage que je voyais avec la solution de l'UserForm était que le problème de compatibilité des heures était réglé c'est-à-dire que l'utilisateur avait le choix entre des heures prédéfinies et ne pouvait donc pas indiquer des heures type 7:15
L'avantage que je voyais avec la solution de l'UserForm était que le problème de compatibilité des heures était réglé
Oui et non. Mettons qu'avec la liste dans une combo, cela évitait des erreurs dû au --> :
Essayez le code comme ceci
Sub SoumettreDemande()
Dim lig As Integer
Dim tablo(0 To 6)
Dim i As Byte
Dim ddate As String
tablo(0) = InputBox("Entrez le nom de l'entreprise demandeuse :", "Nom entreprise")
If tablo(0) = vbNullString Then Exit Sub
On Error Resume Next
ddate = InputBox("Entrez la date de livraison (jj/mm/aaaa) :", "Date Livraison", Format(Now(), "dd/mm/yyyy"))
If Not IsDate(ddate) Or Len(ddate) < 10 Then MsgBox "Les dates doivent être dans un format JJ/MM/AAAA", vbCritical, "Erreur format": Exit Sub
If ddate = vbNullString Then Exit Sub
tablo(1) = ddate
On Error GoTo 0
tablo(2) = InputBox("Entrez l'heure de début au format décimal (par ex 7.5 pour 7h30) :", "Heure début")
If tablo(2) = vbNullString Then Exit Sub
tablo(2) = Replace(tablo(2), ".", ",") 'remplacer point par virgule
tablo(3) = InputBox("Entrez l'heure de fin au format décimal par ex 8.5 pour 8h30 :", "Heure fin")
If tablo(3) = vbNullString Then Exit Sub
tablo(3) = Replace(tablo(3), ".", ",") 'remplacer point par virgule
If tablo(3) <= tablo(2) Then MsgBox "l'heure de fin ne peut être inférieur à l'heure de début", vbCritical, "Heure": Exit Sub
tablo(4) = InputBox("Entrez la description de la demande :", "Description")
If tablo(4) = vbNullString Then Exit Sub
tablo(5) = InputBox("Mode de déchargement (Autonome/Grue) :", "Déchargement")
If tablo(5) = vbNullString Then Exit Sub
tablo(6) = "En attente"
With Range("Tab_demande_livraison").ListObject
If .ListRows.Count = 0 Then
.ListRows.Add: lig = 1
Else: .ListRows.Add: lig = .ListRows.Count
End If
For i = 0 To UBound(tablo)
Select Case i
Case Is = 1
With .DataBodyRange
.Item(lig, i + 1) = CDate(tablo(i))
.Item(lig, i + 1).NumberFormat = "dd/mm/yyyy"
End With
Case 2, 3
With .DataBodyRange
.Item(lig, i + 1) = tablo(i) / 24
.Item(lig, i + 1).NumberFormat = "hh:mm"
End With
Case Else
.DataBodyRange.Item(lig, i + 1) = tablo(i)
End Select
Next i
End With
MsgBox "Demande soumise avec succès!", vbInformation, "Soumission"
End SubSi ok, on peut passer au planning hebdo mais là dites moi ce que vous voulez mettre comme info. Une couleur , un nom de client ?
Par problème des heures j'entendais le fait de sélectionner une heure du type hh:00 ou hh:30 et ne pas avoir d'autres fractions d'heures. Après j'imagine qu'il est possible d'ajouter un test pour vérifier que l'heure est bien comprise dans la bonne fourchette et qu'elle termine soit par 00 soit par 30
tablo(2) = Replace(tablo(2), ".", ",") 'remplacer point par virgule
Cette ligne du code permet de contourner le fait que sur Excel il faille mettre des virgules et pas des points pour les décimales?
Pour ce qui est du planning hebdo j'essaye d'afficher les livraisons validées dans les cellules correspondant à la bonne date et heure de début ainsi que sur la bonne durée (mon exemple évoqué hier ci-dessous pour une livraison programmée le 26/08/2024 entre 8h et 8h30) :
Dans les cellules j'aimerais afficher le nom du sous-traitant, la description de la demande et le mode de déchargement. Je pensais ensuite faire une mise en forme conditionnelle qui recherche s'il est écrit "Grue" ou "Autonome" dans la cellule. C'est là que j'ai vu que Power Query permettait de combiner dans une cellule des valeurs venant de plusieurs cellules différentes (même si j'imagine qu'il est possible de faire de même avec les macros)
J'espère que mon message est assez clair
Par problème des heures j'entendais le fait de sélectionner une heure du type hh:00 ou hh:30 et ne pas avoir d'autres fractions d'heures. Après j'imagine qu'il est possible d'ajouter un test pour vérifier que l'heure est bien comprise dans la bonne fourchette et qu'elle termine soit par 00 soit par 30
Ce n'est pas nécessaire puisque vous allez toujours utiliser le 5 (pour hh:30) ou rien derrière la virgule
Donc soit 7 pour 7:00 ou 7,5 pour 7:30
Cette ligne du code permet de contourner le fait que sur Excel il faille mettre des virgules et pas des points pour les décimales?
il faut que ce soit la virgule raison pour laquelle j'ai placé cette instruction pour le cas où vous auriez un pavé numérique qui utilise le point à la place
L'instruction enlèvera le point au profit de la virgule
Dans les cellules j'aimerais afficher le nom du sous-traitant, la description de la demande et le mode de déchargement.
Hum... cela fait beaucoup d'info cela .. mais on peut envisager de mettre déjà le nom du sous traitant et la grue ou autonome. Mais si vous utilisez une MFC mettre les deux infos et faire votre MFC ne va pas fonctionner puisque votre sous traitant va changer de nom...
Ou alors une autre solution est de mettre dans la cellule Grue ou Autonome et en commentaire de la cellule le nom du sous traitant. Là vous pourriez utiliser une MFC qui attribue la couleur suivant Grue ou Autonome
Ce n'est pas nécessaire puisque vous allez toujours utiliser le 5 (pour hh:30) ou rien derrière la virgule
Donc soit 7 pour 7:00 ou 7,5 pour 7:30
Si je tape "7.15" dans la cellule de demande le code se lance quand même et m'indique donc 07:09 au final qui correspond bien à 0.15*60
Hum... cela fait beaucoup d'info cela .. mais on peut envisager de mettre déjà le nom du sous traitant et la grue ou autonome. Mais si vous utilisez une MFC mettre les deux infos et faire votre MFC ne va pas fonctionner puisque votre sous traitant va changer de nom...
Ou alors une autre solution est de mettre dans la cellule Grue ou Autonome et en commentaire de la cellule le nom du sous traitant. Là vous pourriez utiliser une MFC qui attribue la couleur suivant Grue ou Autonome
Mon sous-traitant et la descritpion seraient susceptibles de changer de nom à chaque commande mais la cellule comprterait dans tous les cas le texte "Grue" ou "Autonome". En utilisant une MFC avec texte spécifique comme sur l'exemple ci-dessous cela fonctionnerait non?
Et en en faisant une autre pour le texte "Autonome"
Si je tape "7.15" dans la cellule de demande le code se lance quand même et m'indique donc 07:09 au final qui correspond bien à 0.15*60
Pourquoi allez-vous taper 7.15 si vous me dites que cela va par 1/2 heure ?
Je regarderai pour adapter le code pour éviter le cas autre que 0.5 mais cela va compliquer le code
Mon sous-traitant et la descritpion seraient susceptibles de changer de nom à chaque commande mais la cellule comprterait dans tous les cas le texte "Grue" ou "Autonome". En utilisant une MFC avec texte spécifique comme sur l'exemple ci-dessous cela fonctionnerait non?
Je pensais que la MFC était pour le planning et pas sur votre tableau en feuille demande. cela fonctionnerait oui. Mais pourquoi voulez-vous mettre une MFC là ?
Pourquoi allez-vous taper 7.15 si vous me dites que cela va par 1/2 heure ?
Je regarderai pour adapter le code pour éviter le cas autre que 0.5 mais cela va compliquer le code
J'anticipe le fait que que quelqu'un pourrait se tromper dans l'écriture des horaires. Cela serait une sorte de vérification
Je pensais que la MFC était pour le planning et pas sur votre tableau en feuille demande. cela fonctionnerait oui. Mais pourquoi voulez-vous mettre une MFC là ?
La MFC serait bien pour la feuille planning hebdo j'ai juste utilisé cela pour illustrer. J'ai recrée la MFC dans la feuile planning hebdo comme ceci :
re
J'anticipe le fait que que quelqu'un pourrait se tromper dans l'écriture des horaires. Cela serait une sorte de vérification
Ok; Dans le code Soumettredemande, juste en dessous de la ligne tablo(2) = Replace(tablo(2), ".", ","), rajoutez les lignes ci-dessous
If tablo(2) - Int(tablo(2)) <> 0 And tablo(2) - Int(tablo(2)) <> 0.5 Then 'verifier si choix heure ou demi-heure
MsgBox "Vous ne pouvez choisir que la demi-heure ou l'heure", vbCritical, "Choix heure"
Exit Sub
End IfUne fois fait, rajoutez la même chose plus bas juste après l'instruction If tablo(3) <= tablo(2) Then MsgBox...., mais en remplaçant tous les tablo(2) par Tablo(3)
La MFC serait bien pour la feuille planning hebdo j'ai juste utilisé cela pour illustrer. J'ai recrée la MFC dans la feuile planning hebdo comme ceci :
Pas de souci. Attention que vous devrez adapter la MFC en cas d'ajout des dates en ligne 1
Par contre en y repensant dans le code Soumettredemande, lorsque vous arrivez à l'inputbox pour ajouter Grue ou Autonome, que pensez-vous d'obliger l'utilisateur à choisie entre la lettre G et la lettre A ? Cela éviterait les erreurs d'orthographe.
Si G, le code ajouterait Grue et si A le code ajouterait Autonome
C'est parfait ça fonctionne merci
Pas de souci. Attention que vous devrez adapter la MFC en cas d'ajout des dates en ligne 1
Qu'entendez-vous par ajout des dates en ligne 1?
Par contre en y repensant dans le code Soumettredemande, lorsque vous arrivez à l'inputbox pour ajouter Grue ou Autonome, que pensez-vous d'obliger l'utilisateur à choisie entre la lettre G et la lettre A ? Cela éviterait les erreurs d'orthographe.
Si G, le code ajouterait Grue et si A le code ajouterait Autonome
Vous avez raison je vais essayer d'ajouter ceci au code
Bonjour,
J'ai modifié la demande de mode de déchargement afin que l'utilisateur ait seulement besoin d'indiquer "A" ou "G", cependant en faisant mes tests j'ai découvert un souci sur les heures de début et de fin pour un cas en particulier : lorsque je choisis 9 en heure de début et 10 en heure de fin le message d'erreur s'affiche
Je vous ajoute par ailleurs mon fichier actuel avec les macros modifiées
Bonjour
J'ai modifié la demande de mode de déchargement afin que l'utilisateur ait seulement besoin d'indiquer "A" ou "G",
Hum.. non. Dans le code que je vous avais proposé, remplacez ces 2 lignes
tablo(5) = InputBox("Mode de déchargement (Autonome/Grue) :", "Déchargement")
If tablo(5) = vbNullString Then Exit Subpar ceci
tablo(5) = InputBox("Mode de déchargement (Autonome/Grue) :", "Déchargement")
Select Case tablo(5)
Case "A": tablo(5) = "AUTONOME"
Case "G": tablo(5) = "GRUE"
Case Else: MsgBox "Votre choix est incorrect !", vbCritical, "Choix déchargement": Exit Sub
End Selectcependant en faisant mes tests j'ai découvert un souci sur les heures de début et de fin pour un cas en particulier : lorsque je choisis 9 en heure de début et 10 en heure de fin le message d'erreur s'affiche
Oui, logique car c'est du texte qui sort de l'inputbox. Modifiez la ligne qui bugue par ceci
If Cdbl(tablo(3)) <= Cdbl(tablo(2)) Then MsgBox "l'heure de fin ne peut être inférieur à l'heure de début", vbCritical, "Heure": Exit SubRem : ne me replacez pas votre fichier.
Très bien merci,
j'ai apporté une petite modif à mon code pour passer la lettre en majuscule :
tablo(5) = InputBox("Mode de déchargement (Autonome/Grue) :", "Déchargement")
tablo(5) = UCase(Trim(tablo(5)))
Select Case tablo(5)
Case "A": tablo(5) = "AUTONOME"
Case "G": tablo(5) = "GRUE"
Case Else: MsgBox "Votre choix est incorrect !", vbCritical, "Choix déchargement": Exit Sub
End SelectHum.. non. Dans le code que je vous avais proposé, remplacez ces 2 lignes
Pour bien comprendre, pourquoi mon code précédent ne convenait pas pour cette manipulation?
Ok pour le code
Pourquoi l'instruction TRIM ? Vous avez peur d'un espace qui serait ajouté ?
Je ferais plutôt ceci à la place :
Select Case UCase(Left(tablo(5), 1))Là vous êtes certain de ne récupérer uniquement la première lettre (donc pas besoin de Trim)
Pour bien comprendre, pourquoi mon code précédent ne convenait pas pour cette manipulation
On évite d'utiliser une variable (donc on va au plus court) et les instructions Select case sont plus pratiques et surtout plus lisibles.
J'ai omis de répondre à votre question sur le planning
Pas de souci. Attention que vous devrez adapter la MFC en cas d'ajout des dates en ligne 1
Qu'entendez-vous par ajout des dates en ligne 1?
Que votre MFC devra être adaptée si vous ajoutez des dates en ligne 1. Maintenant mon commentaire ne sert à rien si la ligne 1 contient toutes les dates et que vous n'en ajoutez plus au fur et à mesure. Là mon commentaire était dédiée à ce que je voyais dans votre fichier
Pour le code Planning que je dois vous donner, je présume que le planning ne reprend les infos que vous avez validées en colonne G de la feuille Demandes de livraisons.
Merci pour vos précisions suite à mes questions je comprend mieux maintenant !
Que votre MFC devra être adaptée si vous ajoutez des dates en ligne 1. Maintenant mon commentaire ne sert à rien si la ligne 1 contient toutes les dates et que vous n'en ajoutez plus au fur et à mesure. Là mon commentaire était dédiée à ce que je voyais dans votre fichier
Je pense que dans un premier temps je mettrai ces dates à jour manuellement pour qu'elles correspondent aux 2 semaines suivantes mais du coup cela ne poserait pas de problème sur ma plage de données puisque la ligne des dates ne sont pas inclues dans la MFC.
Pour le code Planning que je dois vous donner, je présume que le planning ne reprend les infos que vous avez validées en colonne G de la feuille Demandes de livraisons.
C'est exactement cela, et que dans les cellules soient affichées le mode de déchargement, l'entreprise et la description
re
C'est exactement cela, et que dans les cellules soient affichées le mode de déchargement, l'entreprise et la description
Ok. Voici le code à mettre dans un module.
NB : vous n'êtes pas obligé de créer un module à chaque fois. D'ailleurs, dans votre cas je placerais les 3 codes (valider, soumettre et planning) dans un seul module.
Sub Planning()
Dim TS As ListObject
Dim cel As Range
Dim col As Integer
Dim lig As Byte, i As Byte
Set TS = Range("Tab_demande_livraison").ListObject
For Each cel In TS.ListColumns(2).DataBodyRange
With Feuil2
On Error Resume Next
col = .Rows(1).Find(cel.Value, LookIn:=xlValues).Column
If Err.Number > 0 Then MsgBox "Date du " & cel.Value & " inexistante dans le planning herbdomadaire !", vbCritical, "Date inconnue": Exit Sub
lig = WorksheetFunction.Match(cel.Offset(0, 1), .Columns(1), 0)
If lig > 0 Then
For i = lig To .Range("A" & Rows.Count).End(xlUp).Row
If .Range("A" & i).Text > cel.Offset(0, 2).Text Then Exit For
If TS.DataBodyRange.Item(cel.Row - TS.HeaderRowRange.Row, 7) = "Validée" Then
.Cells(i, col) = cel.Offset(0, 4).Value
End If
Next i
End If
End With
Next cel
End SubComme écrit précédemment je n'ai pas ajouté l'entreprise et la description. Vos cellules vont s'agrandir et cela peut ne pas être pratique je pense... votre avis ?
Sinon --> modifiez la ligne
.Cells(i, col) = cel.Offset(0, 4).Valuepar celle-ci
.Cells(i, col) = cel.Offset(0, 4).Value & "-" & cel.Offset(0, -1).Value & "-" & cel.Offset(0, 3).ValueMais à moins d'utiliser des formules dans la MFC, cette dernière ne fonctionnera pasEDIT : Bonne pratique. Pensez à ajouter l'instruction OPTION EXPLICIT dans tous les entêtes de vos modules. Cette instruction vous renverra une erreur si vous avez omis de déclarer une variable.
D'accord, merci pour votre réponse j'ai ajouté mes 3 codes dans le même module
Comme écrit précédemment je n'ai pas ajouté l'entreprise et la description. Vos cellules vont s'agrandir et cela peut ne pas être pratique je pense... votre avis ?
Sinon --> modifiez la ligne
Je pense que cela ne poserait pas de soucis. J'imagine qu'il est possible d'ajouter des retours à la ligne et d'uniformiser la largeur des colonnes pour tout le planning? J'avais essayé dans le module 2 quelque chose de similaire pour la largeur des colonnes mais pas pour le retour à la ligne, je vais me pencher sur cette solution.
EDIT : Bonne pratique. Pensez à ajouter l'instruction OPTION EXPLICIT dans tous les entêtes de vos modules. Cette instruction vous renverra une erreur si vous avez omis de déclarer une variable.
Quel est le fonctionnement de cette fonction? J'ai simplement besoin d'ajouter ce code en tête de mes modules comme ceci :
Option Explicit OnMais à moins d'utiliser des formules dans la MFC, cette dernière ne fonctionnera pas
J'ai fait la modification que vous évoquez et la MFC fonctionne toujours alors qu'elle n'a pas de formule, pouvez-vous m'expliquer votre remarque?
J'imagine qu'il est possible d'ajouter des retours à la ligne et d'uniformiser la largeur des colonnes pour tout le planning?
Les retours à la ligne ce n'est jamais bon du tout. Le mieux est de séparer par un - par exemple ou alors mieux encore vous formatez simplement les cellules en cochant l'option "renvoyer à la ligne automatiquement" dans le menu Alignement
EDIT : Bonne pratique. Pensez à ajouter l'instruction OPTION EXPLICIT dans tous les entêtes de vos modules. Cette instruction vous renverra une erreur si vous avez omis de déclarer une variable.
Quel est le fonctionnement de cette fonction? J'ai simplement besoin d'ajouter ce code en tête de mes modules comme ceci :
Je vous l'ai écrit dans l'Edit, Excel vous renverra un message si vous avez omis de déclarer une variable (Dim). si vous ne le mettez pas, Excel va considérer que toutes les variables sont en mode VARIANT. Ce qui est le plus mauvais choix
Attention dans votre message vous avez mis en ON après Option explicit....
J'ai fait la modification que vous évoquez et la MFC fonctionne toujours alors qu'elle n'a pas de formule, pouvez-vous m'expliquer votre remarque?
Heu non, mettez ceci dans une cellule --> "grue-toto-titi". a MFC ne fonctionnera pas
Si vous voulez qu'elle fonctionne utilisez cette formule pour Grue -> =SI(GAUCHE(B2;1)="G";1;) et ceci pour Autonome --> =SI(GAUCHE(B2;1)="A";1;)
Bien entendu cela sous entend que les mot Grue et Autonome sont les premiers indiqués dans la cellule
Les retours à la ligne ce n'est jamais bon du tout. Le mieux est de séparer par un - par exemple ou alors mieux encore vous formatez simplement les cellules en cochant l'option "renvoyer à la ligne automatiquement" dans le menu Alignement
Je me suis mal exprimé, c'est ce que j'imaginais, formater les largeurs des colonnes à une certaine valeur et faire un renvoi automatique à la ligne
Heu non, mettez ceci dans une cellule --> "grue-toto-titi". a MFC ne fonctionnera pas
Si vous voulez qu'elle fonctionne utilisez cette formule pour Grue -> =SI(GAUCHE(B2;1)="G";1;) et ceci pour Autonome --> =SI(GAUCHE(B2;1)="A";1;)
Bien entendu cela sous entend que les mot Grue et Autonome sont les premiers indiqués dans la cellule
Je ne comprend pas votre remarque, sur mon fichier cela fonctionne normalement et la mise en forme se fait toute seule :