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 Sub

Si 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) :

image

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?

image

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 :

image

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 If

Une 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

image

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 Sub

par 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 Select

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

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 Sub

Rem : 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 Select

Hum.. 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 Sub

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

.Cells(i, col) = cel.Offset(0, 4).Value

par celle-ci

.Cells(i, col) = cel.Offset(0, 4).Value & "-" & cel.Offset(0, -1).Value & "-" & cel.Offset(0, 3).Value
Mais à moins d'utiliser des formules dans la MFC, cette dernière ne fonctionnera pas

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.

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 On

Mais à 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 :

image
Rechercher des sujets similaires à "planning livraisons interactif demandes"