XL 2019 Aide pour monter un fichier

My<3

XLDnaute Junior
Bonjour a vous tous les pros du Excel,

je me demandais s'il y avait quelqu'un parmi vous qui voudrais m'aider a mettre mes idées plus clair. 🤯
Je voudrais monter un fichier ou je contrôle les transports mais j'ai du mal a mettre en place mes idées.

Dans ce fichier, je contrôle le numéro, le nom du projet, la division, le poids, la date de départ, la date de livraison a la destination, le lieux de départ ainsi que le lieux de livraison, le nom du transporteur et d'autres variables.

Je me demande si c'est possible de faire une boite de dialogue dans laquelle j'entre des variables partielles et qu'après connaitre les autres variables j'entre a nouveau dans la boite de dialogue et que ces données s'ajoute a la ligne correspondante.

Bref, j'ai plein d'idée mais je ne sais pas trop par ou commencer si quelqu'un a envie de m'aider ca serait bien gentil:)
 
Solution
Bonsoir à toutes & à tous, bonsoir Mylaine ( @My<3 )

J'ai travaillé sur ton projet, dans ce que je te joins tout n'est pas débogué, je compte sur toi pour détecter les éventuels problèmes. (Je pars en vacances une semaine donc tu as un peu de temps devant toi.).
J'ai commenté le code et j'ai utilisé un nommage explicite pour favoriser sa compréhension

Il te faudra bien renseigner les tables pour faire les autres tests.
Le remplissage des tables Projets, Transporteurs, et Contacts est assisté par des macros qu'on lance via un double clic sur les données.

Cette première étape réalisée (même partiellement) tu pourras tester le formulaire de l'onglet Suivi.
Là aussi, les modifications sont assistées par une macro lancée via un...

vgendron

XLDnaute Barbatruc
Bonjour
déjà.. avant de penser à des formulaires ou autre boites de dialogue, il faut commentcer par définir ton fichier
avec par exemple
1) une feuille "Liste" dans laquelle tu listes
- Les transporteurs connus
- les lieux de livraison
- les lieux de départ
- des noms de projets

etc etc. bref un maximum de listes qui permettront de choisir les éléments à saisir

2) une feuille "BaseDeDonnées" un tableau dans lequel figureront toutes les données
- en colonnes (sur la ligne 1) les entetes
- chaque nouvelle saisie sera mise sur une nouvelle ligne..

une fois que tu aura défini ca, poste ton fichier (pour l'exemple; prend garde de ne pas mettre de données confidentielles, telles que numéro de téléphone)
 

Deadpool_CC

XLDnaute Accro
Bonjour,

pour compléter ce que dit @vgendron ... en gros dans ta feuille "Base de données", identifie les colonnes ou tu va avoir des informations qui peuvent se répéter et que tu peux connaitre à l'avance (nom des transporteurs, Catégorie Produit transporté, ...).

Et ces données tu en fait des listes de référence.
elles ne sont pas figée : tu pourras ajouter des nouvelles valeurs dans le temps.

Quand t'aura posté un premier fichier avec quelques données de test (non réelle) dans les listes. on verra en fonction du besoin comment t'orienter / t'aider pour simplifier les saisies, automatiser les contrôles, ...

Ps : il se peut que tu ait besoin de plus d'une base de données si jamais tu gère des chose différentes, même si des données sont communes
(ex : des devis et des commandes ... sont bien séparés mais peuvent se référencer mutuellement et contenir des données communes.) mais pour définir cela, il faut juste réfléchir un peu ou alors nous exposer plus clairement ce que ton fichier est censé assurer comme tache.

ps2 : SI jamais tu as des données par ailleurs qui te servent de "source" pour que tu fasse ton travail de controle, faudra aussi nous en fournir un exemple (données de test non réelle bien évidemment) pour voir si nécessaire de faire une intergartion automatique.

A+
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour à toutes & à tous, bonjour @My<3 , @vgendron ,@Deadpool_CC

Bon ce que j'ai fait est moins pédagogique, mais voilà un exemple avec une une BdD (Suivi) des tables (les listes) et un formulaire qui permet de créer et de modifier des enregistrements ...

Tu peux t'en inspirer pour ton projet en prenant en compte les conseil de @vgendron et @Deadpool_CC .

Amicalement
Alain
 

Pièces jointes

  • Aide pour monter un fichier.xlsm
    35.3 KB · Affichages: 11

My<3

XLDnaute Junior
Bonsoir @My<3
Pourrais tu dire si les réponses founies
Post#2, #3, #4 te conviennent et si tu as avancé sur ton projet.
Amicalement
Alain
Bonjour a vous tous @vgendron, @AtTheOne & @Deadpool_CC pour vos réponses! Je suis en train de mettre un peut d'ordre selon vos suggestions lorsque mon fichier sera avancé selon vos proposition je reviens assurément ici pour votre soutien :)
 

My<3

XLDnaute Junior
Bonjour Alain (@AtTheOne) ,
j'ai eu un peu de temps ce matin pour avancé mon projet je vous le mets ci joint.
J'ai ajouter des colonnes (il y a une colonne que je ne suis pas capable d'ajouter dans le tableau de suivi)

Je me pose quelques questions:

- Comment je fais pour updater la boite de dialogue?

- Est-ce possible lorsque la destination est a notre usine, ajouter 4 colonnes (Fournisseur, Valeur ($), N° Facture, Approuvé le)

- Est-ce possible que lorsque la destination est aux USA, ajouter 5 colonnes en plus des 4 premières colonnes (PAPS, Nbs de mcx, Valeur du chargement, Code HTS, Valeur($)/mcx)

- Est-ce possible lorsqu'une ligne est approuvée en entier(transport, dédouanage et fournisseur si requis), elle se transfert dans un fichier base de donné et pour libérer de l'espace au maximum dans mon fichier que j'utilise en tout temps, mais conservé une trace? :rolleyes:

- Est-ce possible lorsque je modifie une date de transport un mail soit envoyer aux personnes concernées (transporteur, gérant de projet, collègue)?

🤯Pour l'instant, j'ai le cerveau qui bouillonne avec ces réflexions, si vous êtes en mesure de m'aider a nouveau !

A oui aussi j'aimerais que le dit document sois partageable (qu'il sois possible que moi et mes collègues travaillons dedans simultanément)

Merci, Merci, Merci
 

Pièces jointes

  • Aide pour monter un fichier.xlsm
    140.9 KB · Affichages: 6
Dernière édition:

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour à toutes & à tous, bonjour @My<3
J'ai ajouter des colonnes (il y a une colonne que je ne suis pas capable d'ajouter dans le tableau de suivi)
Si c'est à gauche du tableau (ta colonne suffixe, que je te conseille cependant de la placer à droite de la colonne N°) : Selectionne une cellule de la première colonne du table, clic droit, insérer : colonnes à gauche du tableau
Si c'est à droite du tableau, tape le titre de ta nouvelle colonne juste à droite du titre de ta dernière colonne, le tableau s'étendra.
A l'intérieur du tableau, selectionne une cellule de la colonne à droite de l'endroit ou tu veux insérer, clic droit, insérer : colonnes de tableau à gauche.


Question 1
- Comment je fais pour updater la boite de dialogue?
Tu appuies simultanément sur les touches ALT et F11 pour accéder à VBA
Tu sélectionnes le formulaire
1658665140045.png

Tu ajoutes, modifies supprimes des contrôles (boite à outil)
Tu modifies les propriétés, le code des contrôles
1658665154703.png

1658665552406.png

1658665600893.png

(Je te conseille de nommer les contrôles de façon explicite pour t'y retrouver plus facilement)

Question 2 & 3

- Est-ce possible lorsque la destination est a notre usine, ajouter 4 colonnes (Fournisseur, Valeur ($), N° Facture, Approuvé le)

- Est-ce possible que lorsque la destination est aux USA, ajouter 5 colonnes en plus des 4 premières colonnes (PAPS, Nbs de mcx, Valeur du chargement, Code HTS, Valeur($)/mcx)
Oui, il te suffit de créer toutes les colonnes dans ton tableau "tb_Suivi" et de ne renseigner ou afficher ces colonnes que si ton critère est rempli. Cela supposera du code sur le contrôle qui contiendra la destination pour déterminer s'il s'agit de l'usine ou des USA.
Une liste des destinations devra sans doute être ajouter (avec destination et adresse, pays) pour retrouver tes critères.
Il faudra remplacer la TextBox "TBx_Destination" par une ComboBox qui permet de choisir parmi une liste. (voir par exemple la ComboBox "CBx_Projet")

Question 4
- Est-ce possible lorsqu'une ligne est approuvée en entier(transport, dédouanage et fournisseur si requis), elle se transfert dans un fichier base de donné et pour libérer de l'espace au maximum dans mon fichier que j'utilise en tout temps, mais conservé une trace?
Oui, par exemple en prévoyant un bouton Archiver qui provoque l'enregistrement dans une feuille "Archivage" ou dans un classeur "Archivage" des données de cette ligne, puis la suppression de la ligne de ton tableau de suivi.

Question 5
- Est-ce possible lorsque je modifie une date de transport un mail soit envoyer aux personnes concernées (transporteur, gérant de projet, collègue)?
Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).

J'ai repris ton exemple avec les données que tu as fournies et j'ai commenté le code.
Au cours de ton projet, tu vas sans doute déplacer, ajouter, supprimer des colonnes, pour simplifier la maintenance des macros je te conseille de placer le N° des colonnes de ton tableau dans des constantes comme ci-dessous. Ainsi en cas de modifications des N° tu n'auras qu'à modifier les valeurs dans ce module ...
Module Constantes :
Enrichi (BBcode):
Public Const Col_N° As Integer = 1
Public Const Col_Suffixe As Integer = 2
Public Const Col_Projet As Integer = 3
Public Const Col_Division As Integer = 4
Public Const Col_Poids As Integer = 5
Public Const Col_Destination As Integer = 6
Public Const Col_Transporteur As Integer = 7
Public Const Col_Equipement_requis As Integer = 8
Public Const Col_Parti_le As Integer = 9
Public Const Col_Arrivé_le As Integer = 10
Public Const Col_N°_BOL_ou_PO As Integer = 11
Public Const Col_Remorque As Integer = 12
Public Const Col_Valeur As Integer = 13
Public Const Col_N°_Facture As Integer = 14
Public Const Col_Approuvé_le As Integer = 15

Voici le reste du code:
Module Mdl_AtTheOne :
Enrichi (BBcode):
'Dim Dc As Scripting.Dictionary
Public DcN° As Object, Tb
Sub Afficher()
    'Set Dc = New Scripting.Dictionary
    Set DcN° = CreateObject("Scripting.Dictionary")
    DcN°.CompareMode = vbTextCompare
    DcN°.RemoveAll
    With UsF_Transport
        .Show
    End With
    Unload UsF_Transport

End Sub

Code du Formulaire UsF_Transport :
Enrichi (BBcode):
Dim Auto As Boolean, TbRés()

Private Sub UserForm_Initialize()
    'Lecture des données du tableau de suivi
    Tb = Sh_Suivi.[Tb_Suivi]
    'Nbre de lignes du tableau
    NbL = UBound(Tb)
    Auto = True
    'Cas du tableau vide
    If Tb(1, 1) = "" And NbL = 1 Then
        With Me
            .CkB_Nouveau = True
            .CkB_Nouveau.Enabled = False
            .CBx_N° = Format(1, "00000")
            .CBx_N°.Enabled = False
        End With
    Else
    'Cas du tableau contenant déjà des données
        ReDim TbN°(1 To NbL)
        For i = 1 To UBound(Tb)
            'Dictionnaire des N° de transport (N° de transport, Index de la ligne)
            DcN°(Format(Tb(i, Col_N°), "00000")) = i
        Next
        With Me
            'initialisation de la ComboBox Liste des N°
            .CBx_N°.List = DcN°.Keys
            'Initialiation de la case à cocher Nouveau Transport
            .CkB_Nouveau = False
            .CkB_Nouveau.Enabled = True
        End With
        'Affiche la dernière ligne du tableau
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False

End Sub

Private Sub CBn_Enregistrer_Click()
    'Lire tous les champs du formulaire (résultats dans TbRés)
    LireUsF
    
    With Me
        If .CkB_Nouveau Then
            'Nouveau N° coché ...
            If TbRés(1, Col_Projet) = "" Or TbRés(1, Col_Division) = "" Then MsgBox "Renseigner au moins Projet et Division !": Exit Sub
            'Ajoute une ligne au tableau de suivi si il y a déjà des lignes renseignées
            If Not Evaluate("AND(ISBLANK(tb_Suivi))") Then Sh_Suivi.ListObjects("Tb_Suivi").ListRows.Add
            'Remplit la dernière ligne (vide) du tableau de suivi
            With Sh_Suivi.[Tb_Suivi]
                .Rows(.Rows.Count).Value = TbRés
                Tb = .Value
            End With
            'Ajoute une clef au dictionnaire
            DcN°(Format(TbRés(1, Col_N°), "00000")) = UBound(Tb, 1)
            Auto = True
            'Réactive les contrôles du formulaire (désactivé par le choix nouveau transport)
            .CkB_Nouveau.Enabled = True
            .CBx_N°.Enabled = True
            .CkB_Nouveau = False
            'Actualise la liste du choix des N°
            .CBx_N°.List = DcN°.Keys
            Auto = False
        Else
            'Enregistre les modifications effectuées (si N° sélectionné)
            If TbRés(1, Col_N°) = "" Then MsgBox "Pas de N° séléctionné !": Exit Sub
            Sh_Suivi.[Tb_Suivi].Rows(DcN°(.CBx_N°.Text)) = TbRés
            Tb = Sh_Suivi.[Tb_Suivi]
        End If
    End With
        
End Sub

Private Sub CBn_Annuler_Click()
    Me.Hide
End Sub

Private Sub CBx_N°_Change()
    If Auto Then Exit Sub
    Auto = True
    'Affiche le N° choisi (index via le dictionnaire DCN°)
    AfficheNum (CLng(DcN°(Me.CBx_N°.Text)))
    Auto = False
End Sub

Private Sub CkB_Nouveau_Click()
    If Auto Then Exit Sub
    Auto = True
    If Me.CkB_Nouveau Then
        'Cas d'un nouveau N°
        'Vide le formulaire des anciennes valeurs
        EffacerUsF
        'Trouve le nouveau N° de transport
        With WorksheetFunction
            N° = .Max(.Index(Sh_Suivi.[Tb_Suivi], 0, 1)) + 1
        End With
        'Affiche et verrouille le nouveau N°
        Me.CBx_N° = Format(N°, "00000")
        Me.CBx_N°.Enabled = False
    Else
        'Cas du décochage de la case Nouveau transport
        'Active le choix du N° et affiche le dernier enregistrement
        Me.CBx_N°.Enabled = True
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False
End Sub

Sub AfficheNum(Idx As Long)
'Affiche de la ligne repérée par son index dans le tableau vb "Tb" (données du tableau structuré tb_Suivi)
  
    With Me
        .CBx_N°.Text = Format(Tb(Idx, Col_N°), "00000")
        .CBx_Suffixe = Tb(Idx, Col_Suffixe)
        .CBx_Projet = Tb(Idx, Col_Projet)
        .CBx_Division = Tb(Idx, Col_Division)
        .TBx_Poids = Tb(Idx, Col_Poids)
        .TBx_Destination = Tb(Idx, Col_Destination)
        .CBx_Transporteur = Tb(Idx, Col_Transporteur)
        .CBx_Equipement_requis = Tb(Idx, Col_Equipement_requis)
        .TBx_Départ = IIf(IsEmpty(Tb(Idx, Col_Parti_le)), "", Format(Tb(Idx, Col_Parti_le), "dd/mm/yyyy"))
        .TBx_Arrivée = IIf(IsEmpty(Tb(Idx, Col_Arrivé_le)), "", Format(Tb(Idx, Col_Arrivé_le), "dd/mm/yyyy"))
        .TBx_N°_BOL_ou_PO = Tb(Idx, Col_N°_BOL_ou_PO)
        .TBx_Remorque = Tb(Idx, Col_Remorque)
        .TBx_Valeur = Tb(Idx, Col_Valeur)
        .TBx_N°_Facture = Tb(Idx, Col_N°_Facture)
        .TBx_Approuvé_le = Tb(Idx, Col_Approuvé_le)
    End With
End Sub

Sub EffacerUsF()
'Vide les champs modifiables du formulaire
    With Me
        .CBx_N°.Text = ""
        .CBx_Suffixe = ""
        .CBx_Projet = ""
        .CBx_Division = ""
        .TBx_Poids = ""
        .TBx_Destination = ""
        .CBx_Transporteur = ""
        .CBx_Equipement_requis = ""
        .TBx_Départ = ""
        .TBx_Arrivée = ""
        .TBx_N°_BOL_ou_PO = ""
        .TBx_Remorque = ""
        .TBx_Valeur = ""
        .TBx_N°_Facture = ""
        .TBx_Approuvé_le = ""
    End With
End Sub

Sub LireUsF()
'Lit les champs du formulaire et place le résultat dans le tableau vb "TbRés"
    ReDim TbRés(1 To 1, 1 To UBound(Tb, 2))
    With Me
        TbRés(1, Col_N°) = CLng(.CBx_N°)
        TbRés(1, Col_Suffixe) = .CBx_Suffixe
        TbRés(1, Col_Projet) = .CBx_Projet
        TbRés(1, Col_Division) = .CBx_Division
        If .TBx_Poids <> "" Then TbRés(1, Col_Poids) = CDbl(Replace(Replace(.TBx_Poids, ".", ","), ",", Application.DecimalSeparator))
        TbRés(1, Col_Destination) = .TBx_Destination
        TbRés(1, Col_Transporteur) = .CBx_Transporteur
        TbRés(1, Col_Equipement_requis) = .CBx_Equipement_requis
        If .TBx_Départ <> "" Then TbRés(1, Col_Parti_le) = CDate(.TBx_Départ)
        If .TBx_Arrivée <> "" Then TbRés(1, Col_Arrivé_le) = CDate(.TBx_Arrivée)
        TbRés(1, Col_N°_BOL_ou_PO) = .TBx_N°_BOL_ou_PO
        TbRés(1, Col_Remorque) = .TBx_Remorque
        TbRés(1, Col_Valeur) = .TBx_Valeur
        TbRés(1, Col_N°_Facture) = .TBx_N°_Facture
        TbRés(1, Col_Approuvé_le) = .TBx_Approuvé_le
    End With
End Sub

Bon courage, Amicalement
Alain
 

Pièces jointes

  • Aide pour monter un fichier 3.xlsm
    134.9 KB · Affichages: 6

My<3

XLDnaute Junior
Bonjour à toutes & à tous, bonjour @My<3

Si c'est à gauche du tableau (ta colonne suffixe, que je te conseille cependant de la placer à droite de la colonne N°) : Selectionne une cellule de la première colonne du table, clic droit, insérer : colonnes à gauche du tableau
Si c'est à droite du tableau, tape le titre de ta nouvelle colonne juste à droite du titre de ta dernière colonne, le tableau s'étendra.
A l'intérieur du tableau, selectionne une cellule de la colonne à droite de l'endroit ou tu veux insérer, clic droit, insérer : colonnes de tableau à gauche.


Question 1

Tu appuies simultanément sur les touches ALT et F11 pour accéder à VBA
Tu sélectionnes le formulaire
Regarde la pièce jointe 1145915
Tu ajoutes, modifies supprimes des contrôles (boite à outil)
Tu modifies les propriétés, le code des contrôles
Regarde la pièce jointe 1145916
Regarde la pièce jointe 1145918
Regarde la pièce jointe 1145919
(Je te conseille de nommer les contrôles de façon explicite pour t'y retrouver plus facilement)

Question 2 & 3


Oui, il te suffit de créer toutes les colonnes dans ton tableau "tb_Suivi" et de ne renseigner ou afficher ces colonnes que si ton critère est rempli. Cela supposera du code sur le contrôle qui contiendra la destination pour déterminer s'il s'agit de l'usine ou des USA.
Une liste des destinations devra sans doute être ajouter (avec destination et adresse, pays) pour retrouver tes critères.
Il faudra remplacer la TextBox "TBx_Destination" par une ComboBox qui permet de choisir parmi une liste. (voir par exemple la ComboBox "CBx_Projet")

Question 4

Oui, par exemple en prévoyant un bouton Archiver qui provoque l'enregistrement dans une feuille "Archivage" ou dans un classeur "Archivage" des données de cette ligne, puis la suppression de la ligne de ton tableau de suivi.

Question 5

Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).

J'ai repris ton exemple avec les données que tu as fournies et j'ai commenté le code.
Au cours de ton projet, tu vas sans doute déplacer, ajouter, supprimer des colonnes, pour simplifier la maintenance des macros je te conseille de placer le N° des colonnes de ton tableau dans des constantes comme ci-dessous. Ainsi en cas de modifications des N° tu n'auras qu'à modifier les valeurs dans ce module ...
Module Constantes :
Enrichi (BBcode):
Public Const Col_N° As Integer = 1
Public Const Col_Suffixe As Integer = 2
Public Const Col_Projet As Integer = 3
Public Const Col_Division As Integer = 4
Public Const Col_Poids As Integer = 5
Public Const Col_Destination As Integer = 6
Public Const Col_Transporteur As Integer = 7
Public Const Col_Equipement_requis As Integer = 8
Public Const Col_Parti_le As Integer = 9
Public Const Col_Arrivé_le As Integer = 10
Public Const Col_N°_BOL_ou_PO As Integer = 11
Public Const Col_Remorque As Integer = 12
Public Const Col_Valeur As Integer = 13
Public Const Col_N°_Facture As Integer = 14
Public Const Col_Approuvé_le As Integer = 15

Voici le reste du code:
Module Mdl_AtTheOne :
Enrichi (BBcode):
'Dim Dc As Scripting.Dictionary
Public DcN° As Object, Tb
Sub Afficher()
    'Set Dc = New Scripting.Dictionary
    Set DcN° = CreateObject("Scripting.Dictionary")
    DcN°.CompareMode = vbTextCompare
    DcN°.RemoveAll
    With UsF_Transport
        .Show
    End With
    Unload UsF_Transport

End Sub

Code du Formulaire UsF_Transport :
Enrichi (BBcode):
Dim Auto As Boolean, TbRés()

Private Sub UserForm_Initialize()
    'Lecture des données du tableau de suivi
    Tb = Sh_Suivi.[Tb_Suivi]
    'Nbre de lignes du tableau
    NbL = UBound(Tb)
    Auto = True
    'Cas du tableau vide
    If Tb(1, 1) = "" And NbL = 1 Then
        With Me
            .CkB_Nouveau = True
            .CkB_Nouveau.Enabled = False
            .CBx_N° = Format(1, "00000")
            .CBx_N°.Enabled = False
        End With
    Else
    'Cas du tableau contenant déjà des données
        ReDim TbN°(1 To NbL)
        For i = 1 To UBound(Tb)
            'Dictionnaire des N° de transport (N° de transport, Index de la ligne)
            DcN°(Format(Tb(i, Col_N°), "00000")) = i
        Next
        With Me
            'initialisation de la ComboBox Liste des N°
            .CBx_N°.List = DcN°.Keys
            'Initialiation de la case à cocher Nouveau Transport
            .CkB_Nouveau = False
            .CkB_Nouveau.Enabled = True
        End With
        'Affiche la dernière ligne du tableau
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False

End Sub

Private Sub CBn_Enregistrer_Click()
    'Lire tous les champs du formulaire (résultats dans TbRés)
    LireUsF
   
    With Me
        If .CkB_Nouveau Then
            'Nouveau N° coché ...
            If TbRés(1, Col_Projet) = "" Or TbRés(1, Col_Division) = "" Then MsgBox "Renseigner au moins Projet et Division !": Exit Sub
            'Ajoute une ligne au tableau de suivi si il y a déjà des lignes renseignées
            If Not Evaluate("AND(ISBLANK(tb_Suivi))") Then Sh_Suivi.ListObjects("Tb_Suivi").ListRows.Add
            'Remplit la dernière ligne (vide) du tableau de suivi
            With Sh_Suivi.[Tb_Suivi]
                .Rows(.Rows.Count).Value = TbRés
                Tb = .Value
            End With
            'Ajoute une clef au dictionnaire
            DcN°(Format(TbRés(1, Col_N°), "00000")) = UBound(Tb, 1)
            Auto = True
            'Réactive les contrôles du formulaire (désactivé par le choix nouveau transport)
            .CkB_Nouveau.Enabled = True
            .CBx_N°.Enabled = True
            .CkB_Nouveau = False
            'Actualise la liste du choix des N°
            .CBx_N°.List = DcN°.Keys
            Auto = False
        Else
            'Enregistre les modifications effectuées (si N° sélectionné)
            If TbRés(1, Col_N°) = "" Then MsgBox "Pas de N° séléctionné !": Exit Sub
            Sh_Suivi.[Tb_Suivi].Rows(DcN°(.CBx_N°.Text)) = TbRés
            Tb = Sh_Suivi.[Tb_Suivi]
        End If
    End With
       
End Sub

Private Sub CBn_Annuler_Click()
    Me.Hide
End Sub

Private Sub CBx_N°_Change()
    If Auto Then Exit Sub
    Auto = True
    'Affiche le N° choisi (index via le dictionnaire DCN°)
    AfficheNum (CLng(DcN°(Me.CBx_N°.Text)))
    Auto = False
End Sub

Private Sub CkB_Nouveau_Click()
    If Auto Then Exit Sub
    Auto = True
    If Me.CkB_Nouveau Then
        'Cas d'un nouveau N°
        'Vide le formulaire des anciennes valeurs
        EffacerUsF
        'Trouve le nouveau N° de transport
        With WorksheetFunction
            N° = .Max(.Index(Sh_Suivi.[Tb_Suivi], 0, 1)) + 1
        End With
        'Affiche et verrouille le nouveau N°
        Me.CBx_N° = Format(N°, "00000")
        Me.CBx_N°.Enabled = False
    Else
        'Cas du décochage de la case Nouveau transport
        'Active le choix du N° et affiche le dernier enregistrement
        Me.CBx_N°.Enabled = True
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False
End Sub

Sub AfficheNum(Idx As Long)
'Affiche de la ligne repérée par son index dans le tableau vb "Tb" (données du tableau structuré tb_Suivi)
 
    With Me
        .CBx_N°.Text = Format(Tb(Idx, Col_N°), "00000")
        .CBx_Suffixe = Tb(Idx, Col_Suffixe)
        .CBx_Projet = Tb(Idx, Col_Projet)
        .CBx_Division = Tb(Idx, Col_Division)
        .TBx_Poids = Tb(Idx, Col_Poids)
        .TBx_Destination = Tb(Idx, Col_Destination)
        .CBx_Transporteur = Tb(Idx, Col_Transporteur)
        .CBx_Equipement_requis = Tb(Idx, Col_Equipement_requis)
        .TBx_Départ = IIf(IsEmpty(Tb(Idx, Col_Parti_le)), "", Format(Tb(Idx, Col_Parti_le), "dd/mm/yyyy"))
        .TBx_Arrivée = IIf(IsEmpty(Tb(Idx, Col_Arrivé_le)), "", Format(Tb(Idx, Col_Arrivé_le), "dd/mm/yyyy"))
        .TBx_N°_BOL_ou_PO = Tb(Idx, Col_N°_BOL_ou_PO)
        .TBx_Remorque = Tb(Idx, Col_Remorque)
        .TBx_Valeur = Tb(Idx, Col_Valeur)
        .TBx_N°_Facture = Tb(Idx, Col_N°_Facture)
        .TBx_Approuvé_le = Tb(Idx, Col_Approuvé_le)
    End With
End Sub

Sub EffacerUsF()
'Vide les champs modifiables du formulaire
    With Me
        .CBx_N°.Text = ""
        .CBx_Suffixe = ""
        .CBx_Projet = ""
        .CBx_Division = ""
        .TBx_Poids = ""
        .TBx_Destination = ""
        .CBx_Transporteur = ""
        .CBx_Equipement_requis = ""
        .TBx_Départ = ""
        .TBx_Arrivée = ""
        .TBx_N°_BOL_ou_PO = ""
        .TBx_Remorque = ""
        .TBx_Valeur = ""
        .TBx_N°_Facture = ""
        .TBx_Approuvé_le = ""
    End With
End Sub

Sub LireUsF()
'Lit les champs du formulaire et place le résultat dans le tableau vb "TbRés"
    ReDim TbRés(1 To 1, 1 To UBound(Tb, 2))
    With Me
        TbRés(1, Col_N°) = CLng(.CBx_N°)
        TbRés(1, Col_Suffixe) = .CBx_Suffixe
        TbRés(1, Col_Projet) = .CBx_Projet
        TbRés(1, Col_Division) = .CBx_Division
        If .TBx_Poids <> "" Then TbRés(1, Col_Poids) = CDbl(Replace(Replace(.TBx_Poids, ".", ","), ",", Application.DecimalSeparator))
        TbRés(1, Col_Destination) = .TBx_Destination
        TbRés(1, Col_Transporteur) = .CBx_Transporteur
        TbRés(1, Col_Equipement_requis) = .CBx_Equipement_requis
        If .TBx_Départ <> "" Then TbRés(1, Col_Parti_le) = CDate(.TBx_Départ)
        If .TBx_Arrivée <> "" Then TbRés(1, Col_Arrivé_le) = CDate(.TBx_Arrivée)
        TbRés(1, Col_N°_BOL_ou_PO) = .TBx_N°_BOL_ou_PO
        TbRés(1, Col_Remorque) = .TBx_Remorque
        TbRés(1, Col_Valeur) = .TBx_Valeur
        TbRés(1, Col_N°_Facture) = .TBx_N°_Facture
        TbRés(1, Col_Approuvé_le) = .TBx_Approuvé_le
    End With
End Sub

Bon courage, Amicalement
Alain
wow MERCI j'ai du pain sur la planche je te tiens au courant plus tard comment va mon projet !

Je te remercie infiniment de ton aide
 

My<3

XLDnaute Junior
Bonjour à toutes & à tous, bonjour @My<3

Si c'est à gauche du tableau (ta colonne suffixe, que je te conseille cependant de la placer à droite de la colonne N°) : Selectionne une cellule de la première colonne du table, clic droit, insérer : colonnes à gauche du tableau
Si c'est à droite du tableau, tape le titre de ta nouvelle colonne juste à droite du titre de ta dernière colonne, le tableau s'étendra.
A l'intérieur du tableau, selectionne une cellule de la colonne à droite de l'endroit ou tu veux insérer, clic droit, insérer : colonnes de tableau à gauche.


Question 1

Tu appuies simultanément sur les touches ALT et F11 pour accéder à VBA
Tu sélectionnes le formulaire
Regarde la pièce jointe 1145915
Tu ajoutes, modifies supprimes des contrôles (boite à outil)
Tu modifies les propriétés, le code des contrôles
Regarde la pièce jointe 1145916
Regarde la pièce jointe 1145918
Regarde la pièce jointe 1145919
(Je te conseille de nommer les contrôles de façon explicite pour t'y retrouver plus facilement)

Question 2 & 3


Oui, il te suffit de créer toutes les colonnes dans ton tableau "tb_Suivi" et de ne renseigner ou afficher ces colonnes que si ton critère est rempli. Cela supposera du code sur le contrôle qui contiendra la destination pour déterminer s'il s'agit de l'usine ou des USA.
Une liste des destinations devra sans doute être ajouter (avec destination et adresse, pays) pour retrouver tes critères.
Il faudra remplacer la TextBox "TBx_Destination" par une ComboBox qui permet de choisir parmi une liste. (voir par exemple la ComboBox "CBx_Projet")

Question 4

Oui, par exemple en prévoyant un bouton Archiver qui provoque l'enregistrement dans une feuille "Archivage" ou dans un classeur "Archivage" des données de cette ligne, puis la suppression de la ligne de ton tableau de suivi.

Question 5

Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).

J'ai repris ton exemple avec les données que tu as fournies et j'ai commenté le code.
Au cours de ton projet, tu vas sans doute déplacer, ajouter, supprimer des colonnes, pour simplifier la maintenance des macros je te conseille de placer le N° des colonnes de ton tableau dans des constantes comme ci-dessous. Ainsi en cas de modifications des N° tu n'auras qu'à modifier les valeurs dans ce module ...
Module Constantes :
Enrichi (BBcode):
Public Const Col_N° As Integer = 1
Public Const Col_Suffixe As Integer = 2
Public Const Col_Projet As Integer = 3
Public Const Col_Division As Integer = 4
Public Const Col_Poids As Integer = 5
Public Const Col_Destination As Integer = 6
Public Const Col_Transporteur As Integer = 7
Public Const Col_Equipement_requis As Integer = 8
Public Const Col_Parti_le As Integer = 9
Public Const Col_Arrivé_le As Integer = 10
Public Const Col_N°_BOL_ou_PO As Integer = 11
Public Const Col_Remorque As Integer = 12
Public Const Col_Valeur As Integer = 13
Public Const Col_N°_Facture As Integer = 14
Public Const Col_Approuvé_le As Integer = 15

Voici le reste du code:
Module Mdl_AtTheOne :
Enrichi (BBcode):
'Dim Dc As Scripting.Dictionary
Public DcN° As Object, Tb
Sub Afficher()
    'Set Dc = New Scripting.Dictionary
    Set DcN° = CreateObject("Scripting.Dictionary")
    DcN°.CompareMode = vbTextCompare
    DcN°.RemoveAll
    With UsF_Transport
        .Show
    End With
    Unload UsF_Transport

End Sub

Code du Formulaire UsF_Transport :
Enrichi (BBcode):
Dim Auto As Boolean, TbRés()

Private Sub UserForm_Initialize()
    'Lecture des données du tableau de suivi
    Tb = Sh_Suivi.[Tb_Suivi]
    'Nbre de lignes du tableau
    NbL = UBound(Tb)
    Auto = True
    'Cas du tableau vide
    If Tb(1, 1) = "" And NbL = 1 Then
        With Me
            .CkB_Nouveau = True
            .CkB_Nouveau.Enabled = False
            .CBx_N° = Format(1, "00000")
            .CBx_N°.Enabled = False
        End With
    Else
    'Cas du tableau contenant déjà des données
        ReDim TbN°(1 To NbL)
        For i = 1 To UBound(Tb)
            'Dictionnaire des N° de transport (N° de transport, Index de la ligne)
            DcN°(Format(Tb(i, Col_N°), "00000")) = i
        Next
        With Me
            'initialisation de la ComboBox Liste des N°
            .CBx_N°.List = DcN°.Keys
            'Initialiation de la case à cocher Nouveau Transport
            .CkB_Nouveau = False
            .CkB_Nouveau.Enabled = True
        End With
        'Affiche la dernière ligne du tableau
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False

End Sub

Private Sub CBn_Enregistrer_Click()
    'Lire tous les champs du formulaire (résultats dans TbRés)
    LireUsF
 
    With Me
        If .CkB_Nouveau Then
            'Nouveau N° coché ...
            If TbRés(1, Col_Projet) = "" Or TbRés(1, Col_Division) = "" Then MsgBox "Renseigner au moins Projet et Division !": Exit Sub
            'Ajoute une ligne au tableau de suivi si il y a déjà des lignes renseignées
            If Not Evaluate("AND(ISBLANK(tb_Suivi))") Then Sh_Suivi.ListObjects("Tb_Suivi").ListRows.Add
            'Remplit la dernière ligne (vide) du tableau de suivi
            With Sh_Suivi.[Tb_Suivi]
                .Rows(.Rows.Count).Value = TbRés
                Tb = .Value
            End With
            'Ajoute une clef au dictionnaire
            DcN°(Format(TbRés(1, Col_N°), "00000")) = UBound(Tb, 1)
            Auto = True
            'Réactive les contrôles du formulaire (désactivé par le choix nouveau transport)
            .CkB_Nouveau.Enabled = True
            .CBx_N°.Enabled = True
            .CkB_Nouveau = False
            'Actualise la liste du choix des N°
            .CBx_N°.List = DcN°.Keys
            Auto = False
        Else
            'Enregistre les modifications effectuées (si N° sélectionné)
            If TbRés(1, Col_N°) = "" Then MsgBox "Pas de N° séléctionné !": Exit Sub
            Sh_Suivi.[Tb_Suivi].Rows(DcN°(.CBx_N°.Text)) = TbRés
            Tb = Sh_Suivi.[Tb_Suivi]
        End If
    End With
    
End Sub

Private Sub CBn_Annuler_Click()
    Me.Hide
End Sub

Private Sub CBx_N°_Change()
    If Auto Then Exit Sub
    Auto = True
    'Affiche le N° choisi (index via le dictionnaire DCN°)
    AfficheNum (CLng(DcN°(Me.CBx_N°.Text)))
    Auto = False
End Sub

Private Sub CkB_Nouveau_Click()
    If Auto Then Exit Sub
    Auto = True
    If Me.CkB_Nouveau Then
        'Cas d'un nouveau N°
        'Vide le formulaire des anciennes valeurs
        EffacerUsF
        'Trouve le nouveau N° de transport
        With WorksheetFunction
            N° = .Max(.Index(Sh_Suivi.[Tb_Suivi], 0, 1)) + 1
        End With
        'Affiche et verrouille le nouveau N°
        Me.CBx_N° = Format(N°, "00000")
        Me.CBx_N°.Enabled = False
    Else
        'Cas du décochage de la case Nouveau transport
        'Active le choix du N° et affiche le dernier enregistrement
        Me.CBx_N°.Enabled = True
        AfficheNum (UBound(Tb, 1))
    End If
    Auto = False
End Sub

Sub AfficheNum(Idx As Long)
'Affiche de la ligne repérée par son index dans le tableau vb "Tb" (données du tableau structuré tb_Suivi)
 
    With Me
        .CBx_N°.Text = Format(Tb(Idx, Col_N°), "00000")
        .CBx_Suffixe = Tb(Idx, Col_Suffixe)
        .CBx_Projet = Tb(Idx, Col_Projet)
        .CBx_Division = Tb(Idx, Col_Division)
        .TBx_Poids = Tb(Idx, Col_Poids)
        .TBx_Destination = Tb(Idx, Col_Destination)
        .CBx_Transporteur = Tb(Idx, Col_Transporteur)
        .CBx_Equipement_requis = Tb(Idx, Col_Equipement_requis)
        .TBx_Départ = IIf(IsEmpty(Tb(Idx, Col_Parti_le)), "", Format(Tb(Idx, Col_Parti_le), "dd/mm/yyyy"))
        .TBx_Arrivée = IIf(IsEmpty(Tb(Idx, Col_Arrivé_le)), "", Format(Tb(Idx, Col_Arrivé_le), "dd/mm/yyyy"))
        .TBx_N°_BOL_ou_PO = Tb(Idx, Col_N°_BOL_ou_PO)
        .TBx_Remorque = Tb(Idx, Col_Remorque)
        .TBx_Valeur = Tb(Idx, Col_Valeur)
        .TBx_N°_Facture = Tb(Idx, Col_N°_Facture)
        .TBx_Approuvé_le = Tb(Idx, Col_Approuvé_le)
    End With
End Sub

Sub EffacerUsF()
'Vide les champs modifiables du formulaire
    With Me
        .CBx_N°.Text = ""
        .CBx_Suffixe = ""
        .CBx_Projet = ""
        .CBx_Division = ""
        .TBx_Poids = ""
        .TBx_Destination = ""
        .CBx_Transporteur = ""
        .CBx_Equipement_requis = ""
        .TBx_Départ = ""
        .TBx_Arrivée = ""
        .TBx_N°_BOL_ou_PO = ""
        .TBx_Remorque = ""
        .TBx_Valeur = ""
        .TBx_N°_Facture = ""
        .TBx_Approuvé_le = ""
    End With
End Sub

Sub LireUsF()
'Lit les champs du formulaire et place le résultat dans le tableau vb "TbRés"
    ReDim TbRés(1 To 1, 1 To UBound(Tb, 2))
    With Me
        TbRés(1, Col_N°) = CLng(.CBx_N°)
        TbRés(1, Col_Suffixe) = .CBx_Suffixe
        TbRés(1, Col_Projet) = .CBx_Projet
        TbRés(1, Col_Division) = .CBx_Division
        If .TBx_Poids <> "" Then TbRés(1, Col_Poids) = CDbl(Replace(Replace(.TBx_Poids, ".", ","), ",", Application.DecimalSeparator))
        TbRés(1, Col_Destination) = .TBx_Destination
        TbRés(1, Col_Transporteur) = .CBx_Transporteur
        TbRés(1, Col_Equipement_requis) = .CBx_Equipement_requis
        If .TBx_Départ <> "" Then TbRés(1, Col_Parti_le) = CDate(.TBx_Départ)
        If .TBx_Arrivée <> "" Then TbRés(1, Col_Arrivé_le) = CDate(.TBx_Arrivée)
        TbRés(1, Col_N°_BOL_ou_PO) = .TBx_N°_BOL_ou_PO
        TbRés(1, Col_Remorque) = .TBx_Remorque
        TbRés(1, Col_Valeur) = .TBx_Valeur
        TbRés(1, Col_N°_Facture) = .TBx_N°_Facture
        TbRés(1, Col_Approuvé_le) = .TBx_Approuvé_le
    End With
End Sub

Bon courage, Amicalement
Alain

Bonjour à toutes & à tous, bonjour @My<3

Si c'est à gauche du tableau (ta colonne suffixe, que je te conseille cependant de la placer à droite de la colonne N°) : Selectionne une cellule de la première colonne du table, clic droit, insérer : colonnes à gauche du tableau
Si c'est à droite du tableau, tape le titre de ta nouvelle colonne juste à droite du titre de ta dernière colonne, le tableau s'étendra.
A l'intérieur du tableau, selectionne une cellule de la colonne à droite de l'endroit ou tu veux insérer, clic droit, insérer : colonnes de tableau à gauche.

Question 1
Tu appuies simultanément sur les touches ALT et F11 pour accéder à VBA
Tu sélectionnes le formulaire

Tu ajoutes, modifies supprimes des contrôles (boite à outil)
Tu modifies les propriétés, le code des contrôles

Question 2 & 3
Oui, il te suffit de créer toutes les colonnes dans ton tableau "tb_Suivi" et de ne renseigner ou afficher ces colonnes que si ton critère est rempli. Cela supposera du code sur le contrôle qui contiendra la destination pour déterminer s'il s'agit de l'usine ou des USA.
Une liste des destinations devra sans doute être ajouter (avec destination et adresse, pays) pour retrouver tes critères.
Il faudra remplacer la TextBox "TBx_Destination" par une ComboBox qui permet de choisir parmi une liste. (voir par exemple la ComboBox "CBx_Projet")

Question 4
Oui, par exemple en prévoyant un bouton Archiver qui provoque l'enregistrement dans une feuille "Archivage" ou dans un classeur "Archivage" des données de cette ligne, puis la suppression de la ligne de ton tableau de suivi.

Question 5
Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).

Bon courage, Amicalement
Alain
Coucou Alain (@AtTheOne ) encore moi avec mon projet

Question 1, 2 & 3 Bien compris ;)

Question 4
Oui, par exemple en prévoyant un bouton Archiver qui provoque l'enregistrement dans une feuille "Archivage" ou dans un classeur "Archivage" des données de cette ligne, puis la suppression de la ligne de ton tableau de suivi.
Est-ce possible que cette étape se fasse automatiquement par exemple: si la colonne "Fournisseur" est vide et une date d'approbation est inscrite dans la colonne "Approuvé le (aaaa-mm-jj)" cette ligne sois couper et coller dans un autre fichier ? Et que pour la ligne qui requiert 2 approbations sois couper/coller lorsque ces 2 colonnes sont marqué d'une date?

Question 5
Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).
Je comprends plus ou moins ce point pourrais-tu approfondir ce que tu veux dire ou me mettre un exemple? 🤯
Si pour un transporteur, j'ai 4 personnes a aviser en plus de 2 personnes fixe et 1 personne volatile (dépendamment du gérant de projet attitrer a celui-ci) ici a l'interne lors d'un changement de date d'arrivé comment fonctionnerais-tu?
Dans le mail je voudrais retrouver les informations des colonnes, 2,1, 3a12 & 16.
Ou bien un bouton update que je pourrais utiliser et qui mettrais tout le onde au parfum selon la compagne de transport? Je fais appel a ton génie en excel pour m'aider sur ce point


Question 6
Est-ce possible pour la destination que lorsque le suffixe est SST on ailles chercher l'adresse du chantier selon le numéro de projet, plutôt que l'inscrire plusieurs fois?

Question 7
Est-ce possible de protéger le classeur (les cellules que nous pouvons compléter a l'aide de la boite de dialogue) , le rendre partageable

Je te remercie plus que tout de ta gentillesse de bien vouloir m'aider dans mon projet
 

Pièces jointes

  • Archives_Logistique.xlsm
    148.2 KB · Affichages: 3
  • 3.LOGISTIQUE.xlsm
    161.7 KB · Affichages: 4
Dernière édition:

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour à toutes & à tous, bonjour @My<3

Pour te répondre, d'abord envisages-tu de faire toutes les interventions sur ta feuille "Suivi" via des formulaires ou penses-tu en réaliser directement dans le tableau ?

Est-ce possible que cette étape se fasse automatiquement par exemple: si la colonne "Fournisseur" est vide et une date d'approbation est inscrite dans la colonne "Approuvé le (aaaa-mm-jj)" cette ligne sois couper et coller dans un autre fichier ? Et que pour la ligne qui requiert 2 approbations sois couper/coller lorsque ces 2 colonnes sont marqué d'une date?
Oui, au moment où l'on renseigne la date d'approbation facture transport, ton code doit tester si le fournisseur n'est pas renseigné auquel cas tu archives la ligne.
Si un fournisseur est renseigné, tu dois faire cette vérification lorsque l'on renseigne chacune des 2 approbations (Approbation Transport : est-ce que approbation fournisseur est renseignée; Approbation Fournisseur : est-ce que approbation Transport est renseignée) si les deux sont renseignées alors ton code doit archiver la ligne.
Maintenant, est-ce que tu renseigneras ces dates directement dans ton tableau de suivi ? Si c'est le cas tu devras utiliser l'événement Worksheet_Change de la feuille "Suivi".
Sinon, si tu passes par le formulaire, ce sont les événements des TextBox concernées qu'il faudra programmer.
Essaie par toi même, si tu n'y arrives pas je te ferai un exemple.

Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).
Je comprends plus ou moins ce point pourrais-tu approfondir ce que tu veux dire ou me mettre un exemple?
Si pour un transporteur, j'ai 4 personnes a aviser en plus de 2 personnes fixe et 1 personne volatile (dépendamment du gérant de projet attitrer a celui-ci) ici a l'interne lors d'un changement de date d'arrivé comment fonctionnerais-tu?
Quatre personnes liées au transporteur (différentes suivant le transporteur) ? Deux personnes toujours les mêmes ? Une personne liée au projet ?
Je ne suis pas sûr de te comprendre, illustre ta demande d'un exemple.
Si tu as un contact lié au projet, ajoute une colonne dans ta table projets pour ces contacts avec un identifiant (par exemple id10, id25A ...),
Si tu as quatre contacts par transporteur ajoute une colonne dans ta table des transporteurs avec les 4 identifiants délimités par un séparateur (par exemple : id1|id2|id3|id4)
Ensuite crée toi une table avec "identifiant"→"nom"→"prénom"→"mél" : les lignes seraient du type
"Id1"→"EINSTEIN"→"Albert"→"albert.einstein@mc2.com"
Tu peux alors faire le lien entre les identifiants que tu as dans les tables Transporteurs et Projets avec cette table Identifiants pour trouver les adresses mél.
Les deux personnes fixes peuvent être aussi dans la table identifiants et dans une table "Systématique" que tu liras lors de l'envoi des méls.
De cette façon les identités et les méls ne sont renseignés qu'une seule fois dans une seule table (plus facile à corrigée) et tu peux mettre à jour facilement les autres tables en modifiant un ou plusieurs identifiants.
Prépare des tables avec des exemples, je t'aiderai si nécessaire après.
Dans le mail je voudrais retrouver les informations des colonnes, 2,1, 3a12 & 16
Il suffit de préparer le corps du message et l'objet en concaténant du texte et le contenu des cellules voulue (par exemple "Objet : projet " & A2
"bonjour" B2 & " " & C2. etc)
Prépare un exemple du texte à envoyer, on fera la macro d'envoi via OutLook à partir de ta préparation.

Est-ce possible pour la destination que lorsque le suffixe est SST on ailles chercher l'adresse du chantier selon le numéro de projet, plutôt que l'inscrire plusieurs fois?
Oui, mais comme pour les contacts il faut, dans la table projet, faire le lien avec le chantier par exemple
"Projet1"→"id5"→"Chantier20" et ensuite de lire l'adresse du Chantier20 dans ta table Chantier.

Pour faire les liens, des dictionnaires (Scripting.Dictionary), la WorksheetFunction.Match (fonction EQUIV) ou la WorksheetFunction.VLookUp (RECHERCHEV) peuvent faire l'affaire.

Est-ce possible de protéger le classeur (les cellules que nous pouvons compléter a l'aide de la boite de dialogue) , le rendre partageable
Protéger, oui.
Partager un classeur avec macro, pas avec les fonctionnalités intrinsèques d'EXCEL (du moins à ma connaissance).
J'ai réalisé des applications qui permettaient ce partage, [en utilisant un classeur (en lecture seule) pour l'interface utilisateur et un classeur base de données, et en gérant les accès à la base de données avec un fichier drapeau marquant l'occupation de la base. Le fichier interface lit la base, prépare les modifications, attends que la base soit libre (plus de drapeau occupée) , réserve l'écriture (pose du drapeau occupée) écrit les modifications, retire le drapeau occupée.] Mais c'est un peu lourd à mettre en place et engendre beaucoup d'ouverture-fermeture du fichier base de données.

Un dernier point quel est l'ordre de grandeur du nombre de Transports simultanément (hors Archives) ?

Bon je ne te joint pas aujourd'hui de fichier, je te laisse le faire évoluer un peu, et travailler sur les différents points abordés ci-dessus

Bon courage, amicalement
Alain
 
Dernière édition:

My<3

XLDnaute Junior
@AtTheOne
Pour te répondre, d'abord envisages-tu de faire toutes les interventions sur ta feuille "Suivi" via des formulaires ou penses-tu en réaliser directement dans le tableau ?
J'estime ajouter des informations directement dans le tableau aussi.

Oui, au moment où l'on renseigne la date d'approbation facture transport, ton code doit tester si le fournisseur n'est pas renseigné auquel cas tu archives la ligne.
Si un fournisseur est renseigné, tu dois faire cette vérification lorsque l'on renseigne chacune des 2 approbations (Approbation Transport : est-ce que approbation fournisseur est renseignée; Approbation Fournisseur : est-ce que approbation Transport est renseignée) si les deux sont renseignées alors ton code doit archiver la ligne.
Maintenant, est-ce que tu renseigneras ces dates directement dans ton tableau de suivi ? Si c'est le cas tu devras utiliser l'événement Worksheet_Change de la feuille "Suivi".
Sinon, si tu passes par le formulaire, ce sont les événements des TextBox concernées qu'il faudra programmer.
Je ne contrôle vraiment pas cette partie mais serait-il u bonne idée de mettre N/A dans la cellule fournisseur lorsqu'un appro n'est pas nécessaire?

My<3 à dit:
Oui, si les personnes concernées sont identifiées dans ton tableau de suivi (ou identifiables grâce à une information contenue dans ton tableau de suivi).
Je comprends plus ou moins ce point pourrais-tu approfondir ce que tu veux dire ou me mettre un exemple?
My<3 à dit:
Si pour un transporteur, j'ai 4 personnes a aviser en plus de 2 personnes fixe et 1 personne volatile (dépendamment du gérant de projet attitrer a celui-ci) ici a l'interne lors d'un changement de date d'arrivé comment fonctionnerais-tu?
Quatre personnes liées au transporteur (différentes suivant le transporteur) ? Deux personnes toujours les mêmes ? Une personne liée au projet ?
Je ne suis pas sûr de te comprendre, illustre ta demande d'un exemple.
Si tu as un contact lié au projet, ajoute une colonne dans ta table projets pour ces contacts avec un identifiant (par exemple id10, id25A ...),
Si tu as quatre contacts par transporteur ajoute une colonne dans ta table des transporteurs avec les 4 identifiants délimités par un séparateur (par exemple : id1|id2|id3|id4)
Ensuite crée toi une table avec "identifiant"→"nom"→"prénom"→"mél" : les lignes seraient du type
"Id1"→"EINSTEIN"→"Albert"→"albert.einstein@mc2.com"
Tu peux alors faire le lien entre les identifiants que tu as dans les tables Transporteurs et Projets avec cette table Identifiants pour trouver les adresses mél.
Les deux personnes fixes peuvent être aussi dans la table identifiants et dans une table "Systématique" que tu liras lors de l'envoi des méls.
De cette façon les identités et les méls ne sont renseignés qu'une seule fois dans une seule table (plus facile à corrigée) et tu peux mettre à jour facilement les autres tables en modifiant un ou plusieurs identifiants.
Prépare des tables avec des exemples, je t'aiderai si nécessaire après.
Je ne suis pas certaine d'avoir bien compris

My<3 à dit:
Dans le mail je voudrais retrouver les informations des colonnes, 2,1, 3a12 & 16
Il suffit de préparer le corps du message et l'objet en concaténant du texte et le contenu des cellules voulue (par exemple "Objet : projet " & A2
"bonjour" B2 & " " & C2. etc)
Prépare un exemple du texte à envoyer, on fera la macro d'envoi via OutLook à partir de ta préparation.
J'ai mis une zone de texte dans mon tableau pour le message


My<3 à dit:
Est-ce possible pour la destination que lorsque le suffixe est SST on ailles chercher l'adresse du chantier selon le numéro de projet, plutôt que l'inscrire plusieurs fois?
Oui, mais comme pour les contacts il faut, dans la table projet, faire le lien avec le chantier par exemple
"Projet1"→"id5"→"Chantier20" et ensuite de lire l'adresse du Chantier20 dans ta table Chantier.
Pour faire les liens, des dictionnaires (Scripting.Dictionary), la WorksheetFunction.Match (fonction EQUIV) ou la WorksheetFunction.VLookUp (RECHERCHEV) peuvent faire l'affaire.



My<3 à dit:
Est-ce possible de protéger le classeur (les cellules que nous pouvons compléter a l'aide de la boite de dialogue) , le rendre partageable
Protéger, oui.
Partager un classeur avec macro, pas avec les fonctionnalités intrinsèques d'EXCEL (du moins à ma connaissance).
J'ai réalisé des applications qui permettaient ce partage, [en utilisant un classeur (en lecture seule) pour l'interface utilisateur et un classeur base de données, et en gérant les accès à la base de données avec un fichier drapeau marquant l'occupation de la base. Le fichier interface lit la base, prépare les modifications, attends que la base soit libre (plus de drapeau occupée) , réserve l'écriture (pose du drapeau occupée) écrit les modifications, retire le drapeau occupée.] Mais c'est un peu lourd à mettre en place et engendre beaucoup d'ouverture-fermeture du fichier base de données.
Je vais abandonner cette option dans ce cas

Un dernier point quel est l'ordre de grandeur du nombre de Transports simultanément (hors Archives) ?
J'estime avoir jamais en bas de 100 lignes de transport simultanément

Milles merci a l'avance de votre aide
Mylaine
 

Pièces jointes

  • 3.LogistiqueLivraison.xlsm
    176.7 KB · Affichages: 1

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonsoir à toutes & à tous, bonsoir Mylaine ( @My<3 )

J'ai travaillé sur ton projet, dans ce que je te joins tout n'est pas débogué, je compte sur toi pour détecter les éventuels problèmes. (Je pars en vacances une semaine donc tu as un peu de temps devant toi.).
J'ai commenté le code et j'ai utilisé un nommage explicite pour favoriser sa compréhension

Il te faudra bien renseigner les tables pour faire les autres tests.
Le remplissage des tables Projets, Transporteurs, et Contacts est assisté par des macros qu'on lance via un double clic sur les données.

Cette première étape réalisée (même partiellement) tu pourras tester le formulaire de l'onglet Suivi.
Là aussi, les modifications sont assistées par une macro lancée via un double clic sur les données.
Je te conseille de ne pas faire de saisie directement dans le tableau, car les macros font des contrôles et proposent des actions en fonction des saisies dans le formulaire par exemple :
  • l'envoi automatique des mails lorsque que la date de livraison est renseignée ou modifiée et que les mails correspondants n'ont pas été expédiés ; à cet effet j'ai ajouté une colonne avec la date du dernier envoi des mails.
  • le renseignement des colonnes complémentaires en fonction du renseignement de la destination
  • le renseignement automatique du chantier de destination lorsque le suffixe est SST.
  • L'archivage lorsque les validations de factures sont effectuées
Le fichier d'archivage doit être placé sous le même répertoire que le classeur principal, son nom est stocké dans le module Constantes du projet.
Le fichier pdf est généré sous le même répertoire que le classeur principal, son nom est stocké dans le module Constantes du projet.

Donc place les 3 fichiers joints dans un même répertoire et lance-toi ...
Pour les bugs éventuels, joins des captures d'écran du mode débogage à tes messages.
Bon courage

Amicalement
Alain
 

Pièces jointes

  • Logistique Livraison AtTheOne 1.xlsm
    132.2 KB · Affichages: 7
  • Archives_Logistique_Livraisons.xlsx
    25 KB · Affichages: 3
  • Livraisons attendues dans les 30 jours à venir.pdf
    8.4 KB · Affichages: 4

Discussions similaires

Réponses
4
Affichages
362
Réponses
2
Affichages
253