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 SubCet 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 Subs besoin tu peux me le passer en mp après occultation de l'essentiel pour toiJe ne préfère pas poster mon fichier sur Internet, il est plutôt confidentiel, même rendu anonyme