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
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 à traiterpour 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).ValueIl suffit de faire
If ShtDLS.Cells(6, compteurNumSemaine).ValueA+
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 !
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 SubBonjour Pedro22 !
Tout d'abord merci pour ton message
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 :
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 SubJe 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 !!