Rechercher un texte dans un tableau et remplissage auto

Bonjour,

j'essaie de me faire un fichier excel pour gérer des projets :

  • Une feuille "Planning" où je remplis les différentes tâches du projet, ainsi que le temps prévisionnel pour chaque tâche.
  • Une feuille "Suivi" où jour après jour, je liste le temps passé sur les différentes tâches.
Sur cette même feuille est calculé le nombre d'heures passées sur chaque tâche, ainsi que le jour de début et de fin (réel) de chacune.

Ce que je souhaite faire :

- Remplir automatiquement les données "Réel" de chaque tâche, sur la feuille "Planning" (cases en jaune)

J'ai quelques connaissances sommaires en Macro, je suis capable de modifier pour adapter une macro,

mais je ne suis pas capable de ne partir de rien et de faire cette fonctionnalité.

C'est pour cette raison que je m'adresse à vous, non pas pour me donner une macro "clé en main",

mais pour m'aider dans mon développement.

Merci d'avance à ceux qui prendront le temps de me répondre.

59piratman.zip (5.89 Ko)

bonjour

j'ai jeté un oeil je te propose une solution qui utilise MOD pour selectionner les lignes a remplir et pouvoir ainsi tirer la fonction

53piratman.zip (8.44 Ko)

certainement à ameliorer

cordialement

Bonjour,

Excuses moi mais pourquoi une macro ?

avec des formules "tranquilles"

Bonjour tulipe_3, bonjour michel_m,

je viens de regarder vos réponses, d'abord merci pour l'aide.

Vos 2 propositions se ressemblent, j'entend par là qu'elles utilisent toutes deux la fonction INDEX(...;EQUIV...),

cependant celle de michel_m est plus "propre".

Pourquoi j'ai parlé d'une marco ? Car cette feuille "Planning" est sujette à changer, et en fonction du nombre de tâches et du nombre d'activités, les cellules des temps "Réels" ne sont donc pas forcement les cellules actuellement utilisée pour l'exemple (en Jaune donc.)

Je ne souhaite donc pas avoir des formules dans toutes les cellules des colonnes D,E,F car les temps du "prévisionnel" doivent être rentrées à la main, les cellules correspondantes doivent donc être vide pendant le remplissage du tableau.

Peut-être que la solution serait, qu'une macro recherche les lignes "Réel", et insère la formule que vous avez proposé avec les bonnes références de ligne bien entendu.

Avez-vous une autre proposition, ou pouvez-vous m'aider pour la création de cette macro ?

bonjour

tu peux "nettoyer" avec des formats ou des mfc pour masquer les lignes necessaires au process qui evite le cop/col

bonjour a michel_m

cordialement

Bonjour,

Je regarde pour ta macro (ne sois pas trop pressé: fin d'aprem ou demain matin) mais je ne merttrai pas de formule dans les jaunes.

@+

OK, je patiente, je bosse sur d'autres points de ce projet "planning".

En attendant ta réponse,

bonne journée !

re,

Tout compte fait, en guise d'apéro!

Tu dis...

37piratman-vba.zip (11.73 Ko)

Bonjour à tous,

Une variante

Sub Réel()
Dim Lg%, i%, Lt%
'Macro par Claude Dubois pour "piratman" Excel-Pratique le 12/10/10
Lg = Range("b65536").End(xlUp).Row
Application.ScreenUpdating = False
    With Sheets("Suivi")
        For i = 3 To Lg Step 2
            On Error Resume Next
            Lt = WorksheetFunction.Match(Cells(i, 2), .Range("f:f"), 0)
            On Error GoTo 0
            If Lt > 0 Then
                .Range(.Cells(Lt, "g"), .Cells(Lt, "i")).Copy
                Sheets("Planning").Cells(i + 1, "d") _
                .PasteSpecial Paste:=xlPasteValues
                Application.CutCopyMode = False
                Lt = 0
            End If
        Next i
    End With
End Sub

Amicalement

Claude

54piratman-suivi.zip (16.60 Ko)

RE,

petite erreur dans la partie restitution de la macro( mon excuse!: ...)

correction du code en gras

Option Base 1
Sub reporter_planning()
Dim tablo, nbre As Byte, cptr As Byte, lig As Byte

'-----collecte les données
With Sheets("suivi")
    tablo = .Range("reel")
    nbre = Application.CountA(.Range("taches"))
End With

'----- restitue les données dans les cellules jaunes
Application.ScreenUpdating = False 'fige le défilement de l'écran
With Sheets("planning")
    .Range("report").ClearContents 'nettoie les cellules jaunes
    For cptr = 1 To nbre
        lig = .Columns(2).Find(tablo(cptr, 1), .Range("B2"), xlValues).Row + 1 'ligne jaune correspond à la tâche
        .Cells(lig, 4) = tablo(cptr, 2) 'durée
        .Cells(lig, 5) = [b]tablo(cptr, 3) [/b]'date début
        .Cells(lig, 6) = [b]tablo(cptr, 4)[/b] 'date fin
    Next
End With

End Sub

excuses moi: je crois qu'une petite sieste s'impose

J'ai essayé vos 2 façons différentes, les 2 marchent très bien.

La quelle choisir ? L'avantage de celle de michel_m, c'est qu'on nettoie les anciennes valeurs des lignes "réel",

l'inconvénient, c'est qu'il faut définir des noms pour des plages.

Etant donné que mes lignes "réel" ne seront pas à des positions fixes (le nombre de "tâches" (Colonne B) n'est pas fixe par "Activités" (Colonne A)), il vaut mieux que j'utilise et adapte la macro de dubois.

Je vais chercher comment vider les lignes "réel" en début de macro.

En tout cas merci pour votre aide, je vais tenter d'adapter cette macro sur mon fichier final,

je reviendrai ici en cas de soucis, ou pour mettre le statu "réglé" !

Amicalement,

PS : michel_m : Le code HTML pour mettre en gras la correction n'est pas passée dans ton dernier post, la mise en forme ne passe peut etre pas dans les balises "code" ?!

re,

Je vais chercher comment vider les lignes "réel" en début de macro.

inutile, c'est remis à jour à chaque fois

mais on peut ajouter une option qui efface

Claude

Hummm

En faite je suis déjà de retour, car je viens juste de me rendre compte que la macro de dubois ne marche que si les lignes "Réel" sont toutes à 2 lignes d'intervalle, ce qui ne va pas être le cas : Voir fichier joint

En faite il faudrait que la macro recherche les lignes où le terme "Réel" est présent en colonne C, sans considerer que l'espace entre chacun est le même (j'avoue que c'est de ma faute, mon premier fichier exemple n'était pas assez explicite sur le fait que ce tableau n'est pas "figé")

PS : dubois : Pour l'effacement, c'est nécéssaire dans le cas où une ligne de la feuille "suivi" est éffacé, et donc que la tâche n'apparait plus dans la liste.

-- Mar Oct 12, 2010 3:26 pm --

Je m'auto réponds : il suffit de supprimer "Step 2" dans la boucle FOR pour que ça recherche les "Tâches" sur toutes les lignes et non pas une sur deux. (Je progresse ! )

37piratman-suivi.zip (16.31 Ko)

re,

il faudrait faire apparaitre le nom de l'activité dans la feuille "Suivi"

pour la retrouver.

Claude

Je n'ai pas compris ta réponse, j'en conclus que je me suis mal exprimé auparavant.

Je ne souhaite pas faire d'opérations avec l'activité, alors pourquoi la faire apparaître sur la feuille "suivi" ?

Toujours est-il qu'en prenant exemple sur ta macro, j'ai rajouté le code pour vider les lignes "réel".

Voici le code final :

Sub Réel()
Dim Lg%, i%, Lt%
'Macro par Claude Dubois pour "piratman" Excel-Pratique le 12/10/10
Lg = Range("b65536").End(xlUp).Row
Application.ScreenUpdating = False

    With Sheets("Planning")
        For i = 3 To Lg + 1
            On Error Resume Next
            Lt = WorksheetFunction.Match(Cells(i, 3), Cells(1, 13), 0)
            On Error GoTo 0
            If Lt > 0 Then
                Sheets("Planning").Cells(i, "d").ClearContents
                Sheets("Planning").Cells(i, "e").ClearContents
                Sheets("Planning").Cells(i, "f").ClearContents
                Lt = 0
            End If
        Next i
    End With

    With Sheets("Suivi")
        For i = 3 To Lg
            On Error Resume Next
            Lt = WorksheetFunction.Match(Cells(i, 2), .Range("f:f"), 0)
            On Error GoTo 0
            If Lt > 0 Then
                .Range(.Cells(Lt, "g"), .Cells(Lt, "i")).Copy
                Sheets("Planning").Cells(i + 1, "d") _
                .PasteSpecial Paste:=xlPasteValues
                Application.CutCopyMode = False
                Lt = 0
            End If
        Next i
    End With

End Sub

Je sais que les lignes :

Sheets("Planning").Cells(i, "d").ClearContents
                Sheets("Planning").Cells(i, "e").ClearContents
                Sheets("Planning").Cells(i, "f").ClearContents

peuvent être simplifiées en une seule, mais j'ai tenté :

Sheets("Planning").(Cells(i, "d"), Cells(i, "f")).ClearContents

et ça n'est pas compilable.

Quel est la syntaxe dans ce cas ?

Aussi, pour rechercher le terme "Réel", j'ai utilisé la cellule M1, dans laquelle j'ai écrit "Réel, puis je compare le tableau avec cette cellule, d'où :

            Lt = WorksheetFunction.Match(Cells(i, 3), Cells(1, 13), 0)

Mais, comment écrire directement dans le code (en passant par une variable ou non), le STRING recherché ?

Merci pour l'aide.

re,

Tu risque d'avoir des taches répétitives dans des activités différentes,

d'où ma question.

Tu devrais compléter un peu plus le fichier, qu'on vois mieux la structure finale.

Claude

Voici en pièce jointe le fichier final (sans la macro pour remplir les lignes "Réel").

J'ai supposé qu'une même "tâche" ne peut pas apparaître dans plusieurs "activités".

Comme tu vas le constater, le tableau "planning" est souple, on peut inscrire des "Activités" dans n'importe quelle colonne B, et des tâches dans n'importe quelle colonne E.

-- Mar Oct 12, 2010 4:47 pm --

La différence avec le fichier exemple sur lequel on travaillait, c'est que les données "Réel" à coller dans le Planning,

ne se trouvent plus dans l'onglet "Suivi", mais dans "Temporaire" (Colonne Q à Y)

Bonsoir,

Vois déjà cette macro

Tu devrais éviter les cellules fusionnées qui t'amènerons des ennuis par la suite.

Sub Réel()
Dim Lg%, i%, Lt%
'Macro par Claude Dubois pour "piratman" Excel-Pratique le 12/10/10
Lg = Range("e65536").End(xlUp).Row
Application.ScreenUpdating = False

    With Sheets("Temporaire")
        For i = 31 To Lg
            If Cells(i, "e") <> "" Then
                On Error Resume Next
                Lt = WorksheetFunction.Match(Cells(i, "e"), .Range("q:q"), 0)
                On Error GoTo 0
                If Lt > 0 Then
                    Cells(i + 1, "o") = .Cells(Lt, "r") 'heures
                    Cells(i + 1, "q") = .Cells(Lt, "t") 'début
                    Cells(i + 1, "t") = .Cells(Lt, "w") 'fin
                    Lt = 0
                End If
            End If
        Next i
    End With
End Sub

Claude

Merci dubois,

le code marche très bien dans mon fichier final.

Pour vider les cellules (temps, début et fin "réel"), j'ai utilisé ce code :

    For i = 30 To Lg + 1                    '30  -> Première ligne du tableau
        If Cells(i, "m") = "Réel" Then      '"m" -> Colonne avec "Réel" ou "Prévisionnel"
            On Error Resume Next
            On Error GoTo 0
                Cells(i, "o") = Cells(1, 1) 'Efface la cellule "heures" (Colle le contenu de la cellule A1)
               Cells(i, "q") = Cells(1, 1)  'Efface la cellule "début"  (Colle le contenu de la cellule A1)
               Cells(i, "t") = Cells(1, 1)  'Efface la cellule "fin"    (Colle le contenu de la cellule A1)
        End If
    Next i

Je sais que ce n'est pas "propre", puisque je colle le contenu d'une cellule vide plutôt que d'effacer le contenu,

mais j'ai essayé d'utiliser "ClearContents", mais sans succès.

En tout cas, merci pour ton aide.

Bonjour,

Je me répète, les cellules fusionnées ne t'apporteront que des ennuis,

surtout qu'ici elles sont complètement inutiles !

en plus, çà alourdi le fichier en colonnes et en poids.

c'est la cause que "ClearContents" ne fonctionne pas.

Amicalement

Claude

Rechercher des sujets similaires à "rechercher texte tableau remplissage auto"