A propos VBA Excel

aymenayari Messages postés 1 Statut Membre -  
 Aymen -
Bonjour,
j'ai un fichier qui contien des données brut contenant des mesures OMC dont la taille est trés grande environ "10 giga"
je pu le decomposer en des fichiers excel de petite taille contenant l'ensemble des informations bien sur les informations sont en continuité
Le fichier contien des date, des compteurs (heure,minute,secondes,millième de secondes), des caractères, des symboles (%,_,-,...) bref tous
Problèmes:
je voudrai utiliser le VBA sous excel pour lire l'ensemble des fichiers que j'ai enregistrer sous les noms "test1, test2,test3,...testn" choisir la colonne sur laquelle je veut travailler "la colonne va se poursuivre sur tous les autres fichiers " c'est à dire elle commence de test1 et fini avec testn.
Une fois le fichier lu je voudrai réaliser des opérations telque "somme, soustraction,division,..."
Je veut faire ces opération en mettant des conditions c'est a dire pour une colonne si on arrive a une certaine positions on arrete le calcul.

1 partie : lire la colonne de la variable voulu dans tous les fichiers d'une facon successive
2 parite: realiser une soustraction entre deux colonnes B1 et D1 avec la condition que si on arrive a une certaine possition on fé la somme des valeurs trouvé et on divise/3600
la forme des deux colonnes et la suivante (0:00:01:338,0:00:01:328) c'est a dire je lit ces deux colonnes chacune a part je fé la soustraction entre la date de fin et la date d'arrivé et si j'arrive à la fin de chaque heure 0:01:00:000 je fé sortir la somme de la différence/3600
3 partie représenter les point obtenu par des bar
MErci et si il y 'a quelqu'un qui a une solution je voudrai bien lui donnée tous les detail nécessaire meme l'exemple du fichier que je veut traiter
Configuration: Windows XP
Internet Explorer 7.0

19 réponses

Résumé de la discussion

Problématique centrale : des données brutes réparties sur des fichiers test1 à testn doivent être lues colonne par colonne via VBA, puis soumises à des opérations avec des conditions d’arrêt. Plusieurs réponses proposent de définir variables et d’utiliser Offset pour cibler la colonne souhaitée, puis d’agréger les données filtrées et de diviser la somme par 3600 avant d’écrire le résultat. Certains répondants évoquent l’ouverture séquentielle des classeurs, la création d’un fichier global et l’empilement des résultats via une boucle, ou l’utilisation d’un filtre automatique pour cibler des plages horaires. En cas de difficulté, détails techniques apparaissent sur les liens entre feuilles et les erreurs REF lors des fermetures, avec des conseils de débogage pas à pas pour préciser les causes.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Comme c'est une application complète et très conséquente que tu cherches à faire, c'est difficile de te fournir un canevas précis car il faudrait qu'il tienne compte de la structure des données précise qu'il difficile d'appréhender sans avoir les classeurs.

    C'est un développement tout de même assez conséquent à faire car il faut gérer les classeurs (fermés probablement)
    et créer une structure de classeur pour gérer les regroupements effectués.

    Bon courage.
    0
  2. Utilisateur anonyme
     
    Bonjour,

    Quelques suggestions ...

    Comme toute solution algorithmique, il est souhaitable de décomposer les étapes une par une.
    " Diviser pour mieux règner ".

    1.) Établir la structure des données visé, et créér un objet de type personnalisé pour la manipulation.
    2.) Repérer le répertoire visé contenant tous les fichiers Excels.
    3.) Faire une boucle pour ouvrir/fermer tous les fichiers du répertoire.
    4.) Inclure dans la boucle une fonction de lecture d'une partie du classeur.
    5.) Dans la fonction de lecture, inclure une sous-fonction pour le calcul
    6.) Dans la fonction de lecture, inclure une sous-fonction pour les manipulations.

    Ma méthode est toujours basé sur le concept des poupées russes.

    Très petite poupée dans Petite poupée
    Petite poupée dans Poupéé
    Poupée dans Grande poupée
    Grande poupée dans Très grande poupée.

    Donc il n'est pas facile d'ouvrir la Très petite poupée sans avoir au préalable ouvert
    toute les autres. Il faut donc commencer par ouvrir la Très grande poupée.

    Il en est de même en programmation, procède par étape en commençant par la chose
    la plus simple à faire, jusqu'a te rendre à la plus complexe.

    Structure de données :

    [ date, des compteurs (heure,minute,secondes,millième de secondes), des caractères, des symboles (%,_,-,...) ]

    exemple type sur la lecture des données

    Option Explicit
    
    Type MonData
            LaDate As Date
            LeCompteur As Long
            Lheure As Long
            LaMinute As Long
            LaSeconde As Long
            LaMilliSeconde As Long
            LeCaractere As String
            LeSymbole As String
    End Type
    
    Dim Boite() As MonData
    
    Sub Lecture()
    
        Dim Plage As Range, Cellule As Range, Compteur As Long
        
        Set Plage = Range("A1:A100")
        
        Compteur = 0
        For Each Cellule In Plage
            Compteur = (Compteur + 1)
            ReDim Preserve Boite(Compteur)
            Boite(Compteur - 1).LaDate = Cellule.Offset(0, 0).Value
            Boite(Compteur - 1).Lheure = Cellule.Offset(0, 1).Value
            Boite(Compteur - 1).LaMinute = Cellule.Offset(0, 2).Value
            Boite(Compteur - 1).LaSeconde = Cellule.Offset(0, 3).Value
            Boite(Compteur - 1).LaMilliSeconde = Cellule.Offset(0, 4).Value
            Boite(Compteur - 1).LeCaractere = Cellule.Offset(0, 5).Value
            Boite(Compteur - 1).LeSymbole = Cellule.Offset(0, 6).Value
        Next Cellule
        
        Call CalculPerso
        
    End Sub
    '
    
    Sub CalculPerso()
    
        Dim Boucle As Long
        
        For Boucle = 0 To (UBound(Boite) - 1)
            ' Manuipulation et/ou calcul
        Next Boucle
        
    End Sub
    '
    


    Lupin
    0
    1. Aymen
       
      Merci je vé l'essayer et je t'envéré le résultat le plus tot et encore un grand merci pour votre aide
      je suis débutant dans VBA excel si vous pouvez me guidé dans les étapes qui consiste à passer de excel pour créer ce code
      j'utilise Excel 2007
      pour moi je fé comme ca:
      dans la feuille excel sur laquelle je travaille j'utilise le bouton qui bascule vers l'interface VB
      il y a a gauche la stucture sheet1, sheet2,... et this workbook
      j'appui dessu deux fois une feuille VB s'ouvre pour m'indiquer ce code
      Private Sub Workbook_Open()

      End Sub
      est ce que j'introduit votre code dans cette partie ou comment je fé?
      merci
      0
  3. Utilisateur anonyme
     
    re :

    Il me sera difficile de te guider n'ayant pas encore la version 2007, je suis actuellement
    sour la version 2002. Toutefois voici quelques trucs.

    Il te faudra trouver comment lancer l'enregistreur de macro et apprendre à l'utiliser.

    Sous la version 2002 :

    // Menu Excel / Outils / Nouvelle macro ...

    Donc en procédant par étape, pas à pas, tu lance l'enregistreur de macro,
    une nouvelle barre d'outils apparaît qui te permettra d'arrêter l'enregistrement.
    Tu effectue quelques étapes que tu veux automatiser (pas trop à la fois).

    Ensuite tu va dans l'editeur VBE.

    // Menu Excel / Outils / Visual Basic Editor

    Dans le nouvelle fenêtre, dans la partie de gauche, tu repère le nom de ton classeur de base
    et sous celui-ci tu y trouveras un module portant généralement le nom de [ Module1 ]

    Un double clic ouvrira dans le partie de droit la ou les macros enregistrer.

    Effectue un copier/coller du code ici, et je ferai ce que je peux. Il est à noter
    que je ne suis pas toujours disponible, mais je fais ce que je peux :-)

    Lupin
    0
  4. Aymen
     
    Vrément un grand merci d'avoir consacré un peut de votre temps pour m'aider
    bon j'ai essayer de tester le code ca a pas marché il y a affichage de quelques erreures que j'ai essayer de resoudre
    et j'ai pas pu
    donc je vous envoi en attache un exemple du fichier que je traite c'est une petite partie parceque le fichier que je traite a une taille de 10giga
    donc s'il vous plait si vous pouvez faire quelque chose
    merci et mille fois merci
    je voulais t'envoyé une partie du fichier pour le voire si vous pouvez me donné votre mail ainsi je pourrer t'envoié ce fichier
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Bonjour,

    Malheureusement, à cause des problèmes soulevés par le SPAM,
    je conserve mon adresse courriel confidentiel.

    Mais as-tu réussit a déclencher l'enregistreur de macro et de généré
    ainsi du code, si oui fait un copier/coller du code ici, je regarderai
    comment je puis t'aider.

    Lupin
    0
    1. aymen
       
      Salut
      merci de m'avoir répondu tout le temps j'ai reussi a faire un script qui permet de lire les feuille contenu dans un meme calsseur et de faire le calcul que je veut
      mais le problème qui reste c'est mes fichiers excel sont séparés et c'est moi qui fé le copier coller pour les mettre dans un meme classeur ce qui est génant donc je voudrai bien automatisé les chose et applée les fichiers direct et eeffectué dessu les opérations que je veut et afficher les reultat dans la première feuille
      voici le code que j'utilise
      Sub trafcalc()
      '
      ' trafcalc Macro
      '

      '
      'calcul dans la feuille 1 pour les valeurs inferieurs et égale à une heure

      ActiveSheet.Range("$A$6:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      "<0:01:00:004"
      Range("AP2").Select
      ActiveCell.FormulaR1C1 = "=SUM(C[-37])/3600"


      'calcul dans la feuille 1 pour la deuxième heure Combinaison entre la feuille 1,, 2 et 3


      Sheets("test1").Select

      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:01:00:004", Operator:=xlAnd, Criteria2:="<0:02:00:000"

      Sheets("Feuil1").Select

      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:01:00:004", Operator:=xlAnd, Criteria2:="<0:02:00:000"
      Sheets("Feuil2").Select
      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:01:00:004", Operator:=xlAnd, Criteria2:="<0:02:00:000"

      Sheets("test1").Select
      Range("AP3").Select
      ActiveCell.FormulaR1C1 = "=(SUM(Feuil2!C[-37])+SUM(Feuil1!C[-37])+SUM(test1!C[-37]))/3600"
      'calcul dans la feuille 1 pour la Troisième heure Combinaison entre la feuille 2,,3,,4

      Sheets("Feuil2").Select
      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:02:00:000", Operator:=xlAnd, Criteria2:="<0:03:00:000"
      Sheets("Feuil3").Select
      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:02:00:000", Operator:=xlAnd, Criteria2:="<0:03:00:000"
      Sheets("Feuil4").Select
      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:02:00:000", Operator:=xlAnd, Criteria2:="<0:03:00:000"

      Sheets("test1").Select
      Range("AP4").Select
      ActiveCell.FormulaR1C1 = "=(SUM(Feuil2!C[-37])+SUM(Feuil3!C[-37])+SUM(Feuil4!C[-37]))/3600"
      'calcul dans la feuille pour la quatrième heure Combinaison entre la feuille 2,,3,,4

      Sheets("Feuil3").Select

      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:03:00:000", Operator:=xlAnd, Criteria2:="<0:04:00:000"


      Sheets("Feuil4").Select

      ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      ">0:03:00:000", Operator:=xlAnd, Criteria2:="<0:04:00:000"

      Sheets("test1").Select
      Range("AP5").Select
      ActiveCell.FormulaR1C1 = "=(SUM(Feuil3!C[-37])+SUM(Feuil4!C[-37]))/3600"
      End Sub

      mille merci de m'aider
      0
  7. Utilisateur anonyme
     
    Bonjour,

    Première observation :

    Il n'est pas nécessaire de spécifier la feuille lorsque cell-ci est sélectionné.

        Sheets("Feuil2").Select 
        ActiveSheet.Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _ 
            ">0:02:00:000", Operator:=xlAnd, Criteria2:="<0:03:00:000" 
    


    peut se simplifier par :

        Sheets("Feuil2").Select 
        Range("$A$1:$AN$10000").AutoFilter Field:=2, Criteria1:= _ 
            ">0:02:00:000", Operator:=xlAnd, Criteria2:="<0:03:00:000" 
    


    Et voici un code déjà pondu antérieurement qui permet de sélectionner un dossier cible
    et d'ouvrir les fichier Excel un à un afin d'en importer le contenu (copier/coller).

    Celui-ci bien sur n'est pas codé spécifiquement pour vos besoins, mais constitue une
    bonne base pour effectuer ce que vous souhaité réalisé.

    Option Explicit
    
    Const cteExcel = ".xls"
    Const cte_Fle = "NomDeFeuilleACopier"
    Const cte_Global = "FichierGlobal.xls"
    
    Private Const BIF_RETURNONLYFSDIRS = 1
    Private Const BIF_DONTGOBELOWDOMAIN = 2
    
    Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _
        ByVal lpBuffer As String) As Long
    Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, _
        ByVal lpString2 As String) As Long
    
    Private Type BrowseInfo
        hWndOwner As Long
        pIDLRoot As Long
        pszDisplayName As Long
        lpszTitle As Long
         ulFlags As Long
        lpfnCallback As Long
        lParam As Long
        iImage As Long
    End Type
    '
    
    Sub ImporteClasseurs()
    
        Dim NomFichier As String, NomRepertoire As String
        Dim NomLecteur As String, ListeFichiers() As String
        Dim varFichier As Variant, Boucle As Long
        Dim Repertoire As String, Message As String
        Dim Reponse As Boolean
        
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        
        NomRepertoire = SelectFolder("Sélectionner le répertoire des fichiers Excel à importer :", 0)
        NomLecteur = Mid(NomRepertoire, 1, 1)
        ChDrive (NomLecteur)
        Repertoire = Mid(NomRepertoire, 3)
        ChDir (Repertoire)
        
        Boucle = 0
        varFichier = Dir("*" & cteExcel, vbDirectory)
        Do While varFichier <> ""
            If ((varFichier <> ".") And (varFichier <> "..")) Then
                If Not ((GetAttr(varFichier) And vbDirectory) = vbDirectory) Then
                    Boucle = (Boucle + 1)
                    ReDim Preserve ListeFichiers(Boucle)
                    ListeFichiers(Boucle - 1) = varFichier
                End If
            End If
            varFichier = Dir
        Loop
        
        If (UBound(ListeFichiers) > 0) Then
            Application.Workbooks.Add
            ActiveWorkbook.SaveAs cte_Cumul_Global
            Reponse = EnteteColonne(ListeFichiers(0))
            If (Reponse) Then
                ActiveWorkbook.SaveAs cte_Global
                For Boucle = 0 To UBound(ListeFichiers) - 1
                    ImporteFichier ListeFichiers(Boucle)
                Next Boucle
                ActiveWorkbook.SaveAs cte_Global
        Else
            Message = ""
            Message = Message & "Aucun fichier n'a été trouvé" & vbLf
            Message = Message & "dans le répertoire cible !" & vbLf
            Message = Message & vbLf
            Message = Message & "Vérifié et corriger la situation." & vbLf
            Message = Message & vbLf
            MsgBox Message
        End If
        
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
        
    End Sub
    '
    
    Private Function ImporteFichier(ByVal NomClasseur As String)
    
        Dim strNomFle As String, Limite As Long, Position As Long
        Dim Reponse As Boolean
    
        Application.EnableEvents = False
        Workbooks.Open Filename:=NomClasseur
        Application.EnableEvents = True
        Reponse = ChercheFeuille(strNomFle)
        If (Reponse) Then
            Sheets(strNomFle).Select
            Limite = Range("A65536").End(xlUp).Row
            Rows("2:" & Limite).Select
            Selection.Copy
            Workbooks(cte_Global).Activate
            Position = (Range("A65536").End(xlUp).Row + 1)
            Range("A" & Position).Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Range("A1").Select
            Workbooks(NomClasseur).Activate
            ActiveWorkbook.Close
        End If
        
    End Function
    '
    
    Private Function ChercheFeuille(ByRef NomFle As String) As Boolean
    
        Dim fleFeuille As Worksheet
        
        For Each fleFeuille In Worksheets
            If (InStr(1, fleFeuille.Name, cte_Fle, vbTextCompare) > 0) Then
                NomFle = fleFeuille.Name
                ChercheFeuille = True
                Exit For
            End If
        Next
    
    End Function
    '
    
    Private Function SelectFolder(Titre As String, Handle As Long) As String
    
        Dim lpIDList As Long, strBuffer As String
        Dim strTitre As String, tBrowseInfo As BrowseInfo
        
        strTitre = Titre
        With tBrowseInfo
            .hWndOwner = Handle
            .lpszTitle = lstrcat(strTitre, "")
            .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
        End With
        
        lpIDList = SHBrowseForFolder(tBrowseInfo)
        
        If (lpIDList) Then
            strBuffer = String(260, vbNullChar)
            SHGetPathFromIDList lpIDList, strBuffer
            SelectFolder = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        End If
    
    End Function
    '
    


    Poser les questions qui vous viendront à l'esprit et je tenterai d'y répondre, un pas à la fois
    car je ne suis pas toujours connecter sur commentcamarche.

    Lupin
    0
    1. aymen
       
      salut
      bon j'ai testé le programme il marche mais j'ai du enlevé ces deux lignes dans la partie Sub ImporteClasseurs()

      cte_Cumul_Global
      Reponse = EnteteColonne(ListeFichiers(0))

      parceque ils ne sont pas defini

      une fois exécuté il me donne la main pour choisir le dossier dans lequel il y a les fichiers, il crée un fichier nommé fichierglobal mais qui est vide et il me dit qu'il a pas trouvé auncun fichier xls dans le repertoire sepécifié

      Que faire ??
      MErci
      0
    2. aymen
       
      salut
      Merci pour le programme
      je les tester il y a dans la sub (Sub ImporteClasseurs())
      pour que ca fonctionne j'ai du supprimer ces deux lignes
      cte_Cumul_Global
      Reponse = EnteteColonne(ListeFichiers(0))

      parceque ils ne sont pas defini

      l'exécution aprés me donne la main pour choisir le dossier dans lequels il y a les fichiers a traiter
      mais aprés il crée un nouveau classeur appelé Fichierglobal mais qui est vide et me dit que
      Aucun fichier n'a été trouvé"
      "dans le répertoire cible
      "Vérifié et corriger la situation
      que faire ???
      Merci
      0
  8. Utilisateur anonyme
     
    re :

    Effectivement la partie :

        If (UBound(ListeFichiers) > 0) Then
            Application.Workbooks.Add
            ActiveWorkbook.SaveAs cte_Cumul_Global
            Reponse = EnteteColonne(ListeFichiers(0))
            If (Reponse) Then
                ActiveWorkbook.SaveAs cte_Global
                For Boucle = 0 To UBound(ListeFichiers) - 1
                    ImporteFichier ListeFichiers(Boucle)
                Next Boucle
                ActiveWorkbook.SaveAs cte_Global
        Else
            Message = ""
            Message = Message & "Aucun fichier n'a été trouvé" & vbLf
            Message = Message & "dans le répertoire cible !" & vbLf
            Message = Message & vbLf
            Message = Message & "Vérifié et corriger la situation." & vbLf
            Message = Message & vbLf
            Message = Message & "Merci de votre attention." & vbLf
            Message = Message & vbLf
            MsgBox Message
        End If
    

    doit être remplacé par :
        If (UBound(ListeFichiers) > 0) Then
            Application.Workbooks.Add
            ActiveWorkbook.SaveAs cte_Global
            For Boucle = 0 To UBound(ListeFichiers) - 1
                ImporteFichier ListeFichiers(Boucle)
            Next Boucle
            ActiveWorkbook.SaveAs cte_Global
        Else
            Message = ""
            Message = Message & "Aucun fichier n'a été trouvé" & vbLf
            Message = Message & "dans le répertoire cible !" & vbLf
            Message = Message & vbLf
            Message = Message & "Vérifié et corriger la situation." & vbLf
            Message = Message & vbLf
            Message = Message & "Merci de votre attention." & vbLf
            Message = Message & vbLf
            MsgBox Message
        End If
    


    C'est dans cette section qu'il créé la liste des fichiers Excel trouvés :
        Boucle = 0
        ' Ici le recherche cible seulement les fichier de type [ .xls ] -> ref.: [ cteExcel ]
        varFichier = Dir("*" & cteExcel, vbDirectory)
        Do While varFichier <> ""
            If ((varFichier <> ".") And (varFichier <> "..")) Then
                If Not ((GetAttr(varFichier) And vbDirectory) = vbDirectory) Then
                    Boucle = (Boucle + 1)
                    ReDim Preserve ListeFichiers(Boucle)
                    ListeFichiers(Boucle - 1) = varFichier
                End If
            End If
            varFichier = Dir
        Loop
    


    sous Excel 2002, cette partie fonctionne très bien ???

    Exécute la routine en mode pas à pas !

    // Menu Excel / Outils / Macro...
    Sélectionne le bouton [ Pas à pas détaillé ].

    en survolant les variables avec la souris, une infobulle apparaît avec le contenu de la variable.
    de plus tu peux ajouter un espion sur la variable.

    Clic droit sur la variable / Sélectionne [ Ajouter un espion... ].

    Tel que spécifié dans l'un de mes messages précédent, je ne connais pas les variantes
    de Excel 2007. Il te faudra fouillé un peu [ Google ]

    Lupin
    0
    1. Aymen
       
      Bonjour
      Mille Merci pour le programme que vous am'avez donné il foctionne trés bien
      mais je voudrais si possible ne pas ouvrir mes fichiers Excels parceque j'ai essayer de les ouvrir il prenne trop de temps puisque leurs taille est trop grande Donc il vaut mieux les lire sans les ouvrir pour
      aprés les avoir lu automatiquement toute la totalité des fichiers je vé appliqué dessu le calcul suivant qui consiste a lire chaque fichier faire un filtre sur les durée de connection pour chaque heure et faire un calcul qui sera affiché dans les AP1...APN N est le (nombre de fichier) du classeur Test1
      dans le programme ci dessous j'ai mis la totalité des fichiers pour la raison que je sais pas ou fini chaque heure de connection et dans quel fichier voici un exemple du format que je traite
      0:00:01:338
      0:00:01:396
      0:00:01:506
      0:00:01:555
      0:00:01:599
      0:00:01:760
      0:00:01:966
      0:00:02:033
      0:00:02:138

      puisque je maitrise pas trop le VBA j'ai pas su faire une boucle pour faire en meme temps le filtrage et le calcul
      S'il vous si vous pouvez m'aider comme d'habitude et vraiment je sais plus comment vous remercié
      mon mail c'est aymen.ayari@gmail.com si vous voulez me contacter directement


      le programme que j'ai fé est le suivant



      Sub calcul()
      '
      ' calcul Macro
      '

      '

      'calcul pour la premiere heure

      ActiveSheet.Range("$A$6:$AN$10000").AutoFilter Field:=2, Criteria1:= _
      "<1:00:00:000", Operator:=xlAnd
      Range("AP2").Select
      ActiveCell.FormulaR1C1 = "=(SUM(C[-37]))/3600"

      'calcul pour la deuxième heure

      Windows("test1.xls").Activate
      Range("AP3").Select

      Windows("test2.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">1:00:00:000", Operator:=xlAnd, Criteria2:="<2:00:00:000"

      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test1.xls!C5)+SUM(test2.xls!C5))/3600"

      'calcul de troisième heure

      Windows("test1.xls").Activate
      Range("AP4").Select
      Windows("test2.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">2:00:00:000", Operator:=xlAnd, Criteria2:="<3:00:00:000"
      Windows("test3.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">2:00:00:000", Operator:=xlAnd, Criteria2:="<3:00:00:000"

      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test2.xls!C5)+SUM(test3.xls!C5))/3600"

      'calcul de la quatrième heure
      Windows("test1.xls").Activate
      Range("AP5").Select
      Windows("test3.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">3:00:00:000", Operator:=xlAnd, Criteria2:="<4:00:00:000"
      Windows("test4.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">3:00:00:000", Operator:=xlAnd, Criteria2:="<4:00:00:000"

      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test3.xls!C5)+SUM(test4.xls!C5))/3600"

      'calcul de la 5 heure
      Windows("test1.xls").Activate
      Range("AP6").Select
      Windows("test3.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">4:00:00:000", Operator:=xlAnd, Criteria2:="<5:00:00:000"
      Windows("test4.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">4:00:00:000", Operator:=xlAnd, Criteria2:="<5:00:00:000"

      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test3.xls!C5)+SUM(test4.xls!C5))/3600"
      'calcul de la 6me heure
      Windows("test1.xls").Activate
      Range("AP7").Select
      Windows("test3.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">5:00:00:000", Operator:=xlAnd, Criteria2:="<6:00:00:000"
      Windows("test4.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">5:00:00:000", Operator:=xlAnd, Criteria2:="<6:00:00:000"

      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test3.xls!C5)+SUM(test4.xls!C5))/3600"
      'calcul de la 7me heure
      Windows("test1.xls").Activate
      Range("AP8").Select
      Windows("test4.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test5.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"

      Windows("test6.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test7.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test8.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test9.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test10.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test11.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test12.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test13.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test14.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test15.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test16.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"

      Windows("test17.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test18.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test19.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test20.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test21.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test22.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test23.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test24.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test25.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test26.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test27.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test28.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test29.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test30.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test31.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test32.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test33.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test34.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test35.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test36.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test37.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test38.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test39.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test40.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test41.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test42.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test43.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test44.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test45.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test46.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test47.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test48.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test49.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test50.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test51.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test52.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test53.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
      Windows("test54.xls").Activate
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, Criteria1:= _
      ">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"



      Windows("test1.xls").Activate
      ActiveCell.FormulaR1C1 = "=(SUM(test4.xls!C5)+SUM(test5.xls!C5)+SUM(test6.xls!C5)+SUM(test7.xls!C5)+SUM(test8.xls!C5)+SUM(test9.xls!C5)+SUM(test10.xls!C5)+SUM(test11.xls!C5)+SUM(test12.xls!C5)+SUM(test13.xls!C5)+SUM(test14.xls!C5)+SUM(test15.xls!C5)+SUM(test16.xls!C5)+SUM(test17.xls!C5)+SUM(test18.xls!C5)+SUM(test19.xls!C5)+SUM(test20.xls!C5)+SUM(test21.xls!C5)+SUM(test22.xls!C5)+SUM(test23.xls!C5)+SUM(test24.xls!C5)+SUM(test25.xls!C5)+SUM(test26.xls!C5)+SUM(test27.xls!C5)+SUM(test28.xls!C5)+SUM(test29.xls!C5)+SUM(test30.xls!C5)+SUM(test31.xls!C5)+SUM(test32.xls!C5)+SUM(test33.xls!C5)+SUM(test34.xls!C5)+SUM(test35.xls!C5)+SUM(test36.xls!C5)+SUM(test37.xls!C5)+SUM(test38.xls!C5)+SUM(test39.xls!C5)+SUM(test40.xls!C5)+SUM(test41.xls!C5)+SUM(test42.xls!C5)+SUM(test43.xls!C5)+SUM(test44.xls!C5)+SUM(test45.xls!C5)+SUM(test46.xls!C5)+SUM(test47.xls!C5)+SUM(test48.xls!C5)+SUM(test49.xls!C5)+SUM(test50.xls!C5)+SUM(test51.xls!C5)+SUM(test52.xls!C5)+SUM(test53.xls!C5)+SUM(test54.xls!C5))/3600"


      'calcul de la 8me heure

      'calcul de la 9me heure

      'calcul de la 10e heure

      'calcul de la 11me heure
      'calcul de la 12me heure
      'calcul de la 13ème heure
      'calcul de la 14ème heure
      'calcul de la 15me heure
      'calcul de la 16me heure
      'calcul de la 17me heure
      'calcul de la 18me heure
      'calcul de la 19me heure
      'calcul de la 20me heure
      'calcul de la 21me heure
      'calcul de la 22me heure
      'calcul de la 23me heure
      'calcul de la 24me heure






















      End Sub
      0
  9. Utilisateur anonyme
     
    re :

    Lire dans un fichier fermé !!!

    Voir ici : http://excelabo.net/ Il y a plein d'exemple à ce sujet !

    Toutefois, tu n'est pas obligé d'ouvrir tous les fichiers en même temps, il est possible de le ouvrir
    un à un en y faisant le traitement souhaité sans faire afficher les opérations exécuté.

    Sub OuvrirFermer()

    Application.ScreenUpdating = False
    Workbooks.Open "test4.xls"
    ' Traitement, ex recherche et sommation des heures
    ActiveWorkbook.Close
    Application.ScreenUpdating = True

    End Sub

    Voici les recherches opérées sur les 50 fichiers de [ test4.xls ] à [ test54.xls ] pour la 7 ième heure.

    Option Explicit
    
    Sub Calcul_7Hre()
    
        Dim Boucle As Long
        Dim NomFichier As String
    
        ' Calcul de la 7e heure
        Windows("test1.xls").Activate
        Range("AP8").Select
        
        For Boucle = 4 To 54
            NomFichier = "test" & Boucle & ".xls)"
            ' Ici j'ouvrirais le fichier
            'Workbooks.Open NomFichier
            ' Au lieu de l'activer
            Windows(NomFichier).Activate
            Range("B1").Select
            ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
                Criteria1:=">6:00:00:000", Operator:=xlAnd, Criteria2:="<7:00:00:000"
            ' Ici je fermerais le fichier
            'ActiveWorkbook.Close
        Next Boucle
    
        Windows("test1.xls").Activate
        ActiveCell.FormulaR1C1 = "=(SUM(test4.xls!C5)+SUM(test5.xls!C5)+SUM(test6.xls!C5)+SUM(test7.xls!C5)+SUM(test8.­xls!C5)+SUM(test9.xls!C5)+SUM(test10.xls!C5)+SUM(test11.xls!C5)+SUM(test12.xls!C5)+SUM(tes­t13.xls!C5)+SUM(test14.xls!C5)+SUM(test15.xls!C5)+SUM(test16.xls!C5)+SUM(test17.xls!C5)+SU­M(test18.xls!C5)+SUM(test19.xls!C5)+SUM(test20.xls!C5)+SUM(test21.xls!C5)+SUM(test22.xls!C­5)+SUM(test23.xls!C5)+SUM(test24.xls!C5)+SUM(test25.xls!C5)+SUM(test26.xls!C5)+SUM(test27.­xls!C5)+SUM(test28.xls!C5)+SUM(test29.xls!C5)+SUM(test30.xls!C5)+SUM(test31.xls!C5)+SUM(te­st32.xls!C5)+SUM(test33.xls!C5)+SUM(test34.xls!C5)+SUM(test35.xls!C5)+SUM(test36.xls!C5)+S­UM(test37.xls!C5)+SUM(test38.xls!C5)+SUM(test39.xls!C5)+SUM(test40.xls!C5)+SUM(test41.xls!­C5)+SUM(test42.xls!C5)+SUM(test43.xls!C5)+SUM(test44.xls!C5)+SUM(test45.xls!C5)+SUM(test46­.xls!C5)+SUM(test47.xls!C5)+SUM(test48.xls!C5)+SUM(test49.xls!C5)+SUM(test50.xls!C5)+SUM(t­est51.xls!C5)+SUM(test52.xls!C5)+SUM(test53.xls!C5)+SUM(test54.xls!C5))/3600"
    
    
    End Sub
    


    Donc, il faut crée une boucle pour les heures :

    les conditions ">6:00:00:000" et "<7:00:00:000"

    peuvent être placé dans une variable

    ex:

    Sub Temporel()
    
        Dim Boucle As Integer
        Dim HeureDebut As Date
        Dim HeureFinal As Date
        
        HeureDebut = "0:00:00"
        HeureFinal = "1:00:00"
        
        For Boucle = 0 To 23
            MsgBox Format(HeureDebut, "hh:mm:ss.000") & " -:- " & Format(HeureFinal, "hh:mm:ss.000")
            HeureDebut = HeureDebut + "1:00:00"
            HeureFinal = HeureFinal + "1:00:00"
        Next Boucle
    End Sub
    


    ensuite à l'intérieur de cette boucle placé la première boucle de la routine [ Calcul_7Hre ].
    qui devrait elle inclure l'ouverture/fermeture de tes classeurs.

    Bien sur, je n'ai pas encore tout comprit, mais je crois qu'avec ces quelques lignes, tu devrais avancé !

    @+
    Lupin
    0
    1. aymen
       
      bonjour
      encore merci pour votre programme,
      j'ai fait plusieurs modifications pour arriver a un certain stade j'ai reussi a faire la somme des colones pour chaque fichier mais j'obtien tjs la meme valeur dans toutes les cases AP je sais le problème reside dans le filtre ou autre chose entouka je suis vraiment bloqué

      Option Explicit


      Sub Temporel()

      Dim Boucl As Integer
      Dim HeureDebut As Date
      Dim HeureFinal As Date
      Dim Boucle As Long
      Dim NomFichier As String


      HeureDebut = "0:00:00"
      HeureFinal = "1:00:00"
      'a titre d'exemple la boucle est de 1 à 2
      For Boucl = 1 To 2
      MsgBox Format(HeureDebut, "hh:mm:ss:000") & " -:- " & Format(HeureFinal, "hh:mm:ss:000")
      HeureDebut = HeureDebut + "1:00:00"
      HeureFinal = HeureFinal + "1:00:00"

      Dim ra As Integer

      Dim AP As String

      'j'ouvre le fichier test1,

      Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\test1.xls"

      For Boucle = 2 To 4

      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier
      Range("B1").Select

      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
      Criteria1:=">heuredebut", Operator:=xlAnd, Criteria2:="<HeureFinal"
      Next Boucle

      'j'ai voulu ici créer une boucle qui change AP du calsseur c'est à dire a chaque fois qu'une somme est faite pour chaque heure elle est stocké dans la case AP, AP1, AP2,...
      la boucle ra est juste pour pouvoir séparer la première boucle et pouvoir enregistré a chaque fois le fichier qui va stocké les valeurs
      For ra = 1 To 1

      Windows("test1.xls").Activate
      Range("AP" & Boucl).Select
      ActiveCell.FormulaR1C1 = "=(SUM(test2.xls!C5)+SUM(test3.xls!C5))/3600"
      Range("AO" & Boucl).Select
      ActiveCell.FormulaR1C1 = "=RC[1]"
      ActiveWorkbook.Close SaveChanges:=True
      Next ra

      ' Ici je ferme les fichiers pour qu'au moment de l'exécution de la deuxième Boucl de temps le fichier souvre normalement et me fait un debogage
      Windows("test2.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False

      Windows("test3.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False
      Windows("test4.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False

      Next Boucl


      End Sub

      Ce programme me permet d'ouvrir les fichiers de faire le calcul de stocké dans le fichié test1 chaque veleur pour chaque heure est stocké dans une case AP, mais mon problème c'est que cé toujours la meme valeur dans toute les cases malgré quelle doit changé puisque la boucl d'heure change "donc le filtre des valeurs change et donne d'autre plage de valeurs

      S'il vous plait aidez moi et merci d'avance
      0
  10. Aymen
     
    Bonjour Mr
    merci pour votre programme est vrément génial

    je l'ai testé et j'ai fé comme vous m'avez dit donc j'ai obtenu un programme comme ca :
    Option Explicit

    Sub Temporel()

    Dim Boucl As Integer
    Dim HeureDebut As Date
    Dim HeureFinal As Date
    Dim Boucle As Long
    Dim NomFichier As String

    HeureDebut = "0:00:00"
    HeureFinal = "1:00:00"

    For Boucl = 0 To 23
    MsgBox Format(HeureDebut, "hh:mm:ss:000") & " -:- " & Format(HeureFinal, hh:mm:ss:000")
    HeureDebut = HeureDebut + "1:00:00"
    HeureFinal = HeureFinal + "1:00:00"
    'j'ai voulu ici créer une boucle qui change AP du calsseur c'est à dire a chaque fois qu'une somme est faite pour chaque heure elle est stocké dans la case AP, AP1, AP2,...
    Dim rangee As Long
    Dim APg As String

    ' Calcul pour toutes les heures

    For rangee = 2 To 4
    ' Windows("test1.xls").Activate
    'APg = "AP" & rangee

    'Range("APg").Select

    For Boucle = 4 To 54
    NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
    ' Ici j'ouvrirais le fichier
    Workbooks.Open NomFichier
    Range("B1").Select
    ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
    Criteria1:=">HeureDebut", Operator:=xlAnd, Criteria2:="<HeureFinal"
    ' Ici je fermerais le fichier
    ActiveWorkbook.Close
    Next Boucle
    ' Next rangee

    Windows("test1.xls").Activate
    ActiveCell.FormulaR1C1 = "=(SUM(test4.xls!C5)+SUM(test5.xls!C5)+SUM(test6.xls!C5))/3600"

    Next Boucl
    End Sub

    1er problème: c'est que une fois les classeurs test fermé, la case danlaquelle se fait la somme dans le classeur 1 affiche "REF" parceque elle ne peut pas apporter les valeurs du classeur fermé
    2 ème problème : la boucle que j'ai fait pour changer les AP elle se bloque au niveau 'Range("APg").Select

    Donc je vous explique un peut plus pour que vous comprenez le programme parfaitement

    a chaque fois on lit les fichier et on filtre selon chaque heure, on va obtenir des valeur dans la colone E:E, La somme des colonnes E:E des différents classeurs sera sommé est divisé par 3600 et ensuite affiché dans le classeur 1 donc pour enfin obtenir une colonne dans le classeur 1 qui contien valeur pour heure 1 , valeur pour heure 2,....
    merci et bonne journée
    0
  11. Utilisateur anonyme
     
    re :

    Je n'ai pas encore tout regarder, car je croyais avoir le temps de structurer ton code.

    entre autre, ici il y a affectation de variable :

    'APg = "AP" & rangee

    Si AP est une variable :

    cela devient :

    'APg = AP & rangee

    et aussi la ligne :

    'Range("APg").Select

    devient:

    'Range(APg).Select

    Comme je t'ai dit, si j'arrive à trouver du temps je regarderai plus spécifiquement
    la structure de ton code.

    @+
    Lupin
    0
    1. Aymen
       
      Bonjour j'espère que vous alez bien
      bon je suis toujours bloqué dans ce programme j'ai apris beaucoup de chose sur le VBA mais apprament c'est pas suffisant:
      en faisant tourner le programme qui contien le fitrage il s'est avéré que je récupère tout le temps le meme résultat meme si on change la plage du filtrage et ce ci est du au fait que

      Windows("classeur1.xls").Activate
      Range("AP" & Boucl).Select 'pour changer l'emplacement de sauvgarde des valeurs suivant le filtage
      ActiveCell.FormulaR1C1 = "=(SUM(test2.xls!C5)+SUM(test3.xls!C5))/3600"
      c'est a dire ici on somme toujours la colonne E:E et ceci ne tien pas compte du filtrage, je suis bloqué ici j'ai pa su comment faire pour tenir compte du filtrage qu'on fait a chaque heure pour l'ensemble des fichiers
      Le code utilisé est celui ci :

      Option Explicit


      Sub Temporel()

      Dim Boucl As Integer
      Dim HeureDebut As Date
      Dim HeureFinal As Date
      Dim Boucle As Long
      Dim NomFichier As String
      Dim ra As Integer
      Dim AP As String

      HeureDebut = "0:00:00"
      HeureFinal = "1:00:00"
      'Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\test1.xls"
      For Boucl = 1 To 2
      MsgBox Format(HeureDebut, "hh:mm:ss:000") & " -:- " & Format(HeureFinal, "hh:mm:ss:000")
      HeureDebut = HeureDebut + "1:00:00"
      HeureFinal = HeureFinal + "1:00:00"
      'j'ai voulu ici créer une boucle qui change AP du calsseur c'est à dire a chaque fois qu'une somme est faite pour chaque heure elle est stocké dans la case AP, AP1, AP2,...

      Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\test1.xls"

      For Boucle = 2 To 4 'a titre d'exemple j'ai prix de 2 à 4

      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
      Criteria1:=">HeureDebut", Operator:=xlAnd, Criteria2:="<HeureFinal"

      Next Boucle

      For ra = 1 To 1
      Windows("test1.xls").Activate
      Range("AP" & Boucl).Select
      ActiveCell.FormulaR1C1 = "=(SUM(test2.xls!C5)+SUM(test3.xls!C5))/3600"
      ActiveWorkbook.Close SaveChanges:=True


      Windows("test2.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False

      Windows("test3.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False
      Windows("test4.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False

      Next ra

      Next Boucl


      End Sub



      S'il vous plait j'espère que vous avez une solution, désolé mais j'ai pas d'autre solution que d'avoir recours a votre aide



      Merci
      0
  12. Utilisateur anonyme
     
    Bonjour,

    Le temps file à toute allure et je n'ai pas eu le temps de regarder le code.

    Ceci dit, je vois encore l'ambiguité au niveau de la variable [ AP ] ???

    Dim AP As String 
    
    For ra = 1 To 1 
    Windows("test1.xls").Activate 
    Range("AP" & Boucl).Select 
    


    Ici, je constate que la variable AP est défini comme une "string".

    Est-ce que tu as nommé une cellule avec le nom [ AP ].

    Si une cellule est nommé [ AP ], ça porte a confusion que de déclaré une variable du même nom.
    Dim AP As String

    Si ce n'est pas le nom d'une cellule, mais bien le nom d'une variable, la syntaxe est :
    Range(AP & Boucl).Select

    Dons pas de guillemets pour la variable, c'est problement ce qui cause la non-réussite
    de la recherche.

    Je te cite : "c'est à dire a chaque fois qu'une somme est faite pour chaque heure elle est stocké dans la case AP, AP1, AP2,..."

    Ceci me porte à croire que tu as nommé les cases (cellules) au nom de AP, AP1, AP2 ...

    Pour adresser ces cellules, ce serait comme tu fais :
    Range("AP" & Boucl).Select

    mais la déclaration [ Dim AP As String ] crée une ambiguité.

    Autre point :

    dans ces lignes :
    Windows("test2.xls").Activate 
    ActiveWorkbook.Close SaveChanges:=False 
    
    Windows("test3.xls").Activate 
    ActiveWorkbook.Close SaveChanges:=False 
    Windows("test4.xls").Activate 
    ActiveWorkbook.Close SaveChanges:=False 
    </codes>
    
    peuvent être remplacé par :
    <code>
    Application.DisplayAlerts = False
    For RA = 2 To 4
        Windows("test" & RA & ".xls").Activate
        ActiveWorkbook.Close
    Next RA
    Application.DisplayAlerts = True
    


    je ne dis pas que ta méthode est mauvaise, ce n'est qu'une autre façon.

    @+
    Lupin
    0
    1. Aymen
       
      Merci de me conçacrer un peut de temps je sais que le temps c'est de l'or
      j'ai tenu compte de la variable AP elle fonctionne correctement j'ai enlevé la declaration Dim AP As string

      ca marche normalement,
      pour moi le problème réside dans le filtrage c'est a dire le fitrage se fait pour la colonne contenant les valeurs 1:00:00:000 ...
      c'est à dire une fois que j'ai fait le filtrage selon l'heure sur toute la colonne comme ecrit dans le code je fait la somme entre les valeurs filtré de chaque fichier, mais le problème c'est la somme se fait sur toute la colonne tout le temps malgré que le filtre est en place l'instruction que j'ai ce dessous me somme toute la colonne malgré que les valeurs sont filtrés,
      je sais plus qu'est ce que je dois faire ??


      For Boucle = 2 To 4 'a titre d'exemple j'ai prix de 2 à 4

      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier
      Range("B1").Select
      ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
      Criteria1:=">HeureDebut", Operator:=xlAnd, Criteria2:="<HeureFinal"

      Next Boucle

      For ra = 1 To 1
      Windows("test1.xls").Activate
      Range("AP" & Boucl).Select
      ActiveCell.FormulaR1C1 = "=(SUM(test2.xls!C5)+SUM(test3.xls!C5))/3600" ' somme des colonnes E:E pour chaque fichier aprés filtrage
      ActiveWorkbook.Close SaveChanges:=True
      0
  13. Utilisateur anonyme
     
    Bonjour,

    Je n'ai pu trouver une soluce avec le filtre activé.

    Je te propose donc de faire une boucle sur ta plage pour effectuer ta somme plutôt qu'un filtre !

    ActiveSheet.Range("$A$1:$DJ$10000").AutoFilter Field:=2, _
    Criteria1:=">HeureDebut", Operator:=xlAnd, Criteria2:="<HeureFinal"

    ex type :
    Sub Calcul()
    
    
        Dim Plage As Range, Cellule As Range
        Dim Somme As Date
    
        Set Plage = Range("A1:A10000")
    
        Dim HeureDebut As Date ' >
        Dim HeureFinal As Date ' <
    
        ' En supposant que l'heure de début est en colonne A
        ' En supposant que l'heure final est en colonne E
        ' En supposant que l'heure comprise entre de début et final soit en colonne F
        '
        For Each Cellule In Plage
            If ((Cellule.Value > HeureDebut) And (Cellule.Offset(0, 5).Value < HeureFinal)) Then
                Somme = Somme = Cellule.Offset(0, 6).Value
            End If
        Next Cellule
    
    End Sub
    '
    


    Lupin
    0
    1. Aymen
       
      Bonjour MR
      merci pour la solution
      je l'ai utilisé mais ca marche pas comme je veux et j'ai pas pu la modifier puisque je conais pas trés bien le VBA

      For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2
      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier

      Next Boucle
      For Each Cellule In Plage
      If ((Cellule.Offset(0, 2).Value > HeureDebut) And (Cellule.Offset(0, 2).Value < HeureFinal)) Then
      Somme = Somme = Cellule.Offset(0, 5).Value
      End If
      Next Cellule

      donc le filtre se fait trés bien puisque je veut filtrer sur une seule colonne (B) qui contien des donnée du type 0:00:00:000 c'est pourquoi j'ai mis ((Cellule.Offset(0, 2).Value deux fois

      la somme que je veut faire aprés le filtre c'est dans la colonne (E) je veut sommer toute la colonne (E) aprés le filtrage et diviser la somme par 3600 et le résultat trouver qui est du genre 3434,3434 je voudrais qu'il soit afficher dans une colonne a part d'un autre classeur " comment faire ??
      Merci de m'aider
      0
  14. Utilisateur anonyme
     
    re :

    Dans la boucle :
        For Each Cellule In Plage
            If ((Cellule.Offset(0, 2).Value > HeureDebut) And (Cellule.Offset(0, 2).Value < HeureFinal)) Then
                Somme = Somme = Cellule.Offset(0, 5).Value
            End If
        Next Cellule
    


    Il faut d'abord définir les variables :

        Dim Cellule As Range, Plage As Range, Somme As Variant
    


    ensuite if faut instancié l'objet Plage :
        Set Plage = Range("A1:A10000")
    


    Je cite : [ ... je veut filtrer sur une seule colonne (B) .., ]

    donc la position devient :

    Cellule.Offset(0, 1).Value

    Puisque :

    Cellule.Offset(0, 0).Value fournit la valeur de [ A1 ] au premier tour dans la boucle
    puisque la plage est défini de [ A1 à A1000 ] et ainsi de suite ...
    Cellule.Offset(0, 1).Value fournit la valeur de [ B1 ]
    Cellule.Offset(0, 2).Value fournit la valeur de [ C1 ]
    Cellule.Offset(0, 3).Value fournit la valeur de [ D1 ]
    Cellule.Offset(0, 4).Value fournit la valeur de [ E1 ]

    je cite : [ ... c'est dans la colonne (E) je veut sommer toute la colonne (E) aprés le filtrage ... ]

    d'où la ligne :
        Somme = Somme = Cellule.Offset(0, 4).Value
    


    je cite : [ ... diviser la somme par 3600 et le résultat trouver qui est du genre 3434,3434 je voudrais qu'il soit afficher dans une colonne a part d'un autre classeur... ]

        If (Somme > 0) Then
            Somme = Somme / 3600
        End If
        Windows("test1.xls").Activate 
        Range("AP" & Boucl).Select 
        ActiveCell.Value = Somme  
        ActiveWorkbook.Close SaveChanges:=True
    


    Lupin
    0
    1. Aymen
       
      Merci votre réponse rapide j'ai bien apricié votre geste
      le programme que j'utilise c'est le suivant j'ai implémenté votre code
      pour obtenir le prog suivant
      Au niveau de la somme j'obtien toujours Vide je sais qu'est ce qui se passe ???
      S'il vous plait j'arrive pas avancer te ca commence a me stréssé :)
      Option Explicit


      Sub Temporel()

      Dim Boucl As Integer
      Dim HeureDebut As Date
      Dim HeureFinal As Date
      Dim Boucle As Long
      Dim NomFichier As String

      Dim Plage As Range, Cellule As Range
      Dim Somme As Variant

      Set Plage = Range("A1:A10000")

      HeureDebut = "0:00:00"
      HeureFinal = "1:00:00"
      'Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\test1.xls"
      For Boucl = 1 To 2
      HeureDebut = HeureDebut + "1:00:00"
      HeureFinal = HeureFinal + "1:00:00"

      Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\fichglob.xlsx"

      For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2

      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier

      Next Boucle

      For Each Cellule In Plage
      If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then

      Somme = Somme = Cellule.Offset(0, 4).Value


      End If
      Next Cellule

      If (Somme > 0) Then
      Somme = Somme / 3600
      End If
      Windows("test1.xls").Activate
      Range("AP" & Boucl).Select
      ActiveCell.Value = Somme
      ActiveWorkbook.Close SaveChanges:=True


      Windows("test1.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False
      Windows("test2.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False


      Next Boucl


      End Sub
      0
  15. Utilisateur anonyme
     
    re :

    Soit tu exécute ta routine en mode pas à pas pour valider toutes les manipulations des données,
    soit tu dépose ton fichier sur ci-joint.com si celui-ci ne contient pas d'information confidentiel.

    Je pourrai alors le déboguer, sans les données je ne puis tester le code que je te fournis
    ce ne sont toujours que des exemples types, n'ayant pas les données pour valider, et travailler
    sur des heures est l'une des choses les plus fragiles sous VBA.

    Lupin
    0
    1. Aymen
       
      Salut
      http://www.cijoint.fr/cjlink.php?file=cj200806/cijvPfcJzx.xls.
      voici le lien du fichier sur lequel je travaille c'est le fichier test1 j'ai boucoup d'autre fichiers qui sont la suite de ce fichier
      voici le fichier test2 "http://www.cijoint.fr/cjlink.php?file=cj200806/cij76hgUJb.xls. " complémentaire a test1
      j'espère que vous me donnerai une solution
      avec un grand merci
      0
    2. Aymen
       
      voici le deuxième lien pour le deuxième fichier test2.xls
      http://www.cijoint.fr/cjlink.php?file=cj200806/cijYzxEqYp.xls.
      0
  16. Utilisateur anonyme
     
    re :

    avec les deux liens, j'attérit sur une page qui me dit [ !!! Fichier non accessible !!! ].

    Lupin
    0
    1. Aymen
       
      voici le lien
      http://www.cijoint.fr/cjlink.php?file=cj200806/cijy01dIBh.xls
      normalement j'ai verifier qu'il marche
      merci
      0
  17. Utilisateur anonyme
     
    re :

    J'ai bien réussi à télécharger le premier test1.xls, mais pas le second.

    et il n'y a aucune macro VBA dans ce fichier, les données sont là
    mais ou est le code ?

    Lupin
    0
    1. Aymen
       
      je vais essayer de vous renvoyer le deuxième fichiers
      entouka pour le code je le met dans une autre fichiers pour juste que je puisse exécuter cé tout
      a chaque fois que j'enregistre et j'ouvre il me dit qu'il n y a pas de macro dans ce fichier donc j'ouvre un nouveau classeur
      je crée un module dans lequel je copie le code suivant:
      ensuite j'exécute
      le lien du deuxième fichier: http://www.cijoint.fr/cjlink.php?file=cj200806/cijYzxEqYp.xls
      Option Explicit


      Sub Temporel()

      Dim Boucl As Integer
      Dim HeureDebut As Date
      Dim HeureFinal As Date
      Dim Boucle As Long
      Dim NomFichier As String

      Dim Plage As Range, Cellule As Range
      Dim Somme As Variant

      Set Plage = Range("A1:A10000")

      HeureDebut = "0:00:00"
      HeureFinal = "1:00:00"
      'Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\test1.xls"
      For Boucl = 1 To 2
      HeureDebut = HeureDebut + "1:00:00"
      HeureFinal = HeureFinal + "1:00:00"

      Workbooks.Open "C:\Users\Aymen\Desktop\data\tako\fichglob.xlsx"

      For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2

      NomFichier = "C:\Users\Aymen\Desktop\data\tako\test" & Boucle & ".xls"
      ' Ici j'ouvrirais le fichier
      Workbooks.Open NomFichier

      Next Boucle

      For Each Cellule In Plage
      If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then

      Somme = Somme = Cellule.Offset(0, 4).Value


      End If
      Next Cellule

      If (Somme > 0) Then
      Somme = Somme / 3600
      End If
      Windows("fichglob.xlsx").Activate
      Range("AP" & Boucl).Select
      ActiveCell.Value = Somme
      ActiveWorkbook.Close SaveChanges:=True


      Windows("test1.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False
      Windows("test2.xls").Activate
      ActiveWorkbook.Close SaveChanges:=False


      Next Boucl


      End Sub
      0
  18. Utilisateur anonyme
     
    re :

    Voilà j'ai pu télécharger le deuxième fichier.

    J'ai retravaillé le code en fonction de ce que j'ai compris de ce que tu tente de faire.

    Le code tel que je l'ai remodeler, fonctionne bien mais ce sont les données qui ne correspondent pas aux critères
    de recherche.

    Dans les fichiers test1.xls et test2.xls, les temps sont fournit selon la structure :

    ex:
    test1.xls
    Ligne 9989 [ 0:00:49:871 ] - Un format inconnu de Excel
    Ligne 9990 [ 0:01:00:902 ] - Un format inconnu de Excel

    on devrait lire :
    Ligne 9989 [ 0:00:49,871 ] -> 49 secondes , 871 millièmes de secondes
    Ligne 9990 [ 0:01:00,902 ] -> 1 minute , 0 seconde, 902 millièmes de secondes

    or les lignes :
    HeureDebut = "0:00:00"
    HeureFinal = "1:00:00"

    et

    HeureDebut = HeureDebut + "1:00:00"
    HeureFinal = HeureFinal + "1:00:00"

    initialise les critères à :

    HeureDebut [ 01:00:00,000 ] -> 1 heure, 0 minute, 0 seconde, 0 millième
    HeureFinal [ 02:00:00,000 ] -> 2 heures, 0 minute, 0 seconde, 0 millième

    donc la ligne de test :

    If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then

    ne sera jamais VRAI, donc l'instruction [ Somme = Somme = Cellule.Offset(0, 4).Value ] n'est jamais
    exécuter.

    Il faut changer le format des temps de [ 00:00:00:000 ] à [ 00:00:00,000 ] et vérifier si tu recherche
    des temps entre 1 heure et 2 heure
    HeureDebut [ 01:00:00,000 ] -> 1 heure, 0 minute, 0 seconde, 0 millième
    HeureFinal [ 02:00:00,000 ] -> 2 heures, 0 minute, 0 seconde, 0 millième

    ou des temps entre 1 minute et 2 minute
    HeureDebut [ 00:01:00,000 ] -> 1 heure, 0 minute, 0 seconde, 0 millième
    HeureFinal [ 00:02:00,000 ] -> 2 heures, 0 minute, 0 seconde, 0 millième

    En plaçant tous les fichiers dans le même dossier,
    voici le code débugger selon ce que j'ai compris !

    Option Explicit
    '
    
    Sub Temporel()
    
        Dim Boucl As Integer
        Dim HeureDebut As Date
        Dim HeureFinal As Date
        Dim Boucle As Long
        Dim NomFichier As String
        
        Dim Plage As Range, Cellule As Range
        Dim Somme As Variant
        
        HeureDebut = "0:00:00"
        HeureFinal = "1:00:00"
        For Boucl = 1 To 2
            HeureDebut = HeureDebut + "1:00:00"
            HeureFinal = HeureFinal + "1:00:00"
        
            NomFichier = ActiveWorkbook.Path & "\Globale" & Boucl & ".xls"
            Workbooks.Open NomFichier
        
            For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2
                NomFichier = ActiveWorkbook.Path & "\Test" & Boucle & ".xls"
                Workbooks.Open NomFichier
            
                Set Plage = Range("A1:A10000")
                For Each Cellule In Plage
                    If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then
                        Somme = Somme = Cellule.Offset(0, 4).Value
                    End If
                Next Cellule
                ActiveWorkbook.Close
                If (Somme > 0) Then
                    Somme = Somme / 3600
                Else
                    Somme = 0
                End If
                Windows("Globale1.xls").Activate
                Range("AP" & Boucle).Select
                ActiveCell.Value = Somme
            Next Boucle
            ActiveWorkbook.Close SaveChanges:=True
        Next Boucl
        
    End Sub
    '
    


    Autre point, il y a vraiment plusieurs fichiers globales ?
    ->->-> For Boucl = 1 To 2
    cette boucle me semble superflu !

    le code devrait être :
    Sub Temporel2()
    
        Dim Boucl As Integer
        Dim HeureDebut As Date
        Dim HeureFinal As Date
        Dim Boucle As Long
        Dim NomFichier As String
        
        Dim Plage As Range, Cellule As Range
        Dim Somme As Variant
        
        HeureDebut = "0:00:00"
        HeureFinal = "1:00:00"
        HeureDebut = HeureDebut + "1:00:00"
        HeureFinal = HeureFinal + "1:00:00"
        
        NomFichier = ActiveWorkbook.Path & "\Globale.xls"
        Workbooks.Open NomFichier
        
        For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2
            NomFichier = ActiveWorkbook.Path & "\Test" & Boucle & ".xls"
            Workbooks.Open NomFichier
        
            Set Plage = Range("A1:A10000")
            For Each Cellule In Plage
                If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then
                    Somme = Somme = Cellule.Offset(0, 4).Value
                End If
            Next Cellule
            ActiveWorkbook.Close
            If (Somme > 0) Then
                Somme = Somme / 3600
            Else
                Somme = 0
            End If
            Windows("Globale1.xls").Activate
            Range("AP" & Boucle).Select
            ActiveCell.Value = Somme
        Next Boucle
        ActiveWorkbook.Close SaveChanges:=True
        
    End Sub
    '
    


    Alors ceci devrait débroussailler le terrain quelque peu !

    Lupin
    0
    1. Aymen
       
      je sais pas quoi vous dire que merci merci beaucoup d'avoir donné beaucoup de votre temps
      entouka j'ai testé le code il marche
      mais :) pour le fichier globale je n'ai qu'un seule fichier dans lequel je veut stocké toute les somme pour les fichiers en filtrant pour chaque heure
      cadire entre 0et 1 heure somme 1
      1 et 2 heure somme 2 chacune dans une case AP1 AP2 ...
      autre probleme la somme est toujours zero
      je sais pk? ca veut pas marché
      bonne soirée et merci encore
      0
  19. Aymen
     
    voici le code que je utilise et qui donne tjs somme =0
    qu'est ce qu'il faut faire SVP?? moi j'aimerai bien travailler en heure pas en minutes
    Option Explicit
    Sub Temporel2()

    Dim Boucl As Integer
    Dim HeureDebut As Date
    Dim HeureFinal As Date
    Dim Boucle As Long
    Dim NomFichier As String

    Dim Plage As Range, Cellule As Range
    Dim Somme As Variant

    HeureDebut = "0:00:00"
    HeureFinal = "1:00:00"
    For Boucl = 1 To 2 'cette boucle permet de passer dune heure a une autre

    HeureDebut = HeureDebut + "1:00:00"
    HeureFinal = HeureFinal + "1:00:00"

    NomFichier = ActiveWorkbook.Path & "\fichglob.xlsx"
    Workbooks.Open NomFichier

    For Boucle = 1 To 2 'a titre d'exemple j'ai prix de 1 à 2
    NomFichier = ActiveWorkbook.Path & "\Test" & Boucle & ".xls"
    Workbooks.Open NomFichier

    Set Plage = Range("A1:A10")
    For Each Cellule In Plage
    If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then
    Somme = Somme = Cellule.Offset(0, 4).Value
    End If
    Next Cellule
    ActiveWorkbook.Close
    If (Somme > 0) Then
    Somme = Somme / 3600
    Else
    Somme = 0
    End If
    Windows("fichglob.xlsx").Activate
    Range("AC" & Boucle).Select
    ActiveCell.Value = Somme
    Next Boucle
    ActiveWorkbook.Close SaveChanges:=True
    Next Boucl
    End Sub
    0
  20. Utilisateur anonyme
     
    re :

    Un fichier globale, donc le code de la routine Temporel2 de mon dernier message est le bon.

    Et ça ne fonctionne pas à cause du format du temps comme je t'ai expliqué dans mon précédent message :

    1) Le format non reconnu d'Excel
    Il faut changer le format des temps de [ 00:00:00:000 ] à [ 00:00:00,000 ] et vérifier si tu recherche
    des temps entre 1 heure et 2 heure
    HeureDebut [ 01:00:00,000 ] -> 1 heure, 0 minute, 0 seconde, 0 millième
    HeureFinal [ 02:00:00,000 ] -> 2 heures, 0 minute, 0 seconde, 0 millième

    ou des temps entre 1 minute et 2 minute
    HeureDebut [ 00:01:00,000 ] -> 1 heure, 0 minute, 0 seconde, 0 millième
    HeureFinal [ 00:02:00,000 ] -> 2 heures, 0 minute, 0 seconde, 0 millième

    2) Des heures ou des minutes ?
    Alors actuellement, les variables [ HeureDebut et HeureFinal ] contiennent des valeurs
    de l'ordre des heures et tes données sont de l"ordre des minutes.

    Lupin
    0
    1. aymen
       
      merci pour votre réponse
      j'ai pas su comment changer le format de l'heure??
      j'ai essayer j'ai pas su si il faut le changé sur fichier lui meme ou dans le programme
      Svp aider moi j'aimerai bien que ce programme fonctionne
      le format des heures et en minutes mais moi dans la version des fichiers finaux je vais utiliser des heures d'ou la taille des fichiers sera plus grandes
      SVP vous avez les fichiers essayer de changé l'heure et me dire comment faire essayer s'il vous plait de le tester avec le nouveau format d'heure
      merci
      0
    2. Aymen
       
      Bonjour j'espère que vous aller bien
      ces jours jétais un peut deborder par le travail
      S'il vous plait j'ai une petite question concernant cette partie du code
      Set Plage = Range("A1:A10")
      For Each Cellule In Plage
      If ((Cellule.Offset(0, 1).Value > HeureDebut) And (Cellule.Offset(0, 1).Value < HeureFinal)) Then
      Somme = Somme = Cellule.Offset(0, 4).Value
      End If
      Next Cellule
      ActiveWorkbook.Close
      If (Somme > 0) Then
      Somme = Somme / 3600
      Else
      Somme = 0
      End If
      Windows("fichglob.xlsx").Activate
      Range("A" & Boucle).Select
      ActiveCell.Value = Somme
      j'ai verifier avec le mode pas à pas j'ai constater que la vriable somme ne recoit pas la valeur de cellule.offset malgré que celle ci li la valuer se trouvant dans la case voulu
      j'ai pas compris qu'est ce qui se passe ? moi je voudrai bien récuprer la somme de toutes les valeurs
      merci de m'aider
      bonne journée
      0