XL 2010 Macro recherche valeur d'après une date

Benetop

XLDnaute Nouveau
bonjour,

Etant novice je recherche une aide.

Je possède un fichier Synthèse qui viens faire un récapitulatif de plusieurs données issu de plusieurs fichier sur un serveur.
dans mon fichier Synthèse.

Aujourd'hui j'aimerai avoir une macro pour automatisé tous ça, dans mon fichier Synthèse je renseigne deux date (date début et date de fin) et j'aimerais que la macro vient ouvrir les fichiers sur le serveur et récupère les valeurs entre les deux dates du fichier Synthèse.

Dans le fichier Synthèse:
Les dates sont en C2 et C3.
En colonne "J" l'adresse sur le serveur
En colonne "B" l'info du LEADER issu du fichier suivi onglet Avancement cellule B22.
En colonne "C" l'info du NOM Projet issu du fichier suivi onglet Avancement cellule B21.
En colonne "D" à "I" les info du fichier de suivi onglet Objectifs colonne "D" "K" "R" "AE" "AL" "AS".

Je met en PJ le fichier Synthèse et le fichier de suivi type.
Merci d'avance
 

Pièces jointes

  • Fichier Suivi TEST new.xlsm
    351.1 KB · Affichages: 26
  • Synthese.xlsm
    24.9 KB · Affichages: 8

Nairolf

XLDnaute Accro
Salut,

Quelques remarques et questions :
- les deux fichiers sont bloqués avec des mots de passe, nous sommes donc limités pour faire des essais.
- dans ta synthèse, veux-tu une valeur statique (à l'instant de la mise en route de la macro) ou une valeur dynamique qui évoluera à chaque enregistrement des fichiers source puis mise à jour du fichier de synthèse (à noter que tout n'est pas possible) ?
- Pour les colonnes D à I, dans l'exemple que tu as donné, les dates en C2 et C3 sont supérieures à la date maxi du fichier source, donc le seul retour sera 0 si c'est une somme des valeurs de ces colonnes que tu souhaites.

A noter que beaucoup de choses sont possibles, mais la plupart ont certaines limitations, donc tout dépend du nombre de fichiers source à traiter, de la fréquence du traitement...

Par exemple, si tu souhaites modifier les dates en C2 et C3 plusieurs fois de suite et que tu as beaucoup de fichiers source, ouvrir les fichiers et le traiter pourrait prendre beaucoup de temps à chaque fois.

En première approche, si ce sont des bilans périodiques que tu as besoin (à la semaine par exemple), j'aurais tendance à faire des bilans correspondant dans chaque fichier source, puis de faire une recherche par période (année-numéro de semaine par exemple), cela permet plus de souplesse et ne pas avoir à lancer une moulinette à chaque semaine. Par contre, selon le nombre de données, cela peut être un peu long.
 

Benetop

XLDnaute Nouveau
Salut,
Quelques remarques et questions :
- les deux fichiers sont bloqués avec des mots de passe, nous sommes donc limités pour faire des essais.
- dans ta synthèse, veux-tu une valeur statique (à l'instant de la mise en route de la macro) ou une valeur dynamique qui évoluera à chaque enregistrement des fichiers source puis mise à jour du fichier de synthèse (à noter que tout n'est pas possible) ?
- Pour les colonnes D à I, dans l'exemple que tu as donné, les dates en C2 et C3 sont supérieures à la date maxi du fichier source, donc le seul retour sera 0 si c'est une somme des valeurs de ces colonnes que tu souhaites.
A noter que beaucoup de choses sont possibles, mais la plupart ont certaines limitations, donc tout dépend du nombre de fichiers source à traiter, de la fréquence du traitement...
Par exemple, si tu souhaites modifier les dates en C2 et C3 plusieurs fois de suite et que tu as beaucoup de fichiers source, ouvrir les fichiers et le traiter pourrait prendre beaucoup de temps à chaque fois.
En première approche, si ce sont des bilans périodiques que tu as besoin (à la semaine par exemple), j'aurais tendance à faire des bilans correspondant dans chaque fichier source, puis de faire une recherche par période (année-numéro de semaine par exemple), cela permet plus de souplesse et ne pas avoir à lancer une moulinette à chaque semaine. Par contre, selon le nombre de données, cela peut être un peu long.
 

Nairolf

XLDnaute Accro
Salut,

En considérant la formule suivante en E1 :
Code:
=NBVAL(J7:J30)
Je te propose le code suivant à mettre dans le code d'un command button par exemple :
VB:
Sub AjoutProjet()
    'La variable est de type Variant car elle peut prendre les valeurs :
        'Booleenne: (Vrai/Faux) quand l'utilisateur ne sélectionne rien, ou annule l'opération.
        'String: pour renvoyer le nom du fichier sélectionné.
    Dim Fichier As Variant
 
    'Affiche la boîte de dialogue "Ouvrir"
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
 
    'On sort si aucun fichier n'a été sélectionné ou si l'utilisateur
    'a cliqué sur le bouton "Annuler", ou sur la croix de fermeture.
    If Fichier = False Then Exit Sub
    
    NomFichier = Right(Fichier, Len(Fichier) - InStrRev(Fichier, "\", -1, 1))
    CheminFichier = Left(Fichier, InStrRev(Fichier, "\", -1))
    Fichier = CheminFichier & "[" & NomFichier & "]"
    i = Range("E1")
    
    ActiveSheet.Hyperlinks.Add Anchor:=Range("J" & i + 7), Address:=Fichier, TextToDisplay:=Fichier
    Range("B" & i + 7) = "='" & CheminFichier & "[" & NomFichier & "]AVANCEMENT'!$B$22"
    Range("C" & i + 7) = "='" & CheminFichier & "[" & NomFichier & "]AVANCEMENT'!$B$20"
    Range("D" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$D$10:$D$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("E" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$K$10:$K$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("F" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$R$10:$R$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("G" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AE$10:$AE$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("H" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AL$10:$AL$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("I" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AS$10:$AS$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"

End Sub
Ce code permet d'ajouter une nouvelle ligne de projet avec des formules qui pointent vers le fichier correspondant.
Après, dès que tu changeras les dates, cela sortira les valeurs correspondantes.
 

Benetop

XLDnaute Nouveau
Salut,

En considérant la formule suivante en E1 :
Code:
=NBVAL(J7:J30)
Je te propose le code suivant à mettre dans le code d'un command button par exemple :
VB:
Sub AjoutProjet()
    'La variable est de type Variant car elle peut prendre les valeurs :
        'Booleenne: (Vrai/Faux) quand l'utilisateur ne sélectionne rien, ou annule l'opération.
        'String: pour renvoyer le nom du fichier sélectionné.
    Dim Fichier As Variant

    'Affiche la boîte de dialogue "Ouvrir"
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")

    'On sort si aucun fichier n'a été sélectionné ou si l'utilisateur
    'a cliqué sur le bouton "Annuler", ou sur la croix de fermeture.
    If Fichier = False Then Exit Sub
   
    NomFichier = Right(Fichier, Len(Fichier) - InStrRev(Fichier, "\", -1, 1))
    CheminFichier = Left(Fichier, InStrRev(Fichier, "\", -1))
    Fichier = CheminFichier & "[" & NomFichier & "]"
    i = Range("E1")
   
    ActiveSheet.Hyperlinks.Add Anchor:=Range("J" & i + 7), Address:=Fichier, TextToDisplay:=Fichier
    Range("B" & i + 7) = "='" & CheminFichier & "[" & NomFichier & "]AVANCEMENT'!$B$22"
    Range("C" & i + 7) = "='" & CheminFichier & "[" & NomFichier & "]AVANCEMENT'!$B$20"
    Range("D" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$D$10:$D$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("E" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$K$10:$K$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("F" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$R$10:$R$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("G" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AE$10:$AE$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("H" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AL$10:$AL$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("I" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AS$10:$AS$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"

End Sub
Ce code permet d'ajouter une nouvelle ligne de projet avec des formules qui pointent vers le fichier correspondant.
Après, dès que tu changeras les dates, cela sortira les valeurs correspondantes.


salut,

Waouh franchement je suis sur le c....
Si je comprend bien le bouton me sers à ajouter des projets ?
Et le fichier est toujours à jour car il pointe directement sur les fichiers du serveur c'est bien ça ?
En tous cas un grand MERCI...
Je vais le tester et reviendrais vers toi.
Merci encore pour l'aide.
 

Nairolf

XLDnaute Accro
Salut,

Oui et oui.
Oui, n'hésite pas à faire un retour dès que tu auras testé.

Des petites "améliorations" en plus (rajout de déclaration de variables, utilisation de la variable "Fichier" pour simplifier certaines lignes et correction d'une erreur d'ordre des lignes de commande) :
VB:
Sub AjoutProjet()
    'La variable est de type Variant car elle peut prendre les valeurs :
        'Booleenne: (Vrai/Faux) quand l'utilisateur ne sélectionne rien, ou annule l'opération.
        'String: pour renvoyer le nom du fichier sélectionné.
    Dim Fichier As Variant
    Dim i As Integer
    Dim NomFichier As String
    Dim CheminFichier As String
 
    'Affiche la boîte de dialogue "Ouvrir"
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
 
    'On sort si aucun fichier n'a été sélectionné ou si l'utilisateur
    'a cliqué sur le bouton "Annuler", ou sur la croix de fermeture.
    If Fichier = False Then Exit Sub
    
    i = Range("E1")
    
    ActiveSheet.Hyperlinks.Add Anchor:=Range("J" & i + 7), Address:=Fichier, TextToDisplay:=Fichier
    
    NomFichier = Right(Fichier, Len(Fichier) - InStrRev(Fichier, "\", -1, 1))
    CheminFichier = Left(Fichier, InStrRev(Fichier, "\", -1))
    Fichier = CheminFichier & "[" & NomFichier & "]"

    Range("B" & i + 7) = "='" & Fichier & "AVANCEMENT'!$B$22"
    Range("C" & i + 7) = "='" & Fichier & "AVANCEMENT'!$B$20"
    Range("D" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$D$10:$D$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("E" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$K$10:$K$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("F" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$R$10:$R$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("G" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AE$10:$AE$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("H" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AL$10:$AL$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("I" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AS$10:$AS$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"

End Sub
 

Benetop

XLDnaute Nouveau
Salut,

Oui et oui.
Oui, n'hésite pas à faire un retour dès que tu auras testé.

Des petites "améliorations" en plus (rajout de déclaration de variables, utilisation de la variable "Fichier" pour simplifier certaines lignes et correction d'une erreur d'ordre des lignes de commande) :
VB:
Sub AjoutProjet()
    'La variable est de type Variant car elle peut prendre les valeurs :
        'Booleenne: (Vrai/Faux) quand l'utilisateur ne sélectionne rien, ou annule l'opération.
        'String: pour renvoyer le nom du fichier sélectionné.
    Dim Fichier As Variant
    Dim i As Integer
    Dim NomFichier As String
    Dim CheminFichier As String

    'Affiche la boîte de dialogue "Ouvrir"
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")

    'On sort si aucun fichier n'a été sélectionné ou si l'utilisateur
    'a cliqué sur le bouton "Annuler", ou sur la croix de fermeture.
    If Fichier = False Then Exit Sub
   
    i = Range("E1")
   
    ActiveSheet.Hyperlinks.Add Anchor:=Range("J" & i + 7), Address:=Fichier, TextToDisplay:=Fichier
   
    NomFichier = Right(Fichier, Len(Fichier) - InStrRev(Fichier, "\", -1, 1))
    CheminFichier = Left(Fichier, InStrRev(Fichier, "\", -1))
    Fichier = CheminFichier & "[" & NomFichier & "]"

    Range("B" & i + 7) = "='" & Fichier & "AVANCEMENT'!$B$22"
    Range("C" & i + 7) = "='" & Fichier & "AVANCEMENT'!$B$20"
    Range("D" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$D$10:$D$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("E" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$K$10:$K$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("F" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$R$10:$R$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("G" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AE$10:$AE$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("H" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AL$10:$AL$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"
    Range("I" & i + 7).FormulaLocal = "=SOMMEPROD('" & Fichier & "Objectifs'!$AS$10:$AS$154;('" & Fichier & "Objectifs'!$B$10:$B$154>=$C$1)*('" & Fichier & "Objectifs'!$B$10:$B$154<=$C$2))"

End Sub

Salut,

Je te remercie cela fonctionne super bien.
Une question les fichiers suivi son sur un serveur avec toujours la même adresse au début il y a juste la fin qui change car dans des dossier différents:
exemple:

Lien supprimé 11
Lien supprimé 33

Peut on faire en sorte que lorsque j'ajoute un fichier il vient directement sur le serveur ?
Car actuellement si je ferme le fichier et l'ouvre le lendemain je dois repartir de mon bureau et chercher l'adresse.
 

Nairolf

XLDnaute Accro
Salut,

Tu peux t'inspirer de ceci :
VB:
'Selectionne un disque
ChDrive "C:"
'Selectionne un repertoire sur ce disque
ChDir "C:\Documents and Settings\Default User\Mes documents"
Code à mettre avant :
VB:
Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
 

Benetop

XLDnaute Nouveau
Salut,

Tu peux t'inspirer de ceci :
VB:
'Selectionne un disque
ChDrive "C:"
'Selectionne un repertoire sur ce disque
ChDir "C:\Documents and Settings\Default User\Mes documents"
Code à mettre avant :
VB:
Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")


J'ai mis ceci car les fichiers sot stockés sur un serveur extérieur a mon PC et cela n'a pas l'air de marché:

'Selectionne un disque
ChDrive "\\yvsn0004"
'Selectionne un repertoire sur ce disque
ChDir "\\yvsn0004\SDRMANAG\data\AE"
 

Nairolf

XLDnaute Accro
En fait le code précédent ne fonctionne pas directement avec les liens réseau, il faudrait créer un lecteur...

Cela devrait fonctionner en remplaçant dans le code :
VB:
'Affiche la boîte de dialogue "Ouvrir"
'Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")

Par le code suivant :
VB:
    Dim Dlg As FileDialog

    'Affiche la boîte de dialogue "Ouvrir"
    Set Dlg = Application.FileDialog(msoFileDialogOpen)
    Dlg.InitialFileName = "\\yvsn0004\SDRMANAG\data\AE "
    Dlg.FilterIndex = 2
    Dlg.Show
    Fichier = Dlg.SelectedItems(1)
    Set Dlg = Nothing

A noter que
VB:
Dlg.FilterIndex = 2
permet de ne sélectionner que les fichiers Excel.
 

Benetop

XLDnaute Nouveau
En fait le code précédent ne fonctionne pas directement avec les liens réseau, il faudrait créer un lecteur...

Cela devrait fonctionner en remplaçant dans le code :
VB:
'Affiche la boîte de dialogue "Ouvrir"
'Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")

Par le code suivant :
VB:
    Dim Dlg As FileDialog

    'Affiche la boîte de dialogue "Ouvrir"
    Set Dlg = Application.FileDialog(msoFileDialogOpen)
    Dlg.InitialFileName = "\\yvsn0004\SDRMANAG\data\AE "
    Dlg.FilterIndex = 2
    Dlg.Show
    Fichier = Dlg.SelectedItems(1)
    Set Dlg = Nothing

A noter que
VB:
Dlg.FilterIndex = 2
permet de ne sélectionner que les fichiers Excel.


Super merci cela fonctionne rien a redire excellent.
UN GRAND MERCI...
 

Benetop

XLDnaute Nouveau
En fait le code précédent ne fonctionne pas directement avec les liens réseau, il faudrait créer un lecteur...

Cela devrait fonctionner en remplaçant dans le code :
VB:
'Affiche la boîte de dialogue "Ouvrir"
'Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")

Par le code suivant :
VB:
    Dim Dlg As FileDialog

    'Affiche la boîte de dialogue "Ouvrir"
    Set Dlg = Application.FileDialog(msoFileDialogOpen)
    Dlg.InitialFileName = "\\yvsn0004\SDRMANAG\data\AE "
    Dlg.FilterIndex = 2
    Dlg.Show
    Fichier = Dlg.SelectedItems(1)
    Set Dlg = Nothing

A noter que
VB:
Dlg.FilterIndex = 2
permet de ne sélectionner que les fichiers Excel.

Salut,

Petite question, suite a la macro peut on avoir un bouton qui met a jour le fichier lorsque je clic dessus pour les données qui sont en colonne B et C ?
 

Discussions similaires

Réponses
1
Affichages
431
Réponses
21
Affichages
394

Statistiques des forums

Discussions
312 193
Messages
2 086 058
Membres
103 110
dernier inscrit
Privé