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 soutienBonsoir @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
Certainement que je peux attendre ton retour! Tu me donne un coup de main donc je me verrais très mal de ne pas être en mesure d'attendre ton aide au moment ou toi tu es disponibleBonsoir @My<3
Merci pour tes réponses, je suis en vacances et sans pc jusque vendredi soir.
Peux tu patienter jusque-là ?
Ce serait trop galère sur mon téléphone !
Amicalement
Alain
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 tableauJ'ai ajouter des colonnes (il y a une colonne que je ne suis pas capable d'ajouter dans le tableau de suivi)
Tu appuies simultanément sur les touches ALT et F11 pour accéder à VBA- Comment je fais pour updater la boite de dialogue?
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.- 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, 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 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, 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).- 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)?
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
'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
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
wow MERCI j'ai du pain sur la planche je te tiens au courant plus tard comment va mon projet !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
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
Coucou Alain (@AtTheOne ) encore moi avec mon projetBonjour à 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
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.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, 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?
Quatre personnes liées au transporteur (différentes suivant le transporteur) ? Deux personnes toujours les mêmes ? Une personne liée au projet ?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?
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 " & A2Dans le mail je voudrais retrouver les informations des colonnes, 2,1, 3a12 & 16
Oui, mais comme pour les contacts il faut, dans la table projet, faire le lien avec le chantier par exempleEst-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?
Protéger, oui.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
J'estime ajouter des informations directement dans le tableau aussi.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 ?
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?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 suis pas certaine d'avoir bien comprisMy<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.
J'ai mis une zone de texte dans mon tableau pour le messageMy<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.
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
Je vais abandonner cette option dans ce casProté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.
J'estime avoir jamais en bas de 100 lignes de transport simultanémentUn dernier point quel est l'ordre de grandeur du nombre de Transports simultanément (hors Archives) ?