Actualiser un fichier sans désordonner les données

Bonjour à tous,

Débutant en VBA, je rencontre des difficultés sur la création d'un fichier destiné à des utilisateurs qui ont une connaissance d'excel limitée. Le fichier doit donc être le plus optimisé et simple d'utilisation possible.

Il s'agit grosso modo d'un fichier de suivi de présence des employés. J'ai écrit une première macro qui va chercher la liste des employés dans un autre fichier et la colle dans un onglet nommé "current_week" et une seconde macro qui trie cette liste selon plusieurs critères (poste / Contrat full time ou part time etc...). Une fois que la liste est importée et triée, les utilisateurs n'ont plus qu'à remplir le planning avec des 1 et des 0 pour indiquer les jours où les employés se présentent ou non.

Mon problème est que si les utilisateurs actualisent la liste des employés au cours de la semaine (en rajoutent ou en enlèvent) et l'importent à nouveau, le planning devient erroné (la liste n'est plus dans le même ordre que les lignes du planning.

Je pense qu'il s'agit surtout d'un problème d'architecture et je ne suis pas sur qu'une commande VBA puisse répondre à mon problème, mais si quelqu'un a une solution ca m'aiderait beaucoup !

Merci d'avance

Mon problème est que si les utilisateurs actualisent la liste des employés au cours de la semaine (en rajoutent ou en enlèvent) et l'importent à nouveau, le planning devient erroné (la liste n'est plus dans le même ordre que les lignes du planning.

Je pense qu'il s'agit surtout d'un problème d'architecture et je ne suis pas sur qu'une commande VBA puisse répondre à mon problème, mais si quelqu'un a une solution ca m'aiderait beaucoup !

En effet !!

Ce qu'il faut faire, c'est enregistrer les fameux 0 et 1 dans un onglet caché qui servira de base de données.

L'actualisation de la liste reprendra alors les valeurs de la base de données. Tout changement de valeurs se répercutera dans la base de données.

Je vais te chercher un exemple "simple" ... pour poursuivre il vaudrait mieux que tu donnes un fichier anonymisé du planning.

Voici un exemple ... c'est sans doute déjà trop complexe mais cela te donne des idées

Tu verras un onglet BdD qui est le squelette et un onglet Saisie pour entrer les données

Merci pour ta réponse Steelson,

Je ne préfère pas poster mon fichier sur Internet, il est plutôt confidentiel, même rendu anonyme :p En revanche l'exemple que tu as posté concorde parfaitement dans sa structure avec le mien et on peut très bien l'utiliser comme base.

Je pense que ta solution pourrait assez bien répondre à mon problème. Toutefois, je ne comprends pas comment tu as créé la table BDD, est-ce qu'elle se remplit automatiquement ou est ce que c'est fait à la main ? Et aussi, les listes que j'utilise peuvent aller jusqu'à 250 personnes, est-ce que ca ne ralentirait pas considérablement le fichier ? Enfin, comment re-remplir l'onglet source (ici l'onglet Saisie) à partir de la table ?

Merci d'avance !

Bonne journée !

Toutefois, je ne comprends pas comment tu as créé la table BDD, est-ce qu'elle se remplit automatiquement ou est ce que c'est fait à la main ?

Elle se remplit automatiquement dès qu'une information est modifiée dans l'onglet Saisie

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cel As Range
Dim trouve As Range

    If Not Intersect(Target, [param]) Is Nothing Then
        rafraichir (True)
    ElseIf Not Intersect(Target, [plage]) Is Nothing Then
        For Each Cel In Target
            If Cells(Cel.Row, [nomequipe].Column) <> 0 Then
                Criteria = Cells(Cel.Row, [nomequipe].Column) & "|" & (Cells([nomequipe].Row, Cel.Column) * 1)
                Set trouve = Sheets("BdD").Range("C:C").Find(What:=Criteria, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
                If Not trouve Is Nothing Then
                    ligne = trouve.Row
                Else
                    If Sheets("BdD").Cells(2, 1) = "" Then
                        ligne = 2
                    Else
                        ligne = Sheets("BdD").Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
                    End If
                    Sheets("BdD").Cells(ligne, 1) = Cells(Cel.Row, [nomequipe].Column)
                    Sheets("BdD").Cells(ligne, 2) = Cells([nomequipe].Row, Cel.Column)
                End If
                Sheets("BdD").Cells(ligne, 4) = Cel.Value
            End If
        Next
    End If

End Sub

Cet onglet n'a pas pour vocation de rester visible ... mieux vaut le mettre en masqué

Mais il peut servir éventuellement pour initialiser le fichier


Et aussi, les listes que j'utilise peuvent aller jusqu'à 250 personnes, est-ce que ca ne ralentirait pas considérablement le fichier ?

à voir, je pense qu'il y a de la marge

mais si c'était le cas, je pourrais simplifier le code en faisant en sorte que la BdD soit triée, cela éviterait les find de la macro


Enfin, comment re-remplir l'onglet source (ici l'onglet Saisie) à partir de la table ?

La feuille Saisie se renseigne à la main pour ce qui est des modifications

Mais dès que l'on choisit une nouvelle période (ou une nouvelle équipe) ou lors qu'on revient sur cet onglet après modification des équipes, cela se remet à jour par ceci :

Private Sub rafraichir(ok As Boolean)
Dim Cel As Range
Dim trouve As Range

    Application.EnableEvents = False
    Range("plage").ClearContents
    Range("plage").Interior.Color = xlNone
    For Each Cel In Range("plage")
        Criteria = Cells(Cel.Row, [nomequipe].Column) & "|" & (Cells([nomequipe].Row, Cel.Column) * 1)
        Set trouve = Sheets("BdD").Range("C:C").Find(What:=Criteria, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        If Not trouve Is Nothing Then
            Cel.Value = Sheets("BdD").Cells(trouve.Row, 4)
            couleur = Sheets("Motifs").Range("A:A").Find(Sheets("BdD").Cells(trouve.Row, 4), LookAt:=xlWhole).Interior.Color
            Cel.Interior.Color = couleur
        End If
    Next
    Application.EnableEvents = True

End Sub

Je ne préfère pas poster mon fichier sur Internet, il est plutôt confidentiel, même rendu anonyme

s besoin tu peux me le passer en mp après occultation de l'essentiel pour toi
Rechercher des sujets similaires à "actualiser fichier desordonner donnees"