Projet Excel VBA

Bonjour à tous,

Je tente de créer un document excel nécessitant plusieurs macros. Il s'agit d'un tableau dans lequel je vais entrer les heures travaillées sur différents projets et cela quotidiennement.

À chaque nouvelle journée de travail, les données enregistrées le jour précédent seront exportées dans une seconde feuille et la feuille initiale sera effacée pour de nouvelles entrées.

Le tableau initial est susceptible de changer (nouveau projet, nouvelle tâche), ce qui doit obligatoirement provoquer un changement dans le tableau généré quotidiennement.

Le problème est que je ne suis pas suffisamment formé pour mettre en place un tel document. Voilà pourquoi je demande votre aide pour ce sujet.

Le document de base est déjà existant (avec de premiers essais VBA...) et un structogramme est aussi disponible pour donner une meilleure idée du projet.

Je suis ouvert à toute proposition d'aide, que ce soit en soutien ou si l'un d'entre vous se sent de développer cela de son côté, ...

D'avance merci pour votre aide,

Amicalement,

Julien

22structo.pdf (172.26 Ko)

Bonjour,

erreur au lancement

capture d ecran 754

Concrètement, je n'ai pas compris :

  • dans quel onglet tu saisis les informations ?
  • où les infos de la veille sont reportées en début de journée

Bonjour Steelson,

Autant pour moi, j'avais créé un fichier "light" ne comprenant pas de données personnelles et j'ai changé le nom des feuilles sans adapter les macros. C'est mieux maintenant.

Pour répondre à tes questions, voici le fonctionnement:

1. Je remplis le tableau de l'onglet "Source" comme suit:

1.1 Si nécessaire, j'ajoute une ligne pour une nouvelle tâche

1.2 Je renseigne le temps passé sur une ou plusieurs tâches dans les colonnes dont l'en-tête est orange

2. Le jour suivant, la colonne "Total" du tableau source est exportée et ajoutée au tableau déjà existant dans la feuille "Destination". Le nom de la colonne n'est plus "Total", mais la date se trouvant en dessus du tableau Source

2.1 Les "timbrages" enregistrés dans le tableau source sont effacés et la date courante est renseignée dans le titre du tableau (cellule L4 dans mon exemple)

Voilà le fonctionnement général. À cela s'ajoute quelques subtilités de fonctionnement:

- Si le tableau source n'existe pas, il doit être créé lors de la première exportation de la colonne "Total"

- Si une nouvelle entrée est faite dans le tableau source (nouvelle tâche, projet, ...), celle-ci doit également être ajoutée en fin de tableau destination

- Un tri peut avoir lieu dans l'un ou l'autre des tableau. Il est donc important que l'exportation des données du tableau source au tableau destination se fasse en fonction du nom de la tâche

J'espère que ces explications eclairciront le fonctionnement de mon document. À noter également que la partie VBA que j'ai débuté n'est pas forcément nécessaire. Tu peux sans autre l'effacer et débuter "from scratch"!

Merci d'avance pour ton aide!

Amicalement,

Julien

- Si une nouvelle entrée est faite dans le tableau source (nouvelle tâche, projet, ...), celle-ci doit également être ajoutée en fin de tableau destination

- Un tri peut avoir lieu dans l'un ou l'autre des tableau. Il est donc important que l'exportation des données du tableau source au tableau destination se fasse en fonction du nom de la tâche

Voici

  • pour l'ajout d'une nouvelle entrée ... pas encore, mais on le voit dans la mesure où j'ai ajouté (provisoirement) la colonne Destination au tableau source, cela m'évite de trop complexifier le code (j'aime bien quand il reste pur)
  • pour le tri, c'est pris en compte, je reporte pour cela dans source le n° de ligne de destination
Option Explicit

Sub MAJ()
Dim dest As Worksheet, source As Worksheet, donnees As ListObject, i%, col%

    Set source = Sheets("Source")
    Set donnees = source.ListObjects(1)

    Set dest = Sheets("Destination")
    With dest.ListObjects(1)
        .ListColumns.Add
        col = .ListColumns.Count
        .HeaderRowRange(col) = Format([DateActuelle], "dd.mm.yyyy")
        With .ListColumns(col).DataBodyRange
            For i = 1 To donnees.ListRows.Count
                .Rows(donnees.ListColumns("Destination").DataBodyRange.Rows(i).Value).Value = donnees.ListColumns("Total").DataBodyRange.Rows(i).Value
            Next
        End With
        .ListColumns(col).TotalsCalculation = 1
    End With

    Range("Liste_de_taches[[6h]:[20h]]").ClearContents
    [DateActuelle] = Now

End Sub

Steelson,

Merci pour ton aide! C'est un bon début et j'ai découvert de nouvelles choses en VBA en étudiant ton code!

En relisant mon post précédent, je me suis rendu compte que j'ai écrit une bêtise...

- Si le tableau source n'existe pas, il doit être créé lors de la première exportation de la colonne "Total"

Il s'agit en fait du tableau destination....

Le contrôle de la date ainsi que les opérations qui s'en suivent éventuellement ne fonctionne pas comme je le pensais. Je vais tenté d'expliquer plus précisemment comment j'utilise ce fichier :-)

J'ouvre ce document en arrivant au bureau le matin. Tout au long de la journée, je vais remplir les champs du tableau source en y ajoutant des heures de travail et éventuellement de nouvelles tâches. Il arrive bien entendu que je ferme le document au cours de ma journée de travail.

Le lendemain matin, lorsque j'ouvre à nouveau le document (donc [DateActuelle] + 1, +2, +n), l'exportation dans le tableau destination doit se faire. Cette opération ne doit en aucun cas arriver le même jour que [DateActuelle].

J'espère que ce complément te donne une meilleure compréhension!

Merci encore pour ton aide!

Amicalement,

Julien

Cette opération ne doit en aucun cas arriver le même jour que [DateActuelle].

C'est bien le cas !

Private Sub Workbook_Open()
    If [DateActuelle] <> Now Then Call MAJ
End Sub

EDIT : zut, curieux ... je vais regarder ce point que je pensais résolu !

Autant pour moi, c'était Date et pas Now

En relisant mon post précédent, je me suis rendu compte que j'ai écrit une bêtise...

- Si le tableau source n'existe pas, il doit être créé lors de la première exportation de la colonne "Total"

Il s'agit en fait du tableau destination....

je ne sais pas faire (simplement) !

quel intérêt ? il suffit de faire un copier/coller une fois.

Bonjour Steelson,

Merci pour ton aide! En effet, le tableau peut être créé lors de la première ouverture. Dans ce cas, il faudra gérer l'erreur éventuelle de tentative d'exportation. Peut-être y as-tu déjà pensé?

Pour le reste, je suis très content et cela fonctionne parfaitement!

Merci encore pour ton aide!

Amicalement,

Julien

Bonjour,

Je relance ce sujet car j'ai rencontré un problème ce matin à l'ouverture du document: hier, j'ai ajouté une nouvelle tâche dans le tableau source. Cette nouvelle ligne doit être ajoutée au tableau destination avant que le résumé des heures y soit importé. J'ai cependant l'impression que cette partie-ci de la fonctionnalité du tableau ne se trouve pas dans les macros créées précédemment.

Pour info, le problème survient à la ligne suivante de la macro MAJ:

.Rows(donnees.ListColumns("Destination").DataBodyRange.Rows(i).Value).Value = donnees.ListColumns("Total").DataBodyRange.Rows(i).Value

La valeur de i est à ce moment-là égal à "donnees.ListRows.Count" (dans mon cas 73)

Est-ce que quelqu'un (Steelson? ;-)) peut m'aider sur ce sujet?

D'avance merci!

Amicalement

Julien

- Si une nouvelle entrée est faite dans le tableau source (nouvelle tâche, projet, ...), celle-ci doit également être ajoutée en fin de tableau destination

- Un tri peut avoir lieu dans l'un ou l'autre des tableau. Il est donc important que l'exportation des données du tableau source au tableau destination se fasse en fonction du nom de la tâche

Voici

  • pour l'ajout d'une nouvelle entrée ... pas encore, mais on le voit dans la mesure où j'ai ajouté (provisoirement) la colonne Destination au tableau source, cela m'évite de trop complexifier le code (j'aime bien quand il reste pur)

C'est en effet ce que j'avais annoncé ici.

capture d ecran 3

je vais compléter le code

Au temps pour moi! :-)

Merci d'avance pour ton aide précieuse!

Amicalement,

Julien

Voici le complément

Option Explicit

Sub MAJ()
Dim fd As Worksheet, fs As Worksheet, ds As ListObject, dd As ListObject, i%

    Set fs = Sheets("Source")      ' feuille source
    Set ds = fs.ListObjects(1)     ' données source

    Set fd = Sheets("Destination") ' feuille destination
    Set dd = fd.ListObjects(1)     ' données destination

    dd.ListColumns.Add
    dd.HeaderRowRange(dd.ListColumns.Count) = Format([DateActuelle], "dd.mm.yyyy")
    For i = 1 To ds.ListRows.Count
        If IsError(ds.ListColumns("Destination").DataBodyRange.Rows(i).Value) Then
            dd.ListRows.Add
            dd.DataBodyRange.Cells(dd.ListRows.Count, 1) = ds.DataBodyRange.Cells(i, 1).Value
        End If
        dd.DataBodyRange.Cells(ds.ListColumns("Destination").DataBodyRange.Rows(i).Value, dd.ListColumns.Count) = ds.ListColumns("Total").DataBodyRange.Rows(i).Value
    Next
    dd.ListColumns(dd.ListColumns.Count).TotalsCalculation = 1

    Range("Liste_de_taches[[6h]:[20h]]").ClearContents
    [DateActuelle] = Date

End Sub

Génial!

Merci encore une fois pour ton aide! Je vais tester tout cela!

Merci encore!

Amicalement,

Julien

Rechercher des sujets similaires à "projet vba"