Aller chercher des valeurs dans un autre fichier avec des conditions

Bonjour à tous,

Je vous sollicite pour un problème que je n'arrive pas à résoudre :

Je possède un fichier d'analyse de pannes (en PJ avec ce message) et des fichiers de bases de données. J'aimerais récupérer certaines lignes de ces bases de données :

- La colonne Q de la base de données correspond aux différents événements qui peuvent arriver. Parmi ces événements, les "PANNE" sont ce que j'ai besoin de récupérer. Ce fichier comporte un nombre énorme de lignes et une dizaine de lignes sont rajouté chaque jour!!

- la colonne C de la base de données correspond au numéro de semaine. Il faut donc que je place les pannes dans le tableau d'analyse en fonction du numéro de semaine (voir PJ pour plus de compréhension)

- La colonne X de la base de données correspond à la durée de la panne.

J'ai donc besoin, avec ces trois colonnes, de remplir le tableau du fichier d'analyse.

voici la macro que j'ai essayé de faire (qui bien sûr ne fonctionne pas ....) :

Sub macrotest()
Workbooks.Open "chemin du fichier de base de données"
Dim ligne As Range
Dim compteurLigneQ As Long
Dim compteurNumSemaine As Long

compteurLigneQ = 2
For Each ligne In Range("Q:Q") 'pour aller chercher toutes les cellules de la colonneQ
    compteurLigneQ = compteurLigneQ + 1 ' pour avoir les lignes qui nous interresse grace au for each
    For compteurNumSemaine = 2 To 64 Step 1 'recherche du numéro de semaine dans le fichier d'analyse pannes
        If Workbooks("BDD secteur1").Worksheets("PERTES").ligne.Value = "PANNE" Then 'aller chercher toutes les pannes existantes dans le fichier BDD
            If Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(6, compteurNumSemaine).Value = Workbooks("BDD secteur1").Worksheets("PERTES").Cells(ligne, 3).Value Then 'condition pour savoir le numéro de la ligne correspondant au numéro de la semaine
                Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(7, compteurNumSemaine).Value = Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(7, compteurNumSemaine).Value + 1 'incrémentation du nombre de pannes
                Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(8, compteurNumSemaine).Value = Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(8, compteurNumSemaine).Value + Workbooks("BDD secteur1").Worksheets("PERTES").Cells(ligne, 24).Value 'addition des valeurs numériques d'heures de pannes
                Exit For
            End If

        End If

    Next
    If IsEmpty(ligne.Value) = True Then 'arreter la boucle For each quand il n'y a plus de valeurs
        Exit For
    End If

Next
ActiveWorkbook.Close
End Sub
17analyse-pannes.xlsx (18.52 Ko)

Si vous pourriez m'aider à voir ou son mes erreurs et à m'aiguiller sur la façon de faire cela serait super sympas.

Je vous remercie d'avance en attendant vos réponses.

Bien à vous !!

Bonjour Dbbs

Je pense qu'il faut commencez par définir vos variables objet pour le classeur à ouvrir et la feuille à traiter

Ensuite sans le fichier d'analyse en question, cela va être compliqué

A+

bonjour BrunoM45,

Tout d'abord merci pour ton attention !!

Ensuite sans le fichier d'analyse en question, cela va être compliqué

Pour ce qui est du fichier analyse que tu as mentionné, ce fichier que j'ai partagé est quasiment le même que l'original (ormis l'absence logique d'élément confidentiel) j'ai juste besoin de savoir comment aller chercher les données du fichier base de données en fonction des contraintes présenté plus tôt et les placer dans les colonnes correspondantes dans le fichier d'analyse en fonction du numéro de semaine.

Je pense qu'il faut commencez par définir vos variables objet pour le classeur à ouvrir et la feuille à traiter

pour les variables voici ce à quoi je pense :

pour la feuil de calcul du fichier d'analyse :

- une variable qui va permettre d'aller chercher le numéro de la semaine dans le fichier d'analyse (compteurSemaine) par exemple. c'est la seule variable qui sera utilisé au sein du fichier d'analyse

pour le fichier de base de données :

- une variable qui va permettre de boucler toute la colonne d'événement (colonne Q) de mon fichier de base de données pour obtenir les lignes ou l'on peut voir le mot "PANNE" et ainsi aller récupérer les données présentent dans d'autres colonnes (C et X) mais sur cette même ligne. Le problème est que je ne sais pas comment l'utiliser.

Je ne vois pas vraiment s'il y a d'autre variable.

Mon problème principal reste la récupération de données

Re,

Désolé, je voulais parler "des fichiers de bases de données"

Pour ce qui est des variables objet, je pensais à ça

Dim ShtP as WorkSheet
Set ShtP = Workbooks("BDD secteur1").Worksheets("PERTES")

Et

Dim ShtDLS as WorkSheet
Set ShtDLS = Workbooks("Analyse pannes").Worksheets("Data ligne semaine")

Comme ça, pas besoin de ce genre de test qui traine en longueur

If Workbooks("Analyse pannes").Worksheets("Data ligne semaine").Cells(6, compteurNumSemaine).Value

Il suffit de faire

If ShtDLS.Cells(6, compteurNumSemaine).Value

A+

Ok merci pour les précisions !!

Je n'ai pas les fichiers de base de données sur moi pour l'instant je ferais un petit exemple demain en début de matinée.

Merci encore pour ta solicitude. On en reparle demain !!

Bonjour à tous!!

Voici un exemple de classeur de base de données :

ce tableau ne comporte pas beaucoup de ligne mais permet d'un peu mieux visualiser mon problème. (le tableau original sur lequel je travail actuellement comporte presque 40 000 lignes)

J'espère que cela vous sera plus utile pour trouver une solution.

En attendant vos réponse!!!

encore Merci d'avance

Bien à vous !

12bdd-secteur1.xlsx (11.88 Ko)

PS : n'hésiter pas à me faire un retour s'il y a des incompréhensions ou des manques dans ce que je vous ai envoyé

Bonjour à tous!!

Je ne sais pas si c'est parce que mon problème est trop compliqué pour parce que vous n'avez pas le temps d'en prendre compte.

Je me permets donc d'humblement reposter un message dans l'espoir qu'une âme charitable puisse m'aider à résoudre ce problème.

Encore merci à tous,

Bien cordialement

Bonjour Dbbs

Merci d'éviter de faire un "up" 24h après le dernier message SVP

Perso j'ai regardé, mais pour moi la structure du tableau d'analyse n'est absolument pas correcte

Je pense qu'il faut repenser votre façon de procéder

A+

Bonjour BrunoM45

Désolé pour ce message de rappel qui a surement été mal prit qui témoigne d'un peu de stress dû au fait que je n'arrive à rien avec ce fichier.

je vais éviter cela à l'avenir

Si je comprends bien le tableau d'analyse est mal formé !!

je vois pas vraiment comment je pourrais le rendre plus acceptable d'un point de vue utilisation.

Peut-être que tu as un exemple ou une façon de faire par rapport à cela qui pourrait surement m'aider.

Merci pour ton aide !!

A+

Bonjour, salut Bruno !

Je rejoins le commentaire de @Bruno, la tableau d'analyse n'est pas des plus pratique (voir quelques conseils ici)...
Je préconise, avec la macro, de ne rapatrier que les infos d'intérêt (semaine et durée panne ?) pour les seules lignes de "PANNE" de la base de données. Pour l'analyse, un TCD devrait ensuite faire l'affaire. En revanche, avez vous quelques part une date de panne plutôt qu'un numéro de semaine ? Ceci permettrait d'une part de distinguer les années, et d'autre part de n'importer que les nouvelles lignes lors de l'actualisation de la macro. C'est aussi plus souple pour l'analyse via le TCD.

Un premier essai :

Sub macrotest()

Dim BDA As Worksheet, Lig As Long, L As Long

Set BDA = ThisWorkbook.Worksheets("BD pannes"): L = 1
Workbooks.Open "chemin\NomFichier.Extension"
With ActiveWorkbook.Worksheets("PERTES")
    For Lig = 2 To .Range("Q" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes de la base de données
        If .Range("Q" & Lig) = "PANNE" Then 'Si la ligne concerne une panne
            L = L + 1 'Compteur ligne fichier destination
            BDA.Range("A" & L) = .Range("C" & Lig) 'Report semaine
            BDA.Range("B" & L) = .Range("X" & Lig) 'Report durée
        End If
    Next
End With
ActiveWorkbook.Close False 'Fermeture base de données sans enregistrer

End Sub

Bonjour Pedro22 !

Tout d'abord merci pour ton message grâce à cela je vois la solution de ce problème qui commence à arriver !!

En revanche, avez vous quelques part une date de panne plutôt qu'un numéro de semaine ?

oui il y a bien une date voila les premières colonnes de mes fichiers de base de données :

image

Pour distinguer les années, on peut donc utiliser soit la colonne A soit les colonnes B et E.

Je préconise, avec la macro, de ne rapatrier que les infos d'intérêt (semaine et durée panne ?) pour les seules lignes de "PANNE" de la base de données.

Désolé de ne pas avoir été assez claire, effectivement je ne souhaite récupérer effectivement que les semaines et les durées de pannes. Après si vous pensez qu'il faut récupérer autre chose, j'écoute vos propositions avec attention !

Bien que je ne puisse modifier les fichiers de bases de données, je peux très bien changer celui d'analyse !

Vos remarques sont donc très intéressantes!

Merci encore pour votre aide et cet avancement

Dans ce cas je vous invite à rapatrier également l'information de la date, qui pourra être intéressante pour les statistiques. De toute façon, le numéro de semaine peut être déduit de la date.

Est ce que le code proposé précédemment est suffisamment compréhensible pour que vous puissiez le modifier par vous même ? Car en l'absence de fichiers de base de données, je ne peux le tester...

Je comprend le code et j'ai essayé de le modifier à ma sauce mais l'erreur "l'indice n'appartient pas à la sélection" s'affiche après avoir ouver le fichier de base de données. J'ai essayé de trouver la source de la pannes de mon coté mais je n'y arrive pas...

Sub macrotest()
'modification
Workbooks.Open "chemin" 'j'ai recup le bon chemin
'modification

Dim BDA As Worksheet, Lig As Long, L As Long

'modification
Set BDA = ThisWorkbook.Worksheets("Nom de la base de données"): L = 1  ' ici j'ai bien récup le nom de la Base De Données
'modification

With ActiveWorkbook.Worksheets("PERTES")
    For Lig = 2 To .Range("Q" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes de la base de données
        If .Range("Q" & Lig) = "PANNE" Then 'Si la ligne concerne une panne
            L = L + 1 'Compteur ligne fichier destination
            BDA.Range("A" & L) = .Range("C" & Lig) 'Report semaine
            BDA.Range("B" & L) = .Range("X" & Lig) 'Report durée
        End If
    Next
End With
ActiveWorkbook.Close False 'Fermeture base de données sans enregistrer

End Sub

Je renvoie le code avec les endroits ou j'ai fait des modification bien mis en valeur. Peut-être que je n'ai pas assez bien compris ton code......

Encore merci

Bien à toi!

Désolé fausse alerte, je viens de trouver le problème!!

Ton code marche parfaitement MERCI énormément !!

Rechercher des sujets similaires à "aller chercher valeurs fichier conditions"