XL 2013 Plusieurs macros, plusieurs fichiers, même répertoire

JBond13600

XLDnaute Junior
Bonjour le Forum,

Alors voilà, j'ai 3 macros qui fonctionnent et 25 fichiers qui ont la même structure. Le tout dans un même répertoire.

J'applique ces 3 macros successivement à ces 25 fichiers et ceci de manière régulière.

Le code vba qu'il me faudrait aurait l'objectif suivant :

1/-Dans le répertoire en cours,
2/- Ouvre la macro 1 "Nom de la macro 1"
3/- Ouvre le fichier 1 "Nom du fichier 1"
4/- Applique la macro 1 au fichier 1
5/- Ferme le fichier 1
6/- Ouvre le fichier "Nom du fichier 2"
7/- Applique la macro 1 au fichier 2
8/- Ferme le fichier 2... jusqu'au 25me fichier.
9/- Ferme la macro 1

10/- Ouvre la macro 2 "Nom de la macro 2"
11/- Ouvre le fichier 1 "Nom du fichier 1"...

Merci de votre aide.
 

JBond13600

XLDnaute Junior
J'ai voulu dire fichier n°1 qui s'appelle "Combis C Test" sur lequel doit s'appliquer la macro
et le fichier n° 2 qui s'appelle "CompterEcarts"
En ouvrant le fichier "CompterEcarts" où se trouve la macro puis en ouvrant le fichier à traiter "Combi C" puis en allant dans macro exécuter , la macro s'applique normalement.
Elle a pour fonction de comptabiliser les Ecarts entre les (0) de la colonne "I" et de les reporter dans la colonne "J" d'une part, et de comptabiliser les Ecarts de (*) qui se trouvent après le dernier (0) de la colonne "I" lorsqu'il y en a et de les reporter dans la colonne (K) d'autre part.
 

cp4

XLDnaute Barbatruc
J'ai voulu dire fichier n°1 qui s'appelle "Combis C Test" sur lequel doit s'appliquer la macro
et le fichier n° 2 qui s'appelle "CompterEcarts"
En ouvrant le fichier "CompterEcarts" où se trouve la macro puis en ouvrant le fichier à traiter "Combi C" puis en allant dans macro exécuter , la macro s'applique normalement.
Elle a pour fonction de comptabiliser les Ecarts entre les (0) de la colonne "I" et de les reporter dans la colonne "J" d'une part, et de comptabiliser les Ecarts de (*) qui se trouvent après le dernier (0) de la colonne "I" lorsqu'il y en a et de les reporter dans la colonne (K) d'autre part.
écoute le fichier "CompterEcarts" n'existe pas, "CompterEcarts" est le nom d'une macro existant dans ton fichier Macro CompterEcarts.xlsm .
De plus tu as mis une chiée de feuilles, quelques unes auraient suffi pour faire des tests.
Là ça rame et ça ne m'incite pas vraiment à continuer. D'autant plus que ce sont tes macros.

Pour ma part, tu as voulu ouvrir tes fichiers et déclencher tes différentes macros.
Il me semble que c'est bien ce que fait la macro que je t'ai proposé.
Pour le reste, je n'ai pas compris les tenants et les aboutissants de ta démarche.

Désolé, il faut être plus explicite.
 

ChTi160

XLDnaute Barbatruc
Bonjour JBond13600
Bonjour le Fil ,Le Forum
je vois qu'on avance !
mais moi j'en suis a me demander quelle est la Démarche a suivre
On lance les macros depuis le Fichier "Macro Action TOUT Fichiers" puis on ouvre les fichiers
question 1°
Les fichiers a ouvrir , ont ils tous un Nom qui contient "Combis ..." ou autre ?
que doit on faire à partir de ces fichier qu'on ouvre ? quel est le But ?
car il y a une feuille "Base" et des Feuille "C*" dans chaque Fichier et même dans le Fichier "Macro Action Tout Fichiers"
si tu pouvais expliquer le But de ces macros
Exemple: rapatrier les données de toutes les feuilles d'un classeur dans sa feuille "Base" ou alors dans la feuille "Base" du Fichier "Macro Action TOUT Fichiers" etc
Dans l'attente
Bonne Journée
Amicalement
Jean marie
 

JBond13600

XLDnaute Junior
CP4, dsl pour la terminologie que je devrais formuler de manière plus précise.
Si je nomme le fichier "Macro CompterEcarts" contenant d'ailleurs 2 macros "CompterEcart", c'est uniquement parce ce que l'affichage de mon pc ne permet pas toujours de voir les extensions et donc lorsque je fais précéder le mot "Macro" dans le nom de ce fichier c'est simplement pour signifier qu'il s'agit d'un fichier comportant la macro en question.

Par suite, j'ouvre donc mon fichier macro en question et je traite chacun des fichiers à traiter en les ouvrant les uns après les autres, en allant ensuite dans macro/exécuter, et en les fermant les uns après les autres après traitement. D'où l'intérêt de ta macro pour économiser du temps et un travail laborieux compte tenu du nombre de fichiers à traiter avec chaque macro.

Et c'est bien ce que fait ta macro.

Ce que je ne m'explique toujours pas c'est que les macros que j'intègre dans la tienne et qui marchent toutes lorsque je les utilise de manière individuelle comme je viens de l'expliquer plus haut, certaines ne fonctionne plus à l'intérieur de ta macro !

C'est pour moi exactement la même problématique que tu as résolu plus haut "CopieDonnéesBaseDansFeuilles".
En traitement individuel, elle fonctionne parfaitement avec "option explicite" et sans déclarer "Dim lg as long"

Pour le problème de ma macro "ComperEcarts", elle marche de manière individuelle dans la procédure que j'utilise que que j'explique plus. Il y a donc peut être dans ma macro un fonction utilisée qui n'est pas compatible avec la tienne qui marche pourtant avec d'autres de mes macros, je ne sais pas.

En fichier joint les mêmes fichiers avec moins de feuilles à traiter dans le 2me.
Si tu ouvres le 1er fichier contenant ma macro, puis le 2me fichier à traiter selon la procédure que je suis et expliquée plus haut cela fonctionne.

Et quand je fais un copier/coller de cette même macro dans la tienne elle ne fonctionne pas !!!

C'est ça le truc que je n'arrive pas à comprendre...
 

Pièces jointes

  • Macro CompterEcarts.xlsm
    102.5 KB · Affichages: 29
  • Combis C Test.xlsx
    27.2 KB · Affichages: 25

cp4

XLDnaute Barbatruc
Re,
Notre ami Chti160 a posé des questions pour repartir du bon pied comme on dit, et auxquelles tu n'as pas répondu.

Attends là ça ne va pas. On reprend ta problématique, tu ouvres tes 2 derniers fichiers et tu exécutes ta macro ci-dessous sans préciser quel est le classeur actif alors que tu as 2 fichiers ouverts.
C'est pour cette raison que je t'ai demandé sur quel fichier tu veux que ta macro agisse.
Dans ton code tu parcours toutes d'un fichier (classeur) mais lequel? tu ne le précises dans le code.
VB:
Sub CompterEcarts()
    Dim ws As Worksheet, ec%, i%
    Application.ScreenUpdating = False
    For Each ws In Worksheets 'ici feuilles de quel fichier
        With ws.Columns("I")
            If .Cells(1, 1) <> "" Then i = 1 Else i = 2
            Do While .Cells(i, 1) <> ""
                If .Cells(i, 1) = "*" Then
                    ec = ec + 1
                ElseIf .Cells(i, 1) = 0 Then
                    .Cells(i, 2) = ec: ec = 0
                End If
                i = i + 1
            Loop
            If ec > 0 Then .Cells(i - 1, 3) = ec: ec = 0
        End With
    Next ws
End Sub
Stp, si tu veux qu'on t'aide réponds exactement aux questions.
 

cp4

XLDnaute Barbatruc
si ta macro doit agir sur le fichier ouvert par code (Combis C Test.xlsx), voir ta macro corrigée
VB:
Sub CompterEcarts()
    Dim ws As Worksheet, ec%, i%
    Application.ScreenUpdating = False
    With ActiveWorkbook 'on travaille sur le classeur actif
        For Each ws In Worksheets
            With ws.Columns("I")
                If .Cells(1, 1) <> "" Then i = 1 Else i = 2
                Do While .Cells(i, 1) <> ""
                    If .Cells(i, 1) = "*" Then
                        ec = ec + 1
                    ElseIf .Cells(i, 1) = 0 Then
                        .Cells(i, 2) = ec: ec = 0
                    End If
                    i = i + 1
                Loop
                If ec > 0 Then .Cells(i - 1, 3) = ec: ec = 0
            End With
        Next ws
    End With
End Sub
ta macro CopieDonnéesBaseDansFeuilles met un temps fou à s’exécuter. Je n'ai pas compris tu effectue toutes ces vérifications. Mais bon...
 

JBond13600

XLDnaute Junior
Salut le forum, Salut C, Salut Jean Marie,

J'ai tout repris depuis le début en essayant d’être le plus clair possible et en essayant de tenir compte de toutes vos remarques et de peser chaque mot employé (Cela a été long mais tout est complètement détaillé) :

1/- Il est vrai que dans le fichier « Macro Action Tous Fichiers » les onglets ne servent à rien. Ce fichier ne fait que contenir la macro à appliquer sur l’ensemble des fichioers contenus dans un même répertoire et elle le fait.

2/- J’ai 3 types de fichiers qui ont tous la même structure avec une Feuille nommée « Base » dans laquelle se trouvent l’ensemble des données à traiter et d’autres feuilles vides.

3/ Dans la feuille « Base », ces données sont réparties dans les colonnes de « A » à « I ».

4/- Seule la colonne « A » et le nom des feuilles sont différentes selon le type de fichier.

5/- Pour le premier type de fichiers, dans un même répertoire se trouvent les fichiers de type « C ». Ces fichiers s’appelent tous « Combis C de quelque chose » (Combis C de 1 ; Combis C de 2 ; Combis C de 3…). Il y en a 9, appelés « Combie C de 1 » à « Combis C de 9 ».

Dans la feuille « Base » de tous ces fichiers, la colonne « A » contients des codes qui vont de « C1 » à « C8 ». La colonne « F » contient des chiffres de « 1 » à « 9 ». La colonne « I » contient des (*) ou des (0).

Dans le fichier « Combis C de 1 » les (0) de la colonne « I » correspondent à chaque chiffre « 1 » rencontrés en colonne « F », les (*) de la colonne « I » correspondent à tous les autres chiffres différents de « 1 » rencontrés en colonne « F ».

De la même manière dans le fichier « Combis C de 2 » les (0) de la colonne « I » correspondent à chaque chiffre « 2 » rencontrés en colonne « F », les (*) de la colonne « I » correspondent à tous les autres chiffres différents de « 2 » rencontrés en colonne « F ». Et ainsi de suite pour les autres fichiers « Combis de… » 3,4,5,6,7,8 et 9.

De fait, les données contenues dans chaque feuille "Base" sont toutes les même à l'exception de la colonne "I" où les (0) seront placés différemment et sur la même ligne qu'un chiffre (1) dans le fichier "Combi C de 1", et la même ligne qu'un chiffre (2) dans le fichier "Combis de 2" etc...

A l’origine, les feuilles de tous ces fichiers contiennent une feuille nommée « Base » avec l’intégralité des données ainsi que des feuilles vides (~200) nommées « C1 », « C2 », « C » »…, « C12 », « C13 », « C14 »… « C123 », « C124 », « C125 »… jusqu’à « C12345678 ».
(Fichier joint « Combis C de 1 » avant application des macros).

Avant application des différentes macros à venir, tous les fichiers sont positionnés sur la feuille « Base ».

L’objet de la première macro nommée « CopieDonnéesBaseDansFeuilles » a pour fonction de ventiler ou copier l’ensemble des lignes (dans leur intégralité) contenues dans la feuille « Base » selon la codification de la colonne « A ».

Ainsi toutes les lignes qui contiennent le code « C1 » en colonne « A » de la feuille « Base » doivent être copiés de manière chronologique dans toutes les autres feuilles du classeur où se trouvent un « 1 » dans leur nom : « C1 », « C12 », « C13 »… « C123 »… « C12345678 ».

Il en va de même pour les lignes contenant les codes « C2 », « C3 »…
(Résultat Obtenu Fichier joint « Combis C de 1 » après traitement1 par la macro "CopieDonnéesBaseDansFeuilles").

L’objet de la 2me macro nommée « CompterEcarts » a pour fonction, dans chaque feuille du classeur, de compter dans la colonne « I » le nombre de (*) entre chaque (0) en reportant le nombre obtenu dans la cellule correspondante de la colonne « J » d’une part, et de compter, toujours dans la colonne « I », le nombre de (*) à partir du dernier (0) rencontré et de reporter le nombre obtenu dans la cellule correspondante de la colonne « K » d’autre part.
(Résulat Obtenu Fichier joint « Combis C de 1 » après traitement2 par la macro "CompterEcarts").


L’objet de la 3me macro nommée « RécupérerEcartsMax » a pour fonction de récupérer tous les Ecarts de la colonne « J » de toutes les feuilles et de les reporter après avoir trié chaque série de chaque feuille du plus grand au plus petit, dans une nouvelle feuille à créer. Cela se fait actuellement dans la feuille « Base » parce que je n’ai pas encore trouvé comment créer cette nouvelle feuille où les résultats devraient apparaître afin de conserver la feuille « Base » telle quelle. Le résultat obtenu se trouve donc, pour le moment, dans la feuille « Base ».

Le résultat obtenu permet d’avoir sur la ligne « 1 » le nom des feuilles du classeur avec à la suite, dans chaque colonne respective la série d’écarts classés du plus grand au plus petit et donc en ligne 2 tous les Ecarts Maximum de chaque feuille.
(Résulat Obtenu Fichier joint « Combis C de 1 » après traitement3 par la macro "RécupérerEcartsMax").


L’objet d’une 4me macro nommée « RécupérerEcartEnCours » a pour fonction de récupérer les Ecarts de chaque feuille contenus dans leur colonne « K » et de les reporter, ici dans la feuille « Base » pour les mêmes raisons évoquées plus haut, de la même manière que la macro précédente.

Le résultat obtenu permet d’avoir sur la ligne « 1 » le nom des feuilles du classeur avec en ligne « 2 » l’Ecart en Cours correspondant. (Résulat Obtenu Fichier joint « Combis C de 1 » après traitement4 par la macro "RécupérerEcartEnCours").

Pour bien faire pour ces 2 dernières macros il faudrait créer une première feuille supplémentaire pour stocker les Ecarts Maximums, et une deuxième feuille supplémentaire pour stocker les Ecarts en Cours. J’y travaille.


6/- Concernant les 2 autres types de fichiers, c’est strictement la même chose avec pour seules différences la codification de la colonne « A » et le nom des feuilles, ils ont tous la même feuille « Base » avec l’intégralité des données à traiter.

Dans un même répertoire se trouvent les fichiers de type « P ». Ces fichiers s’appellent tous « Combis P de 1 » à « Combis P de 9 »

Dans leur colonnes « A » se trouvent les codifications P5, P6, P7, P8 et P9. Les autres feuilles que celle nommée « Base », s’appellent P5, P6, P7, P8, P9, P56, P57…, P567…, P6789…

Dans un même répertoire se trouvent les fichiers de type « R ». Ces fichiers s’appellent tous « Combis R de 1 » à « Combis R de 6 »

Dans leur colonne « A » se trouvent les codifications R1, R2, R3, R4 R5 et R6. Les autres feuilles que celle nommée « Base », s’appellent R1, R2, R3…, R12…, R346…


Pour la 1re macro, j’ai juste à modifier les codifications « C », « P » ou « R » pour pouvoir l'appliquer à chacun des 3 types de fichiers.

Pour toutes autres macros, elles s’appliquent de la même manière sur les 3 types de fichiers.

Ma manière de fonctionner actuelle, je ne sais si c’est la meilleure, fait que je crée un fichier uniquement pour acceuillir une macro à appliquer manuellement à chaque fichier à traiter.

Et… C’est très long… J’ai renommé mes fichiers contenant une macro strictement du même nom que la macro pour plus de clareté pour vous.

Je pensais qu’en trouvant une macro qui me permettait de lancer ces 4 macros les unes à la suite des autres, cela se ferait sans problème, or force est de constater que ces macros qui marchent toutes individuellement (vous pouvez les tester de manière individuelle comme je le fais moi) ne marchent plus forcément dans une macro qui les regroupe.

J’ai aussi supprimé un grand nombre de feuilles de manière aléatoire pour faciliter les tests.


Voilà, vous savez tout dans le détail. Je pense ne rien avoir oublié.


Merci à vous de votre aide.
 

Pièces jointes

  • Combis de C 1.xlsx
    22.5 KB · Affichages: 30
  • CopieDonnéesBaseCDansFeuilles.xlsm
    90.5 KB · Affichages: 35
  • Combis de C 1.xlsx
    33.8 KB · Affichages: 24
  • CompterEcarts.xlsm
    16 KB · Affichages: 21
  • Combis de C 1.xlsx
    34.3 KB · Affichages: 34
  • RécupérerEcartsMax.xlsm
    68.2 KB · Affichages: 23
  • Combis de C 1.xlsx
    32.9 KB · Affichages: 19
  • RécupérerEcartEnCours.xlsm
    68.1 KB · Affichages: 23
  • Combis de C 1.xlsx
    32.8 KB · Affichages: 21

cp4

XLDnaute Barbatruc
Bonjour,
Je t'avoue que je n'ai pas pu lire jusqu'à la fin ton message#27.
Je n'ai pas compris la démarche de ton usine à gaz.
Pourquoi autant de feuilles dans tes fichiers Combi C... ?
Alors que dans le 1er sur la feuille base, en colonne A, il y a 7 valeurs (C1 à C7)
Ne serai-t-il pas judicieux de limiter tes feuilles?
Faire tourner une macro sur autant de feuilles pour ne rien récupérer ne fait que ralentir le code.

Qu'en est-il du code proposé dans ce post?
 

JBond13600

XLDnaute Junior
Usine à gaz ? :):):)

Il s'agit d'une méthode de jeu testée et qui fonctionne à 200% ;););)

Pour cela que je souhaite maintenant automatiser parce que la gestion journalière me prend beaucoup de temps.

Je te demande simplement de lire la suite jusqu'au bout lorsque tu en aura le temps.

Il y a 8 valeurs de C1 à C8.

Le jeux consiste à "chasser" des écarts qui vont inéluctablement tomber lorsque tu as une vision suffisante sur une période suffisamment longue.

Si tu considères 1 événement qui doit se réaliser inéluctablement parce que tu tu connais son Ecart Max et son Ecart en Cours.
Si tu considères que tu as un budget raisonnable qui te permette de jouer 20 fois sur cet événement selon une grille de financement dont j'ai déjà établi les critères pour ne jamais être perdant sur ce budget raisonnable.
Si tu considères que pour un événement uniquement envisagé de C1 à C8 pour ne rester que sur cet exemple.
Si tu constates que l'événement en C2, par exemple, annonce un Ecart Max de 80, par exemple, que son Ecart en Cours est de 78 et que tu as une capacité de financement faible mais de 20 fois avec une mise de départ à 1€, sachant qu'en terme d'Ecarts tous les records sont fait pour être battus, tu restes avec une capacité de financement qui t'autorise à être au rendez-vous lorsque l'événement arrive, non ?

Si tu considères maintenant et uniquement les événements de C1 à C8, tu n'auras que 8 événements à suivre dans le cours d'une année et pour que la situation décrite pour exemple et explicitée plus haut (Ecart Max de 80, Ecart en cours de 78, et capacité de financement de 20), ils seront rares et le suivi de leurs Ecarts trop fastidieux en proportion.

Si tu veux bien considérer maintenant qu'un événement à "chasser" s'appelle une "Ligne de Chasse à son Ecart". tu n'auras que 8 "Lignes" à chasser.

Si tu combines maintenant toutes les combinaisons possibles qu'il y a avec la C1 à C8 qui donnent chacune une nouvelle "Ligne de Chasse", les "Lignes de Chasse" différentes se démultiplient.

De la C1 à la C8 il y a plus de 200 combinaisons possibles par combinaisons de "C", soit déjà 1200 combinaisons à suivre. Cela commence à devenir intéressant car il y auras toujours 3 ou 4 événements à suivre et sur lesquels commencer à engager des paris avec un risque proche de zéro.

D'où l'intérêt de démultiplier les "Lignes de Chasse" aussi bien pour "C", que pour "P" ou "R".

Je travaille aussi en parallèle sur les Ecarts des Ecarts qui offrent encore d'autre "Lignes de Chasse".

Voici donc pour répondre à ta question de démultiplier les feuilles de chaque fichier.

Quelque soit le temps de traitement des données, je souhaiterais pouvoir appuyer sur un bouton, le soir avant d'aller me coucher, pour que la macro générale m'enclenche toutes les macros nécessaires au traitement des différents fichiers, et qu'à mon réveil tout soit à jour.

Voici donc pour répondre à ta question.

Le projet peux sembler farfelu a priori mais si mes compétences ne sont pas complètement acquises au niveau langage vba, elles le sont en terme de probabilités.

PS1 : Je fais partie d'une génération qui n'aura peu ou pas de retraite et ce projet va compenser
PS2 : J'escompte bien faire aboutir ce projet sur lequel je travaille maintenant depuis 9 ans
PS3 : Si tu peux m'aider à poursuivre ce projet en créant cette macro dont j'ai besoin je t'en remercierais grandement
PS4 : Si tu souhaites découvrir d'autres éléments du projet lui-même, il faudra en faire la demande en message privé auquel je répondrais.

Voilà, je crois que tout est expliqué dans les grandes lignes...

Bonnes fêtes à tous.
 

cp4

XLDnaute Barbatruc
Désolé de te dire que ton projet ne m'emballe pas du tout.
Je ne suis pas allé au bout de ton message (trop long).
Je t'avais demandé de tester le code du post#27.
N'ayant eu aucun retour, je ne peux donc pas t'aider.

Bonne continuation dans ton projet.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG