Liaison données vers feuille de données excel

goldrigger -  
 Goldrigger 61 -
Bonjour,

J'ai créer une feuille dans lequel je stock des données. Ces données sont stockées en fonction des jours. Par exemple, le 01/01/2008 , il y a X heure de travail.
Comme cette feuille stock les données de toute l'année, j'ai créer une feuille pour les utilisateurs inscrivent l'heure travaillée par jour. (comme ca ils ne s'embetent pas à rechercher le jour et noter les heures dans la feuille de données).

Dans la nvelle feuille, il y a la date du jour, le nom des personnes et les heures que doivent inscrire les personnes.
Mais le problème c'est que je n'arrive pas à stocker les données inscrites le jour 'J'(dans la feuille d'utilisateur) dans la feuille de données dans la ligne du jour 'J'.
Configuration: Windows XP
Firefox 2.0.0.11
Excel 2003

52 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Le problème est de synchroniser les heures saisies jour par jour dans une feuille utilisateur avec une feuille récapitulative par date et employé, en adaptant les colonnes. Plusieurs solutions évoquées reposent sur un script VBA (Worksheet_Change) qui localise la ligne par date et la colonne par employé, puis copie les heures. Des intervenants proposent d'ajouter dynamiquement des colonnes, de commenter le code et même de générer automatiquement la feuille récap, en décomposant les saisies en plusieurs cellules. Une autre approche envisage l'agrégation des heures (fin − début) plutôt que leur stockage brut, tout en posant des questions sur la structuration et l'utilité des données.

Bobot (l'IA à votre service)
  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Ton problème est bien exposé mais comme tu ne fourni pas beaucoup d'informations sur la structure que tu as adoptée c'est difficile de te fournir une piste.

    Tu as probablement une feuille de saisie journalière et une récap par utilisateur mais quel lien est-il possible ?
    0
  2. goldrigger
     
    Salut gbinforme,

    En fait j'ai deux feuilles dans le classeur: - 1 feuille ou je stock les données
    - 1 feuille de saisie par l'utilisateur

    Dans la feuille de stockage il y a - 1 colonne ou je met les jours du mois (01/01/08 à 31/01/2008)
    - 1 colonne pour les heures travaillées (ex: 8H pour le 01/01/2008)

    Dans la feuille de saisie j'ai: - le jour ( formule aujourdhui())
    - le nom de la personne
    - les heures travaillées ( ex 8 H pour le jour d'aujourd'hui)

    Et donc je veux que les heures inscrits dans la feuille de saisie , soit transférer dans la colonne des heures (dans la feuille de stockage) dans la ligne de la date du jour.

    Peut -etre que l'on peut se servir de recherchev() ?
    Si le jour (dans la feuille de saisie) est égale à jour (dans la feuille de stockage) , alors inscrire heures travaillé dans la (colonne +1).
    Je sais pas si ca peut marcher.
    0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    La formule aujourdhui() est difficilement utilisable avec recherchev car elle est volatille et le lendemain est un autre jour.

    Dans la feuille de stockage que devient le nom de la personne ?

    Il manque pas mal de données pour faire le bon choix, même si a priori je pense que le mieux serait d'utiliser une macro événementielle : lorsque tu saisis les heures, en fonction du jour et de la personne on reporte dans le stockage.
    Cela me parait le plus adapté mais il faudrait connaître le nombre de personnes concernées et la façon de saisir : sur un poste unique ou en réseau ?
    0
  4. goldrigger
     
    Re bonsoir Gbinforme,

    Je vais mettre ce fichier sur en réseau mais partons du principe que c sur un poste unique (si ca peut simplifier)

    Seulement deux personnes sont concernés: X et Y

    En effet, dans la feuille de stockage y'aura 3 colonnes: 1 pour les jours, 1 pour X (heures travaillé pour X) et 1 pour Y (heure travaillée pour Y).

    Dans la feuille de saisie j'ai: - le jour ( formule aujourdhui())
    - les noms (sur 2 lignes: pour X et Y)
    - les heures travaillées ( ex 8 H pour le jour d'aujourd'hui) sur 1 colonne

    Ton idée de macro évenementielle me paraît bonne.
    Mais je vois pas trop comment faire. (je débute en excel)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. goldrigger
     
    Salut gbinforme,

    Merci pour ton exemple.

    Ca correspond bien dans l'ensemble à ce que je voulais faire.
    Mais en fait dans la feuille recap, j'ai tout les jours du mois . C'est pas un problème pour un mois mais comme en plus j'ai tout les mois de l'années sur les colonne qui suivent , il faudrai que je puisse décider du lieu d'écriture du jour.

    J'ai analysé ton programme mais c'est un peu trop compliqué pour moi.
    0
  7. goldrigger
     
    Salut michel_m

    en fait j'ai toutjours pas tester ta solution, c'est parce que je suis en train de travailler sur un programme complet et je réfléchi à plusieurs choses et parfois j'en oubli d'autres.
    Une fois que je l'est tester je te ferai signe ne t'inquiète pas . Bien sûr je comptais te remercier!
    0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    OK, Merci bonne soirée et bon courage pour ton appli

    Cordialement,
    Michel
    0
  9. goldrigger
     
    Bonjour à tous,

    gbinforme, j'ai analysé ton programme mais je comprend pas tout.

    En fait dans la feuille recap, j'ai tout les jours du mois . C'est pas un problème pour un mois mais comme en plus j'ai tout les mois de l'année sur les colonnes qui suivent , il faudrai que je puisse décider du lieu d'écriture du jour.

    Peux-tu m'indiquer la partie de ce code qui a cette fonction et peut-tu commenter les lignes de ce code:

    Private Sub Worksheet_Change(ByVal sel As Range)
    If sel.Column <> 3 Then Exit Sub
    Dim w2 As Worksheet
    Dim c As Integer
    Dim l As Long
    Set w2 = Worksheets("recap")
    For l = 1 To w2.Cells(65536, 1).End(xlUp).Row + 1
    If w2.Cells(l, 1).Value = Date Then Exit For
    Next l
    For c = 1 To w2.Cells(1, 256).End(xlToLeft).Column + 1
    If w2.Cells(1, c).Value = Cells(sel.Row, 1).Value Then Exit For
    Next c
    w2.Cells(l, 1).Value = Date
    w2.Cells(l, c).Resize(1, 3).Value = Cells(sel.Row, 2).Resize(1, 3).Value
    'w2.Cells(l, c).Value = Cells(sel.Row, 2).Value
    End Sub
    0
  10. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Private Sub Worksheet_Change(ByVal sel As Range)
    If sel.Column <> 3 Then Exit Sub 'test de la colonne saisie déclenchant le report
    Dim w2 As Worksheet 'feuille report
    Dim c As Integer 'colonne
    Dim l As Long 'ligne
    Set w2 = Worksheets("recap") 'feuille report
    For l = 1 To w2.Cells(65536, 1).End(xlUp).Row + 1 'recherche ligne date
    If w2.Cells(l, 1).Value = Date Then Exit For 'date présente
    Next l 'si plusieurs colonnes faire varier la colonne
    For c = 1 To w2.Cells(1, 256).End(xlToLeft).Column + 1 'recherche colonne employé
    If w2.Cells(1, c).Value = Cells(sel.Row, 1).Value Then Exit For
    Next c
    w2.Cells(l, 1).Value = Date 'date mise en place
    w2.Cells(l, c).Resize(1, 3).Value = Cells(sel.Row, 2).Resize(1, 3).Value 'heures mise en place
    'w2.Cells(l, c).Value = Cells(sel.Row, 2).Value 'employé mis en place
    End Sub

    Si sur les colonnes tu fait alterner les dates, les heures et les employés tu vas créer un peu le bazar où on trouve tout et pas forcément ce que l'on cherche.
    0
  11. goldrigger
     
    Salut,

    Oui en fait je veux faire ça parce que je veux pas créer 12 feuilles dans un classeur excel.
    Je pense que si je fais une bonne mise en page ça posera pas de problème:

    1 colonne pour les jours,
    3 colonnes pour chaque personne,
    et puis la colonne d'aprés les jours du mois prochain et ainsi de suite.

    Qu'en penses -tu?
    0
  12. goldrigger
     
    salut gbinforme,

    en fait je voudrais rajouter des colonnes pour chaque personne (il y en a 3 actuellement)
    qu'est ce que je dois modif pour que ca marche , cette ligne?

    If sel.Column <> 3 Then Exit Sub
    0
  13. goldrigger
     
    j'arrive pas à rajouter des colonnes.
    j'en ai rajouté mais lorsque je saisi des heures , ces données se retrouvent 4 colonnes aprés.

    Si quelqu'un pouvait me donner l'algorithme en français de ce code, ca me dépannerai.
    Parce que la, je comprend pas les boucles for, if.

    Set w2 = Worksheets("recap") 'feuille report
    For l = 1 To w2.Cells(65536, 1).End(xlUp).Row + 1 'recherche ligne date
    If w2.Cells(l, 1).Value = Date Then Exit For 'date présente

    Next l 'si plusieurs colonnes faire varier la colonne
    For c = 1 To w2.Cells(1, 256).End(xlToLeft).Column + 1 'recherche colonne employé
    If w2.Cells(1, c).Value = Cells(sel.Row, 1).Value Then Exit For
    Next c
    w2.Cells(l, 1).Value = Date 'date mise en place
    w2.Cells(l, c).Resize(1, 4).Value = Cells(sel.Row, 2).Resize(1, 4).Value 'heures mise en place
    w2.Cells(l, c).Value = Cells(sel.Row, 2).Value 'employé mis en place
    End Sub
    0
  14. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Je ne sais pas si j'ai tout compris mais je t'ai fait une nouvelle version qui tiens compte :
    - j'ai mis 5 cellules récupérées par saisie.
    - j'ai fait en sorte que l'on recherche les mois en recap.
    - toute la feuille recap est générée automatiquement.
    - on peut saisir autant d'employés que l'on veux.
    - tout est paramétrable facilement.
    - le mois et les employés sont en ligne 1 : s'il existent on les utilise sinon on les crée.
    - les dates sont en lignes : si elles existent on les utilise sinon on les crée.

    Voilà le fichier : https://www.cjoint.com/?brupmPMLLB

    Si quelqu'un pouvait me donner l'algorithme en français de ce code, ca me dépannerai.
    Je veux bien mais c'est plus long à faire que de t'expliquer si tu ne connais pas un peu les objets utilisés :
    essaie de demander ce que tu ne comprends pas j'essaierais de franciser.
    0
  15. goldrigger
     
    Bonjour,

    Vraiment merci pour ton travail gbinforme!!
    C'est vraiment bien fait.

    Oui en fait, je voudrais comprendre ces lignes:

    If sel.Column <> 5 Then Exit Sub -> 5 pour le nombre de colonne?

    For col = 1 To w2.UsedRange.Columns.Count ' recherche colonne mois
    If w2.Cells(1, col).Value = Format(jour, "mmmm") Then Exit For ' mois présent
    Next col
    If w2.Cells(1, col).Value = "" Then
    w2.Cells(1, col).Value = Format(jour, "mmmm") ' création mois
    End If

    "Pour col de 1 à ???
    "Si valeur ????= ????
    "Ensuite(next?) col ; Pourquoi ca?

    For col = col To w2.UsedRange.Columns.Count ' recherche colonne employé
    If w2.Cells(1, col).Value = Cells(sel.Row, 1).Value Then Exit For
    Next col
    If w2.Cells(1, col).Value = "" Then
    w2.Cells(1, col).Value = Cells(sel.Row, 1).Value ' création employé
    End If

    For c = 0 To 4 ' mise en place heures : 5 cellules
    w2.Cells(lig, col + c).Value = _
    Format(Cells(sel.Row, c + 2).Value, "hh:mm")
    Next c

    "Pour c de 0 à 4
    "?????
    "????

    En fait je vais intégere ces deux feuilles dans un classeur . Y-a-t-il des choses à modifier?
    0
  16. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Quelques explications mais si tu veux des compléments n'hésite pas c'est fait pour cela un forum :
    se faire aider mais pour comprendre et progresser soi-même.

    If sel.Column <> 5 Then Exit Sub -> 5 pour le nombre de colonne?

    Il me semble qu'il y avait l'explication : ' test de la colonne saisie déclenchant le report
    Tant que sur la feuille "saisie" on ne touche pas la colonne E (5) fin de journée, on ne fait pas de modif.

    "Pour col de 1 à ??? : le nombre de colonnes utilisées dans la feuille

    "Si valeur ????= ????
    si la cellule de la première ligne est égale au libellé du mois, il est présent.

    "Ensuite(next?) col ; Pourquoi ca?
    C'est ce que l'on nomme une boucle, on regarde successivement toutes les cellules de la ligne 1 et next ajoute 1 à la variable col.

    For c = 0 To 4 ' mise en place heures : 5 cellules

    "Pour c de 0 à 4
    "?????
    on fait progresser de 0 à 5 pour récupérer les 5 cellules saisies
    si l'on veux en récupérer 2 de plus, il suffit de changer 4 par 6.

    Il faut savoir que c'est de la programmation et comme toute chose, il y a bien sûr des bases à acquérir.
    0
  17. goldrigger
     
    bonsoir,

    oui gbinforme, la programmation quand on y connait pas grand chose, c'est un peu comme du chinois.
    C'est comme une nouvelle langue à apprendre. Il faut pratiquer pour y arriver et se faire aider (merci pour ton aide).

    je voudrais comprendre certaines expressions que tu utilises:

    w2.Cells(1, col): ' c'est la cellule 1 de la colonne col de la feuille 2 ?

    w2.UsedRange.Columns.Count : ' ...

    w2.Cells(65536, col).End(xlUp).Row : ' que signifie' End(xlUp).Row' ?

    Cells(sel.Row, c + 2).Value: ' ....
    0
  18. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    w2.Cells(1, col): ' c'est la cellule 1 de la colonne col de la feuille 2 ?

    c'est la cellule de la ligne 1 de la colonne col (oui) de la feuille 2 (non mais de la feuille définie précédemment : Set w2 = Worksheets("recap") 'feuille report.

    w2.UsedRange.Columns.Count : ' ...

    le nombre (count) de colonnes (columns) utilisées dans la feuille définie précédemment : Set w2 = Worksheets("recap")

    w2.Cells(65536, col).End(xlUp).Row : ' que signifie' End(xlUp).Row' ?

    c'est la dernière (end) ligne (row) utilisée en remontant (xlUp) à partir de la ligne 65536 (maximum lignes d'une feuille avant 2007) sur la colonne col.
    Cela permet de connaitre la dernière ligne utilisée sur cette colonne.

    Cells(sel.Row, c + 2).Value: ' ....

    C'est la valeur (Value) de la cellule (Cells) de la ligne saisie (sel.Row) à partir de la colonne 2 + la valeur de c qui varie de 0 à 4 :
    on récupère les valeurs de la ligne saisie sur les colonnes B (2) à F (2+4).

    Bonne intégration et @+
    0
  19. goldrigger
     
    Ok, c'est déjà plus clair pour moi.

    A+ , je continue à apprendre.
    0
  • 1
  • 2
  • 3