Utilisation de plusieurs macro pr classeurs a plusieur feuils

Résolu
hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   -  
hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

comment je pourais utiliser plusieurs macro en meme temp, pour plusieurs Feuils dans un meme classeur Excel ( chaque macro se lance dans une Feuil)?

12 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Voila ma proposition pour la macro Import :

    Sub Import_Fichier()
    Dim Fichier, Fichier_Ext, Repertoire, Chemin, Chemin_Complet
    Dim Ma_Feuille As Worksheet
    Dim Type_Fichier As String
    
    'fige ecran
    Application.ScreenUpdating = False
    
    For Each Ma_Feuille In Worksheets
        Ma_Feuille.Select
        Fichier = Range("A1").Value
        Type_Fichier = Range("B1").Value
        Chemin = Range("C1").Value
        'Efface le contenu de toutes les cellules de l'onglet actif
        Cells.ClearContents
        Range("A1").Value = Fichier
        Range("B1").Value = Type_Fichier
        Range("C1").Value = Chemin
        
        If Fichier = "" Then
        '   il faut calculer en fonction de la date
            Fichier = "a" & Format(Date, "yyyymmdd")
         End If
        Fichier_Ext = Fichier & Type_Fichier
        Chemin_Complet = Chemin & Fichier_Ext
           
        If Type_Fichier = ".TXT" Then
                    
            'Importation du fichier texte a afficher, premiere cellule a remplir: A2
            'la base du code est obtenu avec l'enregistreur de macro et travaile en fonction
             'du besoin: noms de ficher et repertoire changeant en fonction de la date
            With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & Chemin_Complet, Destination:= _
            Range("$A$2"))
                .Name = Fichier
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .TextFilePromptOnRefresh = False
                .TextFilePlatform = 850
                .TextFileStartRow = 1
                .TextFileParseType = xlDelimited
                .TextFileTextQualifier = xlTextQualifierDoubleQuote
                .TextFileConsecutiveDelimiter = False
                .TextFileTabDelimiter = True
                .TextFileSemicolonDelimiter = False
                .TextFileCommaDelimiter = False
                .TextFileSpaceDelimiter = False
                .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                .TextFileTrailingMinusNumbers = True
                .Refresh BackgroundQuery:=False
            End With
            
        ElseIf Type_Fichier = ".XLSX" Then
            Application.DisplayAlerts = False
            Workbooks.Open Filename:=Chemin_Complet
            Range("A2:AM250000").Copy
            ThisWorkbook.Activate
            Range("A2").Select
            ActiveSheet.Paste
            Workbooks(Fichier_Ext).Close
            Application.DisplayAlerts = True
        End If
        'Selection Donnees importees
        Range("A2:AM8643").Select
        'RAZ tri
        ActiveSheet.Sort.SortFields.Clear
        'Selection tri cle A2 descendant
        ActiveSheet.Sort.SortFields.Add Key:=Range("A2"), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortTextAsNumbers
        'Tri Donnees
        With ActiveSheet.Sort
            .SetRange Range("A3:AM250000")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next Ma_Feuille
    'positionne sur cellule A1
    Range("A1").Select
    'Parametrage interval temps import: ici 3 secondes
    Next_Scan = Now() + TimeValue("00:00:03")
    Application.OnTime Next_Scan, "Import_Fichier"
          
    Application.ScreenUpdating = True
    
    End Sub


    Le principe est le suivant :

    Dans chaque feuille se trouve
    En A1 le nom du fichier sans extension
    En B1 l'extension (.TXT ou .XLSX)
    En C1 le chemin complet y compris le "\" à la fin

    Si A1 est vide il calcule le nom en fonction de la date sous la forme "ayyyymmdd"
    sinon il prend le nom en A1

    Voila j'ai testé cela fonctionne dans tous les cas.

    (Remarque : j'ai pris 250000 lignes cela interdit donc les fichier XLS)

    A tester

    A+
    1
  2. scinarf Messages postés 1183 Statut Membre 294
     
    Bonjour,

    Tout dépend de ce que vous souhaitez faire.

    Pour ma part, j'ai créer une userfom avec le code des macros à l'appuie de bouton.

    Comment sont appelées vos macros ? (par un bouton sur une feuille, par une userform, elles sont automatiques ? )
    0
  3. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    Je ne suis que debuttant dans la programmation sous VBA donc je vous pri de m'excuser si je coopere mal.

    mon macro se lance par un boutton qui permet d'importer des données. comme le chemin vers ces données est different donc chaques Feuils de mon Classeur Excel doit lancer un macro qui fait l'importation des données mais avec different chemins (par exemple) et donc chaque Feuils doit lancer sa propre macro.

    si il est util de mettre le code, je le mets.

    merci pour votre aide
    0
  4. scinarf Messages postés 1183 Statut Membre 294
     
    Alors, si les données a importer ont la même forme il est possible une seule macro avec un chemin d'accès différent selon la feuille de destination.

    Est ce que vous souhaitez ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    il se peut que le chemin vers ces fichiers contenant les données soit differents comme il se peut que ces fichiers soient de formats differents ( fichier excel, fichiers texte,...)
    0
  7. scinarf Messages postés 1183 Statut Membre 294
     
    LA ça complique tout alors si il s'agit de fichier texte ou excel ou autre ...

    Cela dis si vous avez déjà une macro qui récupère les données pour chacune des feuille c'est toujours jouable.
    0
  8. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    en fait ma macro pour le moment ne recupere que des données provenant d'un fichiers texte, je croyais que le fait de changer l'extension dans la macro me permettait de recuperer des données sous une autre forme, ceci n'est-il pas possible?

    je pense qu'il est preferable de vous envoyer le code peut etre que vous y compreniez mieu que moi.
    0
  9. scinarf Messages postés 1183 Statut Membre 294
     
    Oui je veux bien regarder le code, mais cela va certainement me demander un peu de temps...
    0
    1. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
       
      je vous remerci pour le temps que vous m'accordez
      0
  10. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    'Variable utilisable dans tout les codes
    Public Next_Scan As Date

    'Arret du Timer d'import ficher
    Sub Stop_Import()
    On Error Resume Next
    Application.OnTime Next_Scan, "Import_Fichier", , False
    End Sub

    Sub Import_Fichier()
    Dim Fichier, Fichier_Ext, Repertoire, Chemin, Chemin_Complet

    'fige ecran
    Application.ScreenUpdating = False

    'Nom du fichier fonction de la date ex a20121211
    Fichier = "a" & Format(Date, "yyyymmdd")
    'Nom de fichier avec extention: .TXT pour ficher texte
    'correspondant aux nom de fichier attendu
    Fichier_Ext = "\a" & Format(Date, "yyyymmdd") & ".TXT"
    'correspondant aux nom de repertoire attendu
    Repertoire = "\données"
    'A adapter a votre utilisation
    Chemin = "\\xxx.xx.xxx.xx"
    'Ecriture du chemin complet pour acceder au ficher attendu
    Chemin_Complet = Chemin & Repertoire & Fichier_Ext

    Worksheets("Affichage").Activate
    'Efface le contenu de toutes les cellules de l'onglet actif
    Cells.ClearContents

    'Importation du fichier texte a afficher, premiere cellule a remplir: A2
    'la base du code est obtenu avec l'enregistreur de macro et travaile en fonction
    'du besoin: noms de ficher et repertoire changeant en fonction de la date
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & Chemin_Complet, Destination:= _
    Range("$A$2"))
    .Name = Fichier
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    'Selection Donnees importees
    Range("A2:AM8643").Select
    'RAZ tri
    ActiveWorkbook.Worksheets("Affichage").Sort.SortFields.Clear
    'Selection tri cle A2 descendant
    ActiveWorkbook.Worksheets("Affichage").Sort.SortFields.Add Key:=Range("A2"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortTextAsNumbers
    'Tri Donnees
    With ActiveWorkbook.Worksheets("Affichage").Sort
    .SetRange Range("A3:AM250000")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
    'positionne sur cellule A1
    Range("A1").Select

    'Parametrage interval temps import: ici 3 secondes
    Next_Scan = Now() + TimeValue("00:00:01")
    Application.OnTime Next_Scan, "Import_Fichier"

    End Sub
    0
  11. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour,

    Je viens de regarder le problème. Voila ma proposition.

    Si chaque feuille du classeur a un chemin différent et peut avoir un type de fichier différent, je propose de mettre le chemin et le type de fichier dans une cellule de la feuille. Par exemple en A1 et B1.

    Ensuite on boucle sur toutes les feuilles du classeur avec une boucle du type :

    Sub XXX() 
    Dim Ma_Feuille As Worksheet 
    For Each Ma_Feuille In Worksheets 
        Ma_Feuille.Select 
        Chemin = Range("A1").Value 
        Type_Fichier = Range("B1").Value 
        ' 
        ' 
        'Traitement 
        ' 
        ' 
    Next Ma_Feuille


    En fonction du type de fichier si c'est un fichier texte on fait l'import mais si c'est un fichier Excel il suffit de faire un copier coller du type :

    Application.DisplayAlerts = False 
        Workbooks.Open Filename:="XXXXXXX.xls" 
        Range("A2:AM50000").Copy 
        ThisWorkbook.Activate 
        Range("A2").Select 
        ActiveSheet.Paste 
        Workbooks("XXXX.xls").Close 
        Application.DisplayAlerts = True


    J'ai quelques questions :

    1/ Est-ce possible d'avoir le chemin dans la feuille elle-même
    2/Dans la macro on voit que le nom du fichier est calculé avec la date est-ce que c'est le cas ou bien à chaque feuille on connait le nom du fichier ?
    3/Le fichier Excel est-il au format 2003 (.xls), ou au delà (.xlsx)
    4/Dans ce fichier excel quel est la plage de données à récuperer et dans quelle feuille ?

    Avec les réponses à ces questions je peux faire une proposition de macro.

    A+

    Cordialement,
    0
  12. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    Re,

    1- le chemin dans la feuille elle meme ne poserai pas de prebleme.
    2- on effet chaque feuilles pourais avoir un nom differents, le calcul du nom en fonction de la date à étais fait pour un des fichiers selement mais pas tous ont ce type de nom.
    detail: les données sous format textes sont sous la forme de a+date, mais les données sous format excel parviennent d'un autre pc, (pour les recuperer sur le pc source , ils doivent etre telecharger automatiquement puis etre mis sous le reseau ( je nai pas encor chercher une solution a cela) sauf que pour le moment je ne connai pas leur noms.
    3- il est au format (.xlsx).
    4- c'est fichiers peuvent prendre jusqu'a 25000 ligne, selon la frequence de recuperation, les données les plus récentes doivent etre aux dessus, et conecrnant les feuilles l'ordre n'importe pas l'essentiel que les données les plus recente soient misent au dessus pour n'importe quelle feuilles.

    si une reponse n'est pas clair, dites le moi.
    0
  13. hakoko Messages postés 189 Date d'inscription   Statut Membre Dernière intervention   4
     
    merci infiniment!!

    ça a marché pour un premiere essay. je trouve cette solution tres ingenieuse, merci bcp
    0