Déplacer plage de cellule si à l'ouverture du fichier, la date change

Bonjour à tous,

Je suis en train de créer un tableau pour gérer un planning.

Je suis bientôt arrivé au bout mais il me manque un code me permettant de copier une plage de cellules sur la colonne d'à côté si et seulement si à l'ouverture du fichier, la date contenu dans la cellule E4 change (E4=fonction aujourd'hui)

ex : E5:E8 vers D5:D8, les valeurs qui étaient contenues de D5:D8 vers C5:C8 et ainsi de suite

Le fichier est fermé chaque jour.

Il faut que le code s'active dès l'ouverture du fichier sans devoir activer les macros.

Merci d'avance pour votre aide.

sans titre

Petite précision quand je dis "la date contenue dans la cellule E4 change".

Dans cette cellule, j'ai une fonction AUJOURDHUI()

ex le fichier a été fermé la veille et la date inscrite en E4 était le 16/02/2021

Le 17/02/2021, quand le fichier sera ouvert la date va changer et passer au 17/02/2021

Je veux que les plages se décalent si et seulement si la nouvelle date inscrite en E4 est bien inférieure d'une journée à celle qui était inscrite précédemment dans cette même cellule.

Un peu compliqué...

Bonjour,

Sans activer les macros, aucun code ne pourra s'exécuter, c'est le principe justement .

Pourquoi avoir la fonction aujourdhui ? Et ici, votre problème peut se régler en supprimant la colonne B tout simplement...

Cdlt,

Bonjour, merci pour la réponse.

Oui bien entendu, pour qu'une macro s'exécute il faut bien l'activer.

A l'ouverture du fichier j'ai toujours un message de sécurité me demandant d'activer les macros et je voudrais justement qu'elles s'activent automatiquement sans devoir acquitter ce message !

La fonction Aujourd'hui ? C'est pour un planning, quand l'utilisateur ouvre le fichier il rentre les objectifs pour la date du jour (E4). Les objectifs dépendent en partie des 3 jours précédents (colonne B,C,D)

J'espère avoir été plus clair

Bonjour,

Je propose une alternative sans saisir de formule ni de date à l'avance. On teste juste si la date du jour existe. Si elle existe, on ne fait rien, sinon, on l'ajoute à la suite des dates précédentes (permet d'éviter de se soucier des jours chômés) et on supprime la colonne B.

J'ai ajouté une MFC pour mettre en évidence la date du jour sur la ligne 4...

Pour l'instant, la macro s'exécute à l'aide d'un clic sur un bouton mais il est possible de l'exécuter à l'ouverture du fichier en plaçant ce code dans le module thisworkbook :

private sub workbook_open()
call test
end sub
36ozone059.xlsm (17.92 Ko)

Cdlt,

Bonsoir,

Merci beaucoup pour ton aide, j'ai mis en forme mon tableau et cela fonctionne, c'est ce que je cherchais !

Il y a juste une chose que je n'avais pas précisé, j'ai des données également dans les colonnes F à M

Quand ça décale d'une colonne, évidemment ça décale aussi ces colonnes là.

Ma question, est-il possible de ne pas décaler les colonnes de F à M ?

Cordialement.

Je pense que c'est possible mais tu devrais poster un fichier pour que je puisse prendre connaissance de la structure du fichier afin d'apporter une solution plus adaptée.

Cdlt,

Bonjour,

Voici le fichier, il n'y a rien de spécial dans les colonnes de F à M mise à part les dates qui se calculent suivant la valeur de E4 avec uniquement les jours ouvrés sans les jours fériés (peut être existe t-il une autre façon de faire?)

Le reste c'est l'utilisateur qui le rentre.

12ozone059.xls (35.00 Ko)

Je ne veux pas que ces colonnes soit décalées quand on supprime la colonne B.

Merci encore...

Je pense à autre chose, si l'utilisateur oublie d'ouvrir le fichier une journée, il n' y aura pas la date de cette journée avant la date du jour.

Il faudrait en fait que quand le fichier est ouvert, il faut systématiquement en B4, C4, D4 les trois derniers jours ouvrés précédent la date du jour.

Il faut conserver la possibilité par l'utilisateur de remplir les colonnes B, C et D s'il a oublié de le faire le jour J

Merci

Bonjour,

Donc en fait, à l'ouverture, il faut la date du jour en E4, les 3 jours ouvrés précédents et les 8 suivants si je comprends bien ? Mais à part ça la suppression n'est pas réellement un problème sinon (sur l'exemple que je vois).

Je pense qu'on saisissait en fonction des jours précédents... Et que saisit-on alors ? Les données variables de la paie ?

Je vais regarder ce que je peux faire mais je suis pas vraiment inspiré . En fait, je verrais plus ce genre de saisie en lignes, à moins qu'il y ait beaucoup de catégories (vert, jaune, ...).

Je vous ai mis le fichier modifié (confidentialité) pour mieux vous aiguiller.

Oui c'est bien ça en E4 à l'ouverture du fichier, la date du jour. En B4, C4, D4 les jours ouvrés précédents (sans fériés) et de F4 à M4, les jours ouvrés suivants (toujours sans fériés).

Le fichier est pour un planning d'une tâche à réaliser avec plusieurs étapes le tout étalé sur 4 jours.

La tâche commencée (étape 1) il y a trois jours se terminera le jour J (étape 4).

C'est l'étape 1 qui détermine le travail à faire pour les trois autres étapes.

L'utilisateur ne touche qu'à la ligne 6 avec un choix dans menu déroulant.

Quand la date change (à l'ouverture du fichier), je veux comme vous l'avez fait, que la colonne B soit supprimée et que les données se décalent d'une colonne.

Par contre, il ne faut pas que les valeurs des colonnes F à L subissent ce décalage car c'est une prévision du planning.

Dans le fichier par exemple, la colonne F4 se retrouverait en E4 et ça je ne veux pas.

Il faut toujours qu'en E4 j'ai ma date du jour et seulement 3 jours ouvrés avant.

Voilà j'espère avoir été plus clair mais c'est pas facile !

Merci en tout cas...

18test.xlsm (20.47 Ko)

Re Ozone,

Ca y est, je reviens avec une solution qui me semble pas mal !

Le principe, c'est qu'on définit les 12 dates à avoir dans le code en faisant une boucle impliquant la fonction SERIE.JOUR.OUVRE par rapport à la date du jour (de -3 à +8).

On obtient alors les dates à coller en ligne B4:M4.

Mais avant de coller ces valeurs, on recherche la position de la première valeur de cette série de dates dans la série initiale (présente à l'ouverture). De cette manière, on sait à partir de quelle colonne récupérer les infos. Et ainsi on les récupère...

Si cette première date n'est pas trouvée, ce qui ne devrait pas arriver. On sort précipitamment et l'utilisateur est invité à effectuer manuellement la procédure. Si on ouvre le fichier plusieurs fois dans la journée, normalement, il ne se passe rien (sauf si les dates précédentes ne sont pas bonnes).

Sinon, j'ai mis le tableau des jours fériés sous forme de tableau structuré de manière à le rendre dynamique dans le code !

J'ai retouché un peu les 2 listes et ai surtout renommé la première Liste1 de manière à rendre dynamique le code exécuté lors de l'évènement change de la feuille. Il faudra éventuellement faire des essais sur ce point que je n'ai pas testé.

26test.xlsm (22.72 Ko)

Et aussi, dans le code, il reste quelques références "statiques" auxquelles il faudra faire attention. La plage de saisie des étapes, le nom de la feuille et la plage des dates. Si ces plages évoluaient ou étaient déplacées, il faudrait ajuster le code en conséquence. Le mieux est de les nommer, voire de les mettre sous forme de tableau également (mais sans en-tête).

Bonjour 3GB,

J'ai regardé attentivement le fichier, le décalage fonctionne bien et j'ai bien les bonnes valeurs là où je veux pour les colonnes avant "aujourd'hui".

Par contre les valeurs des colonnes F à M se décalent elles aussi et ça c'est embêtant car j'ai des formules dans ces cellules (cf fichier)

Par exemple, les valeurs de la cellule F7 se déplace en E7.

En fait dès que la macro s'active, les colonnes se décalent et je perds toutes mes formules dans ces colonnes.

Il faudrait que je puisse conserver les formules sur les lignes 7,8 et 9 sur les colonnes de E à M.

Puisque c'est le nombre de tâches de l'étape 1 qui conditionne les étapes 2,3 et 4, il ne serait pas plus simple de décaler seulement les valeurs de la ligne 6 à chaque changement de date ?

Toutes les autres valeurs découlent en fait de cette ligne et sont de simples formules finalement.

Par contre, sur la ligne 6 même si les valeurs se décalent, il faut que l'utilisateur puisse éventuellement changer la valeur via le menu déroulant s'il le souhaite (puisqu'à partir de la colonne F, on est bien sur des prévisions)

Exemple sur mon fichier, après ouverture et changement de date, si la valeur est de 40 en G6, il faut que l'utilisateur puisse mettre 80.

Merci pour votre aide précieuse, j'aimerais savoir en faire autant !

Bien à vous

12test.xlsm (23.42 Ko)

Bonjour Ozone,

Mince, je pensais vraiment avoir fait un sans faute là ! J'ai vraiment pas fait attention aux formules. Vu qu'il y avait des listes de validation en ligne 6, j'ai fait mes essais et elles ont été écrasées...

Il suffit de changer la référence où figurent les "étapes" dans le code :

Sub MAJ()

Dim t(1 To 12)

With Sheets("Feuil1")
    For i = 1 To 12
        t(i) = Application.WorkDay(Date, i - 4, .Range("JF"))
    Next i
    Set rdates = .Range("B4:M4")
    pos = Application.Match(t(1), rdates, 0)
    If IsError(pos) Then
        MsgBox "Une erreur est survenue ! Veuillez mettre à jour le fichier manuellement.", 16, "Echec de la mise à jour"
        Exit Sub
    End If
    With .Range("B6:M6") '<<<<< CHGT
        tstep = .Offset(, pos - 1).Resize(, .Columns.Count - pos + 1).Value
        Application.EnableEvents = False
        .ClearContents
        .Resize(UBound(tstep), UBound(tstep, 2)).Value = tstep
        Application.EnableEvents = True
    End With
    rdates.Value = t
End With

End Sub

Normalement, ça devrait être bon. Mais je pense à l'instant que dans ce cas, les données n'apparaitront plus sur les 3 jours précédents ?

Alors voici un autre essai :

Sub MAJ()

Dim t(1 To 12)

With Sheets("Feuil1")
    For i = 1 To 12
        t(i) = Application.WorkDay(Date, i - 4, .Range("JF"))
    Next i
    Set rdates = .Range("B4:M4")
    pos = Application.Match(t(1), rdates, 0)
    If IsError(pos) Then
        MsgBox "Une erreur est survenue ! Veuillez mettre à jour le fichier manuellement.", 16, "Echec de la mise à jour"
        Exit Sub
    End If
    With .Range("B6:M9")
        tstep = .Offset(, pos - 1).Resize(, .Columns.Count - pos + 1).Value
        Application.EnableEvents = False
        .rows(1).clearcontents
        .Resize(1, UBound(tstep, 2)).Value = tstep
        with .resize(ubound(tstep), application.min(3, ubound(tstep,2)))
            .clearcontents
            .value = tstep
        end with
        Application.EnableEvents = True
    End With
    rdates.Value = t
End With

End Sub

Dis-moi laquelle te semble la meilleure...

Bonsoir 3GB,

J'ai pris le deuxième essai et cela fonctionne, j'ai fait plusieurs tests...

Par contre, j'aimerais avoir un historique des valeurs qui sont passées en E6 et E12 à chaque date.

J'ai mis un onglet historique, j'ai fait une liste des jours ouvrés sans fériés ni samedi dimanche.

Si la date de l'onglet historique coïncide à la date en E4 de l'onglet planning, alors ça me copie les valeurs situées en E6 et E12.

Le seul problème, c'est que si je ferme le fichier et qu'il change de date, je ne conserve pas les valeurs.

Auriez vous une idée pour conserver les valeurs ?

Je vous laisse le fichier

Merci

11essai.xlsm (40.61 Ko)

Bonsoir Ozone,

Voici ton fichier en retour avec un code qui semble fonctionner (je n'ai pas fait des milliers d'essais...).

Cependant, pour faciliter la tâche et préserver l'exhaustivité des infos, j'ai prévu de reporter toutes les étapes.

18essai.xlsm (42.20 Ko)

Cdlt,

Bonjour à tous,

Je reviens vers vous car j'ai mis le fichier en utilisation et il y a un souci auquel je n'avais pas pensé.

En effet, tant que ce fichier est utilisé du lundi au vendredi il fonctionne correctement mais si quelqu'un l'ouvre et l'enregistre un samedi ou dimanche alors la date en E4 change et cela met le bins... (les valeurs du vendredi ne se décalent pas alors que la date oui...)

Pour faire simple, si quelqu'un ouvre le fichier un samedi ou dimanche la date en E4 doit rester au vendredi et ne jamais passer au samedi ou dimanche...

J'ai regardé dans la macro et je pense qu'il faudrait modifier cette ligne pour qu'en E4 ne s'affiche jamais un samedi ou dimanche ???

t(i) = Application.WorkDay(Date, i - 4, .Range("JF"))

Il faudrait peut être utilisé WorkDay_Intl en spécifiant une liste de tous les week-ends de l'année mais cela me semble un peu compliqué...

Je pensais que la fonction jours ouvrés excluait d'office les samedis et dimanches ?

Merci pour votre aide.

15essai.xlsm (43.41 Ko)

Bonjour à tous,

Peut être en utilisant 0000011 dans la fonction workday ?

Mais comment l’intégrer correctement dans cette fonction ?

merci

Rechercher des sujets similaires à "deplacer plage ouverture fichier date change"