IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Conception Discussion :

Classeur d'automatisation de saisies et affichage de résultats - Gestion Contrats


Sujet :

Conception

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Points : 518
    Points
    518
    Par défaut Classeur d'automatisation de saisies et affichage de résultats - Gestion Contrats
    Bonjour le forum,

    Il s'agit ici d'un projet que je mène dans le cadre de mon alternance dans l'entreprise où je travaille. Je dois avouer que j'aurai dû m'y prendre plus tôt pour demander de l'aide, ou ne serait-ce qu'avoir vos avis concernant la structure de ce classeur. Néanmoins, vu que j'ai reçu de nouvelles directives dernièrement, qui ont pas mal bouleversé l'organisation que j'avais jusque lors, je me suis dit qu'il n'était pas trop tard pour m'enquérir de vos connaissances

    Sans plus tarder, je vais vous expliquer de quoi il s'agit, et vous partager les bouts de code que j'ai : Je ne peux malheureusement pas vous partager le fichier car s'y situent des informations confidentielles. Je tâcherai de vous détailler au mieux.

    Je précise que le problème auquel je suis confronté est plutôt structurel. Je voudrai être sûr de démarrer dans le bon contexte avant de partir dans le gros du projet. Ainsi, si vous avez des propositions pour structurer différemment mon projet / userform, je suis tout à fait preneur avant que je n'aie codé des milliers de lignes qui ne serviront à rien.

    L'interaction avec Excel est prohibée, tout doit se passer par formulaires. C'est sûrement sur la création d'un formulaire efficace que j'ai besoin d'aide. Vous comprendrez dans la suite de ma demande, que... je risque d'avoir un nombre d'objet conséquent. Si cela est inévitable, je suis preneur de conseils pour renommer de manière efficace ces derniers objets. J'ai déjà réfléchi à des dénominations précises sans être trop longues afin de m'y retrouver.
    Ex : T_Cons_TBAC
    T...1ère lettre du type du fichier... T - TOTAL // E - Extournes etc...
    Cons... abréviation de l'action choisie... Cons - Consultation
    TB...abréviation du type d'objet... TB - TextBox // CBTN - CommandButton // CB - CheckBox
    AC... abréviation du nom de l'objet... AC - Année Comptable

    Je vous souhaite une bonne lecture, et vous remercie à l'avance de l'aide que vous m'apporterez.
    Passez un agréable moment dans le méandre des mes mots

    Quel est l'objectif de ce projet ?

    L'objectif initial était d'automatiser les calculs permettant d'afficher le Suivi Budgétaire de la gestion des contrats en temps réel.
    Il y a de cela quelques jours, mon responsable m'a demandé d'automatiser la saisie des données dans les "Classeurs Source" - qui alimentent le classeur de Suivi Budgétaire.

    Quels sont ces fichiers sources ?

    Il me paraît adéquat de commencer par vous parler de ces fichiers Source qui sont donc les informations de base que le programme utilisera. Il y en a 6 en particulier :
    • TOTAL - Représente les contrats clos
    • Extournes - Représente les montants liés à des contrats qui se situent sur l'Année Comptable N+1 mais en année calendaire N.
    • Contrats Actifs - Représente les contrats actifs, comme son nom l'indique
    • Commandes - Représente les commandes saisies, mais non payées
    • Budget - Représente le budget attribué
    • Résumé - Qui ne fera qu'afficher les résultats de l'exercice


    NB : Chacun de ses fichiers existe en quintuple, 1 pour 1 région. (5 régions - découpage de la France selon les critères de mon entreprise)

    Affichage du UserForm

    Nom : Capture3.PNG
Affichages : 180
Taille : 3,5 Ko

    Objets : (Oui j'ai oublié l'OptionButton pour les Commandes )

    Frame1 - Représente le cadre autour des OptionButton et du CommandButton[*] Frame1.Caption = Nom_Region (Tiré du code AuthMOD -> attribution des régions pour gérer les autorisations)

    OptionButton1 (Renommé : OB_Budget)

    OptionButton2 (Renommé : OB_Ext)

    OptionButton3 (Renommé : OB_CA)

    OptionButton4 (Renommé : OB_TOTAL)

    OptionButton5 (Renommé : OB_Cmd)

    OptionButton6 (Renommé : OB_Resume)

    CommandButton1 (Renommé : CB_Confirm)

    Voici le code AuthMOD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub AuthMOD(ID As String)
        'Dans le UserForm_Initialize on accède à cette procédure de la manière suivante - AuthMOD(Application.UserName)
        Select Case ID
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Nord-Est"
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Sud-Ouest"
            Case "NOM Prenom", "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Ouest"
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Sud-Est"
            Case Else
                MsgBox ("Vous n'êtes pas renseigné dans la base de données")
        End Select
     
    End Sub
    Classeur source - TOTAL

    Dans ce classeur, je souhaiterai que l'utilisateur puisse effectuer différentes opérations :
    • Saisie - Nouvelle ligne de contrat à rajouter
    • Consultation - Ligne déjà existante
    • Modification - Certaines données sont à modifier (Date de saisie dans le logiciel <> Date de paiement - cette dernière doit donc être éditée ultérieurement)


    J'ai déjà commencé à travailler mon formulaire de Consultation TOTAL. Toutes ces actions s'effectueront à travers un autre classeur Excel, qui permettra de manipuler librement l'un des 5 classeurs TOTAL. La région de l'utilisateur étant déterminée par Application.Username dont les noms sont enregistrés sous forme de listes.

    Ainsi, l'ouverture d'un classeur se fait avec la syntaxe : Workbooks.Open("Chemin...\" & Type_Fichier & Nom_Region & ".xlsx")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub CBConfirm_Click()
        If OB_Budget.Value = True Then
            If MsgBox("Confirmez-vous vouloir accéder au fichier BUDGET de la région " & Frame1.Caption & " ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Else
            End If
        End If
        If OB_Ext.Value = True Then
            If MsgBox("Confirmez-vous vouloir accéder au fichier EXTOURNES de la région " & Frame1.Caption & " ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Else
            End If
        End If
     
        If OB_CA.Value = True Then
            If MsgBox("Confirmez-vous vouloir accéder au fichier CONTRATS ACTIFS de la région " & Frame1.Caption & " ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Else
            End If
        End If
     
        If OB_TOTAL.Value = True Then
            If MsgBox("Confirmez-vous vouloir accéder au fichier TOTAL de la région " & Frame1.Caption & " ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Workbooks.Open ("Z:\PBR_LOG\ARIBA_2019\TestVBA\TOTAL\TOTAL" & Frame1.Caption & ".xlsx")
            Call TOTAL_Ent
            Else
            End If
        End If
     
        If OB_Resume.Value = True Then
            If MsgBox("Confirmez-vous vouloir accéder au classeur de Suivi Budgétaire ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Else
            End If
        End If
    End Sub
    Il faut encore que je crée les lignes pour l'OptionButton sur les Commandes, mais ça ne risque pas d'être trop compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub TOTAL_Ent()
        Set Wb = Workbooks(OB_TOTAL.Caption & Frame1.Caption)
        Dim answer As Integer
     
        answer = Autretest
     
        Select Case answer
     
            Case 1
                With MP1
                    .Pages("Page1").Visible = True
                    .Pages("Page2").Visible = False
                End With
            Case 2
     
            Case 3
     
        End Select
        Wb.Sheets(InputBox("Veuillez saisir une année comptable - 4 chiffres")).Select
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Autretest() As Integer
        Do
            Autretest = InputBox("Souhaitez-vous Consulter (1), Ajouter (2), Modifier (3) ?")
        Loop While Autretest < 1 Or Autretest > 3
    End Function
    Le MultiPage représente la collection complète de toutes les pages que je créerai - pour les 6 types de classeurs - ce qui représenterai une quinzaine de pages selon moi.

    Consultation_TOTAL

    Voici la page que j'ai créée pour la Consultation de la feuille TOTAL.

    Nom : Capture4.PNG
Affichages : 238
Taille : 8,4 Ko

    L'utilisateur devra dans un premier temps saisir l'année qu'il souhaite enregistrer grâce à la procédure TOTAL_Ent()
    La valeur ainsi retournée sera automatiquement stockée dans la TextBox1 (Renommée : T_Cons_TBAC [TOTAL_Consultation_TextBox_AnnéeComptable])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub T_Cons_Init()
        T_Cons_TBAC.Enabled = False
        'La TextBox Année Comptable dans la feuille Consulter(TOTAL) n'est pas modifiable
     
        T_Cons_CBBIC.Visible = False
        T_Cons_LBBIC.Visible = False
        'Le Label et la CheckBox liés aux sites BIC sont cachés
     
        T_Cons_TBCC.Enabled = False
        T_Cons_TBSAP.Enabled = False
        'La TextBox Centre de Coût et Plan de Compte dans la feuille Consulter(TOTAL) ne sont pas modifiables
     
        Call T_Cons_CBSite_Init
        'Appel de la procédure d'initialisation de la CheckBox_Site (Liste Déroulante)
     
        Call T_Cons_CBP5_Init
        'Appel de la procédure d'initialisation de la CheckBox_Pavé5 (Liste Déroulante)
     
        Call T_Cons_CBP4_Init
        'Appel de la procédure d'initialisation de la CheckBox_Pave4 (Liste Déroulante)
    End Sub
    Au vu du nombre de pages, j'ai décidé de créer une procédure d'initialisation pour chacun des objets qui se situent dans chacune des pages. Peut-être devrai-je même faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Userform_Initialize()
    Call T_Init
    Call E_Init
    '...
    'Call B_Init
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub T_Init()
    Call T_Cons
    'Procédure d'initialisation des objets se situant dans la page T_Cons
    Call T_Saisie
    Call T_Modif
    End Sub
    Question 1
    ...ainsi de suite. Cela me permettra d'avoir une meilleure lisibilité, non ? Ou l'imbrication d'appel de procédures n'est pas recommandé ?

    La procédure T_Cons_CBSite_Init prend ses données au sein du classeur principal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub T_Cons_CBSite_Init()
        Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
        Dim derLig As Integer, derCol As Integer
        Dim WbO As Worksheet
     
        Set Wb = ThisWorkbook
        Set WbO = Wb.Sheets(2)
     
        derCol = WbO.Cells(1, Columns.Count).End(xlToLeft).Column
        'Récupère la dernière colonne dans la base de données des régions -> sites
     
        Set CBR = WbO.Range(WbO.Cells(1, 1), WbO.Cells(1, derCol))
        'Définit la plage de cellule qui correspond à la première ligne de la Feuille 2, qui contient toutes les régions (en-têtes)
     
        For Each CellCBR In CBR
            'Pour chaque cellule dans cette plage...
            If CellCBR.Value = Frame1.Caption Then
                '...si la valeur de la cellule correspond à la région de l'utilisateur...
                derLig = WbO.Cells(Rows.Count, CellCBR.Column).End(xlUp).Row
                '...déterminer la dernière ligne non-vide de la colonne associée à la Région - Correspond à tous les sites de la région
     
                Set CBS = WbO.Range(WbO.Cells(2, CellCBR.Column), WbO.Cells(derLig, CellCBR.Column))
                '...puis attribue la totalité de la plage (- l'en-tête) à la variable CBS
     
                For Each CellCBS In CBS
                    'Pour chaque cellule dans cette plage (CBS)...
                    T_Cons_CBSite.AddItem (CellCBS.Value)
                    '...ajouter la valeur de cette cellule à la Liste Déroulante
                Next
            End If
        Next
    End Sub
    La 1ère ligne de la page 2 représente le nom des régions - le programme va chercher quelle valeur correspond à celle située dans Frame1.Caption

    Les colonnes de chacune des 5 lignes représentent les sites principaux associés à chacune de ces régions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub T_Cons_CBSite_Change()
        If T_Cons_CBSite.Value = "BIC" Then
            'Si la valeur renseignée via la CheckBox_Site est BIC alors...
            Call T_Cons_CBBIC_Init
            '...on initialise la CheckBox_BIC
        Else
            T_Cons_CBBIC.Clear
            T_Cons_LBBIC.Visible = False
            T_Cons_CBBIC.Visible = False
        End If
    End Sub
    L'appellation BIC signifie les sites secondaires. La saisie de BIC dans la CheckBox_Site permettra l'affichage de la CheckBox_BIC qui est initialisée exactement de la même manière que celle pour les sites principaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub T_Cons_CBP5_Init()
        'Ce code permet d'initialiser la CheckBox SANS prendre en compte les valeurs nulles. Cela évite d'avoir un choix "vide" dans la liste
        Set Wb = ThisWorkbook
        Set mondico = CreateObject("Scripting.Dictionary")
     
        a = Wb.Sheets(1).Range("M2:M" & Sheets(1).[A65000].End(xlUp).Row)
     
        For i = LBound(a) To UBound(a)
            If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
        Next i
     
        T_Cons_CBP5.List = mondico.Keys
    End Sub
    Procédure d'initialisation de la liste déroulante Pavé 5 (fonctionnement identique pour Pavé 4, sur une autre colonne)
    J'ai besoin d'ignorer les cellules vides, car je n'ai pas envie d'avoir d'espace dans ma liste déroulante, c'est pas joli

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub T_Cons_CBP4_Change()
        Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
        Dim derLig As Integer
        Dim WbO As Worksheet
     
        Set Wb = ThisWorkbook
        Set WbO = Wb.Sheets(1)
     
        derLig = WbO.Range("L2:L" & Rows.Count).End(xlUp).Row
     
        WbO.Range("A2").AutoFilter
     
        WbO.Range("A2").AutoFilter Field:=12, Criteria1:=T_Cons_CBP4.Value
     
        If T_Cons_CBP5.Value <> "" Then
            T_Cons_CBP5.Clear
     
            Set CBR = WbO.Range(WbO.Cells(2, 12), WbO.Cells(derLig, 12)).SpecialCells(xlCellTypeVisible)
     
            For Each CellCBR In CBR
                T_Cons_CBP5.AddItem (CellCBR.Value)
            Next
        End If
    End Sub
    Cette procédure a pour objectif de mettre à jour la liste déroulante Pavé 5 en fonction du choix réalisé dans la liste déroulante Pavé 4. En effet, le niveau de détail est tel que 1 valeur du Pavé 4 englobe plusieurs valeurs du Pavé 5. Néanmoins, après avoir discuté avec une collègue, elle souhaiterait pouvoir filtrer dans le sens inverse.

    C'est là qu'intervient ma deuxième question :

    Question 2
    Après avoir effectué de multiples tests...je n'ai pas réussi à atteindre le résultat souhaité, à savoir :

    Si j'ai déjà des valeurs saisies dans Pavé 4 et Pavé 5 - donc que mon filtre automatique a trié mon tableau en fonction de ces deux critères, comment faire pour que lorsque à travers l'événement T_Cons_CBP4_Change() - déjà utilisé pour modifier la liste déroulante Pavé 5, cette dernière se vide automatiquement et se réinitialiser en fonction de la valeur nouvellement saisie en Pavé 4 ?

    J'ai essayé en partant sur un algorithme du style :
    Si Valeur_P4 <> "" Alors
    Supprimer les filtres actifs
    Vider P5
    Créer un filtre sur P4
    Réinitialiser P5 en fonction de P4
    Sinon
    Créer un filtre sur P4
    Fin Si

    Y a-t-il un ordre que je n'aurai pas respecté dans cette réflexion ? Parce que j'ai essayé de le réaliser et je me retrouvais avec des erreurs, si l'algorithme a un sens logique, c'est que je me suis trompé dans la réalisation du code.

    Voilà l'état actuel de mon projet. Je préfère m'en tenir à là pour l'instant, afin d'être sûr de partir dans la bonne direction avant de réfléchir à la création de toutes les autres pages de la multipage.

    Je vous remercie pour l'attention portée à mon projet, je reste à votre disposition pour tout éclaircissement à apporter. J'espère aussi ne pas m'être trompé de sous-forum, j'ai longtemps hésité mais je pense que j'ai surtout besoin d'aide sur la structure de mon classeur. J'ai partagé les codes VBA pour être précis et partager l'avancement.

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Citation Envoyé par révèr Voir le message
    Voici le code AuthMOD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub AuthMOD(ID As String)
        'Dans le UserForm_Initialize on accède à cette procédure de la manière suivante - AuthMOD(Application.UserName)
        Select Case ID
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Nord-Est"
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Sud-Ouest"
            Case "NOM Prenom", "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Ouest"
            Case "NOM Prenom", "NOM Prenom"
                Frame1.Caption = "Sud-Est"
            Case Else
                MsgBox ("Vous n'êtes pas renseigné dans la base de données")
        End Select
     
    End Sub
    Plutôt que de coder les Nom Prénom des gens en dur dans le code, il serait judicieux de prévoir un Tableau Structuré (TS dans la suite) sur un onglet "Options" contenant la liste des utilisateurs et la région qui leur est associée. Il faudra ensuite dans AuthMOD aller chercher dans ce tableau. Avantage, il suffit de faire un Userform pour mettre à jour les données du TS.

    Pour la suite, tu devrais consulter ce tutoriel sur la manipulation du contenu d'un fichier Excel sans avoir à l'ouvrir, ça peut te donner un première approche.
    Dans une approche similaire, tu as les billets de Pierre qui peuvent également t'apporter des informations utiles, bien que dans ce cas de figure, les fichiers seraient "des base access" manipulées à partir de VBA Excel (Access ne serait pas utilisé).

    Si tu décides d'ouvrir physiquement les fichiers pour modifier leur contenu, je pense que cette contribution pourras peut-être te rendre service (plus surement pour les gestions "interne" à ton fichier, style liste d'agent ou autre). Attention c'est un projet en cours... aucune garantie de bon fonctionnement.
    Attention avec cette voie... je l’exclurais étant donnée que plusieurs utilisateurs pourront mettre à jour le même fichier (plusieurs "nom Prenom" par région). En règle général Excel + multi utilisateur = ... bof bof... il vaudrait mieux travailler avec Access sur un tel projet, d'autant plus pour une utilisation pro...

    Pour la gestion des Options boutons, tu as cette contribution, ça allégerait ton code, l'ensemble des options bouton retournant une seule valeur, il te suffit d'utiliser cette valeur avec un Select Case plutôt que de faire 5 tests ElseIf.

    Il faut encore que je crée les lignes pour l'OptionButton sur les Commandes, mais ça ne risque pas d'être trop compliqué
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Wb.Sheets(InputBox("Veuillez saisir une année comptable - 4 chiffres")).Select
    Pas si sur...
    Ce type de code est à proxcrire car si l'utilisateur ferme l'inputbox sans donner de réponse ou marque n'importe quoi (pas une doute ou une date exclue du champs des onglets dispo), l'utilisateur va se retrouver devant du code VBA avec un erreur et une ligne en jaune.
    Il faut impérativement, soit fournir une liste de valeur dans un combobox, soit contrôler la valeur fournie pas l'utilisateur

    L'utilisateur devra dans un premier temps saisir l'année qu'il souhaite enregistrer grâce à la procédure TOTAL_Ent()
    La valeur ainsi retournée sera automatiquement stockée dans la TextBox1 (Renommée : T_Cons_TBAC [TOTAL_Consultation_TextBox_AnnéeComptable])
    Il serait préférable de mettre un combobox avec la liste des années dispo et d'activer le reste des champs lorsqu'une année est sélectionnée dans la liste.

    Le MultiPage représente la collection complète de toutes les pages que je créerai - pour les 6 types de classeurs - ce qui représenterai une quinzaine de pages selon moi.
    Question 1
    ...ainsi de suite. Cela me permettra d'avoir une meilleure lisibilité, non ? Ou l'imbrication d'appel de procédures n'est pas recommandé ?
    S'agissant de mettre autant de Multipage que de classeur, si j'ai bien compris, je pense que tu fais fausse route, ton UserForm ne devrait pas directement modifier tes données et encore moins être spécialisé au point de ne pouvoir communiquer qu'avec un seul classeur spécifiquement nommé dans le code.
    Si les 5 classeurs Total ont une structure identique ou non ton UserForm doit appeler un code contenu dans un module en lui passant comme paramètre (par exemple) les données à modifier/Ajouter/Supprimer et sur quel classeur.
    Je ne sais pas si je suis clair.
    UserForm d'accueil :

    • Une région est choisie en fonction du nom de l'utilisateur
    • Un classeur est ensuite déterminer avec l'info région + la sélection d'un option bouton
    • Tu ouvres alors le Userformavec tes liste déroulante en lui passant en paramètre Le nom de classeur (ou un code identifiant ce classeur ou juste l'ID de la région)
    • Les userform appel une fonction (dans un module standard) à laquelle il passe l'identifiant du classeur (ou région ou ...) et ce que souhaite faire l'utilisateur (Ajout, VConsultation, suppression, modification,....)
      • Par exemple à l'ouverture tu vas coder dans le userform un appel à cette function en lui passant l'ID classeur + Consultation et cette function devra te retourner les données à afficher dans les différent contrôle de ton UserForm.
      • L'utilisateur réalise des modifications et les valide
      • Tu refais un appel à la function externe avec ID Classeur + Modification en lui transmettant les nouvelles données (Tu peux avoir différente function à appeler pas forcement un fonction unique ce qui serait compliquer peut être pour les paramètres - A voir)
        • C'est la function qui se charge de mettre à jour les données dans le classeur





    La procédure T_Cons_CBSite_Init prend ses données au sein du classeur principal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub T_Cons_CBSite_Init()
        Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
        Dim derLig As Integer, derCol As Integer
        Dim WbO As Worksheet
     
        Set Wb = ThisWorkbook
        Set WbO = Wb.Sheets(2)
     
        derCol = WbO.Cells(1, Columns.Count).End(xlToLeft).Column
        'Récupère la dernière colonne dans la base de données des régions -> sites
     
    '....
    Je te conseilles d'utiliser les TS dans tous les cas où cela est possibles. Utiliser les codes Cells().end(xlToLeft)... c'est obsolète. Voir le billet de Pierre sur le sujet.

    Question 2
    Après avoir effectué de multiples tests...je n'ai pas réussi à atteindre le résultat souhaité, à savoir :
    Y a-t-il un ordre que je n'aurai pas respecté dans cette réflexion ? Parce que j'ai essayé de le réaliser et je me retrouvais avec des erreurs, si l'algorithme a un sens logique, c'est que je me suis trompé dans la réalisation du code.
    Je ne suis pas sûr d'avoir tout compris, encore plus spécifiquement ici que pour le reste
    Si tu veux modifier un contrôle Combobox (Ctrl1) qui ensuite modifie un autre contrôle Combobox (Ctrl2) dans lequel l'utilisateur fera un choix parmis un contenu trié en fontion du choix dans Ctrl1...
    Mais que tu souhaites aussi pouvoir faire l'inverse.... C'est possible mais il faudra réflechir un peu (En fonction du contenu Text des combo et peut-être d'une variable en plus), tu as d'autre sujets à traiter avant ça à mon avis

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Points : 518
    Points
    518
    Par défaut
    Bonjour Qwaz et merci beaucoup pour ton aide !

    Concernant ta proposition de passer sous Access, c'est un changement majeur que j'aurai à proposer à mon entreprise. D'autant plus que personnellement, je n'ai que très peu utilisé Access. Néanmoins, si tu me dis que cela peut faciliter énormément les choses, je m'y attarderai.

    Pour en revenir sur l'état actuel du projet, j'ai en effet le besoin d'ouvrir les classeurs "Source" pour que la personne puisse visualiser la modification, la consultation ou bien l'ajout de ses lignes. Je suis conscient que la manipulation simultanée des classeurs posera problème, mais à l'heure actuelle je n'ai pas trouvé d'autres alternatives.

    Si toutefois il est possible d'importer le contenu du classeur "Source" qui correspond à l'année sélectionnée par l'utilisateur, sans ouvrir ce-dit classeur "Source", cela pourrait-il résoudre le problème multi-utilisateur ?

    Je me pose néanmoins quelques questions sur le TS des utilisateurs. Le code va-t-il chercher le nom dans TOUTES les cellules qui composent le TS ? Un TS a-t-il des dimensions "linéaires" (2x4 ; 5x6)... ? Si tel est le cas, cherchera-t-il aussi dans les cellules vides ?

    Je souhaiterai ainsi synthétiser ce que tu m'as proposé comme solution :
    • Utiliser un tableau structuré pour saisir les droits des utilisateurs.
    • Ajouter une partie "Options" dans le Userform permettant d'ajouter/supprimer des droits d'utilisateur (dont l'accès sera réservé aux responsables de site que je compléterai dans ce TS)
    • Extraire les droits de l'utilisateur en comparant le Application.User avec les données saisies dans le TS
    • Ouvrir le classeur qui correspond au choix d'option et au nom de la région (Chose qui existe déjà dans mon code, mais que je devrais donc adapter au TS)
    • Le code va utiliser les mêmes données pour initialiser l'affichage du UserForm et son "pré-remplissage" - ComboBox des sites et sites secondaires.
    • Validation des modifications apportées grâce à la fonction
    • Permettre à l'utilisateur à travers un MsgBox - Continuer à manipuler les classeurs ? "Oui/Non"
      Oui -> Boucle l'appel de la fonction tant que l'utilisateur saisit Oui
      Non -> Enregistrement des classeurs - J'ajouterai bien une colonne masquée avec le nom des utilisateurs, ce qui permettra de savoir qui a saisi les informations en dernier sur une ligne spécifiée. J'espère que cette idée ne fera pas trop "Flicage" ce n'est pas du tout l'objectif recherché, mais plutôt de remonter rapidement à la personne concernée pour des informations.


    Je m'en vais de suite lire tous les liens que tu m'as mis à disposition, je te remercie pour ton aide

    Révèr

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Points : 518
    Points
    518
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut
    En règle général Excel + multi utilisateur = ... bof bof... il vaudrait mieux travailler avec Access sur un tel projet, d'autant plus pour une utilisation pro...
    Dernier rebondissement... mon chef ne veut absolument pas que j'utilise Access, et je dois rendre quelque chose de fonctionnel pour début Mars ! YES...

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2008, 11h17
  2. Switcher entre saisie et affichage avec un bouton
    Par ToxiK dans le forum WebDev
    Réponses: 2
    Dernier message: 12/03/2007, 09h15
  3. Problème saisie et affichage de chaine
    Par sam.fet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/08/2006, 17h18
  4. [Struts]probleme de saisie et affichage de la saisie
    Par stanilas dans le forum Struts 1
    Réponses: 9
    Dernier message: 02/08/2005, 09h26
  5. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo