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

Macros et VBA Excel Discussion :

Générer planning statique à partir de trame dynamique (VBA) [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut Générer planning statique à partir de trame dynamique (VBA)
    Bonjour,
    J'ai réussi après pas mal d'aide de votre part à générer un planning automatique. Qui puisse reprendre à partir d'informations données s'adapter aux dates et aux services. J'en suis bientôt à la fin de mon travail puisqu'il ne reste plus qu'à pouvoir en quelques sortes "archiver" de manière statique le planning.

    Je m'explique j'aimerais qu'au final le fichier joint qui est le système de génération du planning puisse conserver de manière statique les données (le service choisi sera le nom du fichier, le mois choisi le nom d'une feuille, et le contenu de la feuille ce qui doit correspondre).
    Enfin les Userform et les codes rattachés à la feuille, et aux userform doivent pouvoir suivre le fichier de sorte que les événements de type masquage des lignes, lancement des userform et effets que produisent les userforms.

    Ca parrait faisable pensez-vous?

    Il va me manquer des compétences et des connaissances pour mener à bien mon projet (je n'ai pas suivi de formation en programmation et c'est ma grande première).
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut Génération de plusieurs Feuilles en fonction de la liste de mois
    Bonjour,
    J'ai avancé dans ce projet en question.

    J'ai commencé par générer plusieurs feuilles qui dupliquent ma TRAME. J'obtiens 1 feuille par mois avec la trame. Mais j'obtiens des choses qui me posent problème.

    1. Un temps long d’exécution qui est aléatoire (est-ce un problème de variable?)

    2. des erreurs au mois de janvier comme si les références étaient perdues (uniquement cette feuille).

    3. Une exécution très ralentie de l'application de mes listes déroulantes.


    Le "nouveau code" dont l'existence semble perturber l'exécution est le suivant :

    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
     
    Sub Copies_Feuil()
     
    Dim i%
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
        For i = 1 To 12
            Sheets("TRAME").Copy after:=Sheets(Sheets.Count)
            ActiveSheet.Name = MonthName(i)
            ActiveSheet.Range("B1").Range("A1") = DateSerial(Year(Date), i, 1)
            ActiveSheet.Range("B1").Range("A1").NumberFormatLocal = "mmmm"
        Next i
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
     
     
    End Sub
    Quand je stoppe l'exécution du code au bout de 2 min le Déboggage me ramène sur un code qui sert à masquer des lignes et des colonnes dans des conditions (il marchait bien jusque-là)

    Je vous le transmets aussi au cas où ça vienne de là :

    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
    33
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    'empêcher de faire scintiller l'écran pendant l'éxécution du programme
        Application.ScreenUpdating = False
        Dim plage As Range, C As Range, d As Range
     
    ' automatisation de la trame de base
    'masquage des lignes vides lorsque le service n'est pas pourvu en fonction (IDE nuit, ASD)
        Set plage = [a7: a100]
     
        For Each C In plage
     
            If C.Value = "0" Then
                C.EntireRow.Hidden = True
            Else
                C.EntireRow.Hidden = False
            End If
        Next C
        Set plage = Nothing
     
    'masquage de Colonnes pour respect de la longueur des mois (calendrier)
    '(doit être associé àune formule conditionnelle =SI(AD6<>"";SI(MOIS(AD6)=MOIS(AD6+1);AD6+1;"");"")
     
        Set plage = Range("AD5:AF5")
        For Each d In plage
            If d.Value = "" Then
                d.EntireColumn.Hidden = True
            Else
                d.EntireColumn.Hidden = False
            End If
        Next d
        Set plage = Nothing
        Columns("AG").EntireColumn.Hidden = True
    Merci pour votre aide.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Au lieu de copier les onglets, pourquoi ne copies-tu pas le fichier lui-même ?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Remarques à prendre avec précautions:

    - Je ne vois pas de condition sur votre procédure Private Sub Worksheet_Change(ByVal Target As Range) ni de potentiel Application.EnableEvents = False
    - J'ai peur que le fait de masquer des colonnes soit considéré comme une modification de la feuille (?) et que la procédure boucle sur elle-même
    - Je vous propose de positionner un Flag du style "WS_change e" en Booleen et de faire le traitement dans une autre procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    ' Set Ws_change to True when sheet cells changed (excluding the log about .... the change)
     
        If Application.Intersect(Target, Sh.Range("A1:Z5")) Is Nothing Then WS_change = True
     
    End Sub
    et de faire un traitement séparé du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
     
        Dim Msganswer As String
     
        If WS_change = True Then
     
            On Error GoTo Err1
     
            Application.EnableEvents = False
            Application.ScreenUpdating = False
     
                ' Write the modifications log
            Call Write_Wsh_Info(Sh, "J1")
    ...

  5. #5
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut
    Bonsoir,

    Citation Envoyé par Menhir Voir le message
    Au lieu de copier les onglets, pourquoi ne copies-tu pas le fichier lui-même ?
    Simplement parce que l'on travaille avec un fichier = 1 service et une feuille=1mois pour pas avoir 40fichiers pour pas se perdre dans les dossiers et sous dossiers.

    J'ai réussi avec une aide d'une valeur inestimable :

    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
    Sub Copies_Feuil()
        Dim i%
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
        For i = 1 To 12
            Sheets("TRAME").Copy after:=Sheets(Sheets.Count)
            ActiveSheet.Name = MonthName(i)
            ActiveSheet.Range("B1").Range("A1") = DateSerial(Year(Date), i, 1)
            ActiveSheet.Range("B1").Range("A1").NumberFormatLocal = "mmmm"
        Next i
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
     
     
    Application.Dialogs(xlDialogSaveAs).Show (Range("B2").Value & ".xls")
     
    End Sub

    Au moins avec ça je peux avoir de nouvelles feuilles et choisir d'enregistrer un fichier par service.

    En revanche je me demandais s'il était possible de faire ce même principe pas pour l'enregistrement? J'ai essayé avec des échecs successifs ...

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Bin... Si tu t'étais fait un fichier avec tes 12 mois à la main et que tu le gardes comme template pour en faire un nomveau chaque année (en changeant juste l'année sur le premier onglet), je pense que tu aurais gagné ton temps.

    En mettant en B1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =STXT(CELLULE("nomfichier";B1);CHERCHE("]";CELLULE("nomfichier";B1))+1;1000)
    Pour que cette cellule affiche le nom de l'onglet.

    Il y a une chose qui m'étonne dans ton code, ce sont les : ActiveSheet.Range("B1").Range("A1")
    Je pense que le second Range est inutile.

    En revanche je me demandais s'il était possible de faire ce même principe pas pour l'enregistrement? J'ai essayé avec des échecs successifs ...
    Je ne comprends pas ta question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bibliotheque statique à partir d'une dynamique
    Par hebus44 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/05/2009, 00h18
  2. Générer du contenu statique à partir d'une jsp
    Par xtope dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 25/02/2009, 18h14
  3. [phpToPDF] Générer un pdf à partir d'une page dynamique php
    Par MayaNeo dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/06/2007, 20h33
  4. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 19h55
  5. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32

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