Extraction de données de plusieurs fichier pour les mettre dans un aut

  • Auteur de la discussion aprentizorrrr
  • Date de début

aprentizorrrr

Habitué
Voila , zeb m' a aider a resoudre mon 1er probleme, et un nouveau apparait, enfin mon tuteur est magicien :D enfin bref

J'ai plusieur fichiers dans lesquels il y a une feuille nomé bilan avec le total des heures de BE et SOFT (differentes prestations) par affaire pour une année, sachant que un bilan d'une année represente une feuille dans differents fichiers exemple: bilan pointage 2008 et bilan pointage 2009 ( pour l'instant je vais me servir que de c'est 2 la, mais sa remonte de 2005 a 2010).

j'ai un fichier bilan des heures, dans lequel il y a une feuille nomé "digest PE"
avec toutes les affaires, des heures prevues, devis.... et les heures BE ET SOFT, je voudrais extraire les heures BE et SOFT de chaque bilan des bilan pointages et les mettre dans les cellues corespondant

exemple:
affaire XX.XX.XXXX
BE XXX heures
SOFT XXX heures

sachant qu'une affaire peut apparaitre dans plusieurs bilans ( affaire YY.YY.YYYY en 2007 2008 2009...)

comment recupere les données de tous mes bilan, compare les affaires avec le digest PE et mettre les heures BE et SOFT ( si affaire sur plusieurs années il faut additioner)
voila ce que je voudrais faire

pour l'intant je galere sur l'extraction des données la partie comparaison affaire pour renseigner BE et SOFT venant apres je pense etre plus competent pour sa mais je sais pas comment extraire les fichiers, j'ai cherche sur internet des cours ou autres et rien de probant.

je vous demande donc de l'aide , merci
 

aprentizorrrr

Habitué
bon voila ou jen suis pour l'extraction, sa vance guere, mais je continue a cherche
Code:
Option Explicit

Sub LancerExtraction()

Extraction "BILAN POINTAGE2008test.XLS"
Extraction "BILAN POINTAGE2009test.XLS"

End Sub

apres je dois créer le programme mais je cherche encore (zeb j'ai regardé les lien que tu propose et ta liste de macro, mais j'ai pas trouvé une explication sur les extractions, si je suis passé a cote, tu peux me le link stp)
voila sa avance a reculons mais a force de reculer je vais bien franchir la ligne ( a moin que sa soit pas un circuit fermé :d)

EDIT:
en attendant que sa soit plus clair dans ma tete et que j'avance je poste sa

je pense a faire un truc du genre, compare
tant que affaire = affaire
celluleY = celluleY + celluleZ du bilan de l'anné X
mais comment recupere les informations de chaque bilan et faut il faire sa pour chaque bilan ou une fois les donnees recupere il va directement prendre le total des heures des meme cellules de chaque bilan ( de chaque bilan de chaque années ( fichier))


 

aprentizorrrr

Habitué
salut, j'ai recupere ce code d'un fichier excel sur le reseau

Code:
Option Explicit
Sub LancerExtraction()

Extraction "momo.XLS"
Extraction "dodo.XLS"
Extraction "fofo.XLS"
Extraction "bobo.XLS"
Extraction "zozo.XLS"
Extraction "coco.XLS"
Extraction "popo.XLS"
Extraction "toto.XLS"
End Sub

Sub Extraction(NomDuClasseur As String)

Dim UneCellule As Range

Dim Mois As String
Dim NomDuGars As String
Dim NomClient As String
Dim NumAffaire As String
Dim chapitre As String
Dim TotalHeures As Double
Dim HrConge As Double
Dim HrMaladie As Double
Dim HrCeDp As Double
Dim HrRecup As Double
Dim Hstandard As Double
Dim HrQualite As Double
Dim HrDucument As Double
Dim HrSTechnique As Double
Dim HrTFiliales As Double
Dim HrTLicenciés As Double
Dim HrGInterne As Double
Dim HrPrest_SAV As Double

Dim FinDePlage As String

Dim I As Integer

Dim NomClasseurORIGINE As String
Dim NomClasseurOUVERT As String

'initialisation du classeur ouvert (Consolidation Pointage)
NomClasseurORIGINE = ActiveWorkbook.Name

'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
NomClasseurOUVERT = NomDuClasseur

'initialisation de la feuille du classeur (Consolidation Pointage)
Worksheets("Heures Imputees").Activate

'Initialisation de la cellule du debut de chargement soit A2 ou derniere cellule remplie +1
    'Se place sur A2
    Range("A2").Select
    
    ' Tester si A2 est vide
    If Range("A2") <> 0 Then
    
    'Si A2 n'est pas vide chercher la derniere cellule non vide
    FinDePlage = Range("A2").End(xlDown).Address
    
    'selectionne la derniere cellule non vide
    'puis ajoute 1 pour etre sur la premiere cellule vide
    Range(FinDePlage).Select
    Range(FinDePlage).Offset(1, 0).Select
    
    End If

'initialise le chemin d'acces au classeur actif soit le classeur pointage
Workbooks.Open ActiveWorkbook.Path & "\" & NomClasseurOUVERT

'Borne le compteur de la page 1 a la derniere page (Sheets;count)
For I = 1 To Sheets.Count

'initialise a la feuille de l'index I
Worksheets(I).Activate

'Transfert le nom du technicien dans NomDuGars
NomDuGars = Range("O3")

'recuperer le mois dans la feuille pointé
Mois = ActiveSheet.Name

    'Selection de la zone de parcours contenant les N° de commandes (Cellule d'origine)
    Range("C7:C22").Select

    'Parcours de la selection
    For Each UneCellule In Selection

    'Tester si la cellule parcourue est nulle
    If UneCellule <> 0 Then

    'Transfert le contenu de la Cellule (C7) dans NumAffaire
    NumAffaire = UneCellule
 
    'Transfert le contenu de la Cellule (C7)-2 => A7 concatené avec (C7)-1 => B7 dans NomClient
    NomClient = UneCellule.Offset(0, -2) & _
    UneCellule.Offset(0, -1)

    'Transfert le contenu de la Cellule (C7)+1 => D7 & (C7)+2 => E7 & (C7)+3 => F7 dans Chapitre
    chapitre = UneCellule.Offset(0, 1) & _
    UneCellule.Offset(0, 2) & UneCellule.Offset(0, 3)

    'Transfert le contenu de la Cellule (C7)+35 => AL7 dans TotalHeures
    TotalHeures = Val(UneCellule.Offset(0, 35)) 'Val permet de convertir une chaine en valeur

' Activer le classeur d'origine
Workbooks(NomClasseurORIGINE).Activate

'Y copier les donnees des variables
Selection = Mois
Selection.Offset(0, 1) = NomDuGars
Selection.Offset(0, 2) = NomClient
Selection.Offset(0, 3) = FORMATAffaire(NumAffaire) 'NumAffaire
Selection.Offset(0, 4) = chapitre
Selection.Offset(0, 5) = TotalHeures

'Passe à la ligne suivante
Selection.Offset(1, 0).Select

'Activer le classeur ouvert
Workbooks(NomClasseurOUVERT).Activate



End If

Next

Next I

'fermeture du classeur ouvert nota: false permet de fermer sans enregistrer les changements
Workbooks(NomClasseurOUVERT).Close False

End Sub

Sub Testworkbooks()

Dim K As Integer

For K = 1 To Workbooks.Count

Debug.Print Workbooks(K).Name


Next


End Sub

j'essaye de le comprendre et de m'en inspirer mais j'en suis la

Code:
Option Explicit
Sub LancerExtraction()

Extraction "BILAN POINTAGE2008test.XLS"
Extraction "BILAN POINTAGE2009test.XLS"

End Sub

Sub Extraction(NomDuClasseur As String)
Dim n°affaire As String
Dim NomClasseurORIGINE As String
Dim NomClasseurOUVERT As String
Dim heures    As Integer
Dim chapitre  As String
'initialisation du classeur ouvert (Consolidation Pointage)
NomClasseurORIGINE = ActiveWorkbook.Name

'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
NomClasseurOUVERT = NomDuClasseur

'initialisation de la feuille du classeur (Consolidation Pointage)
Worksheets("Heures Imputees").Activate

j'arrive pas a comprendre la stucture et a trouve des explications sur l'extraction de données, apres avoir mis en place sa, le code serait

Code:
Option Explicit
Sub LancerExtraction()

Extraction "BILAN POINTAGE2008test.XLS"
Extraction "BILAN POINTAGE2009test.XLS"

End Sub

Sub Extraction(NomDuClasseur As String)
Dim n°affaire As String
Dim NomClasseurORIGINE As String
Dim NomClasseurOUVERT As String
Dim heures    As Integer
Dim chapitre  As String
Dim BEE As Integer
Dim SOFT As Integer
Dim cellule_digestPE As Range
Dim cellule_bilan As Range
Dim n°affaire_Bilan As String
Dim chapitre_Bilan As String
Dim BEE_Bilan As Integer
Dim SOFT_Bilan As Integer



'initialisation du classeur ouvert (Consolidation Pointage)
NomClasseurORIGINE = ActiveWorkbook.Name

'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
NomClasseurOUVERT = NomDuClasseur

'initialisation de la feuille du classeur (Consolidation Pointage)
Worksheets("Heures Imputees").Activate

'voila il faut d'abord mettre en place la structure de l'extration, J'ai besoin d'aide svp


' la je suis dans les fichiers bilan pointage et feuille Bilan

    For Each cellule_bilan In Worksheets("Bilan").Range("A3:A65536")
    
    n°affaire_Bilan = cellule_bilan.Value
    chapitre_Bilan = cellule_bilan.Offset(, 2).Value
    BEE_Bilan = cellule_bilan.Offset(, 3).Value
    SOFT_Bilan = cellule_bilan.Offset(, 4).Value
    
    
    ' je suis dans le fichier Planing_blian_heurestest
    
   For Each cellule_digestPE In Worksheets("digest PE").Range("B3:B5000") ' je voudrais mettre la fin de la colonne B mais je connais pas encore la formule
   
    n°affaire = cellule_digestPE.Value            '  On est en colonne B
    BEE = cellule_digestPE.Offset(, 7).Value 'colonne AR
    SOFT = cellule_digestPE.Offset(, 4).Value 'colonne AO

Do While n°affaire = n°affaire_Bilan And chapitre_Bilan = "A02"

BEE = BEE + BEE_Bilan
SOFT = SOFT + SOFT_Bilan

Loop

        

End Sub

voila l'idee generale mais il manque toutes parties pour activer les classeurs, extraire les données et autres, j'ai besoin d'aide merci
 

aprentizorrrr

Habitué
salut, je fais un petit up du sujet, j'ai eu beau eplucher beacoup de forum, tuto, ou aide sur vba je n'ai pas trouvé d'explication tres clair sur l'extraction

merci de bien vouloir m'aider

ps: desoler du message , je viens de voir qu'il faut pas up sur se forum donc, esxusez moi on ne m'y reprendra plus
 

aprentizorrrr

Habitué
personne n'a pas un bout de piste pour que je plenche dessus, ou des explications, n'importequoi d'utile m'aidera a avancer, je suis en marche arriere la
SOS mayde
 

zeb

Modérateur
ohlala, plus tu en écris, plus tu t'embrouilles !

Tu veux juste copier des données d'un fichier dans un autre, et recommencer.
Il nous faut une source et une cible.

La source, c'est une ligne d'une feuille bilan d'un classeur x
La cible, c'est une ligne à trouver ou à créer dans telle feuille de tel classeur.

Bon.

Code:
Dim feuille_cible As Worksheet
Dim ligne_cible As Range

' // On suppose que la macro est dans le classeur cible
Set feuille_cible = ThisWorkbook.Worksheets(<feuille_cible>)

Code:
Dim classeur_source As Workbook
Dim feuille_source As Worksheet

' // On fera une boucle pour en ouvrir plusieurs
Set classeur_source = Workbooks.Open(<classeur à ouvrir>)
Set feuille_source = classeur_source.Worksheets(<feuille bilan>)

...

' // Fermeture
classeur_source.Close False

Bon, maintenant, il manque un ptit truc entre l'ouverture et la fermeture :D
 

zeb

Modérateur
On va parcourir la feuille source en collectant les informations pertinentes pour la comparaison avec la feuille cible.

Parcourir, c'est facile :
Code:
Dim cellule_source As Range
Dim cellule_cible  As Range

For Each cellule_source In feuille_source.Range(feuille_source.Range("A1"), feuille_source.????)
    For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.????)
        ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
        If cellule_source.Offset(..).Value = cellule_target.Offset(..).Value And _
           cellule_source.Offset(..).Value = cellule_target.Offset(..).Value And _
           .... _
        Then
              ' // On a trouvé. Il faut copier les valeurs de la source, vers la cible
              ...
              ' // Si on a trouvé, on sort.
              Exit For
        End If
    Next
    ' // Si on n'a pas trouvé, on arrive donc ici.
    ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
    ...
Next

Bon maintenant, comment déterminer la dernière ligne de chaque zone ?
Et bien on relit cet article :
 

aprentizorrrr

Habitué
Merci zeb, de m'aider encore

si j'ai bien compris pour extraire,
il faut declarer la feuille que je veux ( la tu as pris "cible" en exemple, moi sa sera le "digest PE" si j'ai bien compris) as worsheet
apres tu l'active avec "thisworkbook" ( feuille de travaille)

apres je declare le classeur_source ( mes bilans pointage20XX) as work book
et la feuille_source c'est la feuille Bilan que tu m'as aidé a faire

Code:
Set classeur_source = Workbooks.Open(<classeur à ouvrir> )
Set feuille_source = classeur_source.Worksheets(<feuille bilan> )
c'est pour que le programme ouvre le fichiers ? (avec une boulce , sa ouvrira tous les fichiers bilan pointage20XX ?)

donc la il a ouvert le classeur source et la feuille bilan

je dois recuperer mes infos :
n°affaire, BE et SOFT, chapitre

puis activer la feuille digest PE de mon planning , recuperer
n°affaire, BEE et SOFT,
faire une boucle pour comparer les affaires, mettre une condition sur chapitre = "A02" de ma feuille bilan puis renseigner BEE et SOFT ( feuille digest PE) en fonction de BE et SOFT de ma feuille bilan ?

c'est ce que j'ai compris suis je dans la bonne direction ?
 

zeb

Modérateur
puis activer la feuille
Non. Pas besoin d'activer quoi que ce soit !
Utilise des variables comme celles que je te propose dans mes exemples.

(édite ton message précédent, je crois qu'un / s'est perdu ;) )
 

aprentizorrrr

Habitué
salut, en ce samedi caniculaire , je n'avais pas vue ton 2eme message quand j'ai rédigé le mien , donc oui maintenant je vois que tu m'avais deja propose un exemple, je vais réfléchir dessus merci
 

aprentizorrrr

Habitué
Salut, en ce dimanche tout autan caniculaire,
voila le code actuel

Code:
   Option Explicit
   
  Sub remplire_digest_PE()


   Dim feuille_cible As Worksheet
   Dim ligne_cible As Range
   'On suppose que la macro est dans le classeur cible
   Set feuille_cible = ThisWorkbook.Worksheets("digest PE")
   
   Dim classeur_source As Workbook
   Dim feuille_source As Worksheet
   ' //On fera une boucle pour en ouvrir plusieurs, voila comment faire une boucle avec ceci sachant que le workbooks.open change,
   ' //je n 'ai pas encore compris comment faire
   Set classeur_source = Workbooks.Open("BILAN POINTAGE2008test")
   Set feuille_source = classeur_source.Worksheets("Bilan")


   Dim cellule_source As Range
   Dim cellule_cible  As Range
   Dim BEE As Integer
   Dim SOFT As Integer
   
   
   For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Row + 1)
        For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.Range("A3").End(xlDown).Row + 1)
   ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent

            If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 1).Value = "A02" Then
    
                cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
                cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value

   ' // Si on a trouvé, on sort.
        Exit For
            End If
        Next
   ' // Si on n'a pas trouvé, on arrive donc ici.
   ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
   ' //ici , sa permet de remplir entierment le num affaire, client , heures... si l'affaire existe dans les bilan mais pas dans le disgest pe ( feuille cible) ?
   
        cellule_cible.Value = cellule_source.Value
        cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
        cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
        cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
   

   Exit For
   Next




   ' // Fermeture
   classeur_source.Close False
   
   
  End Sub

voila, je ne sais pas comment faire la boucle avec tous les bilans pointages et j'ai donc voulue teste le code comme il est la et une erreur 9 est survenue a la ligne 9 " l'indice n'appartient pas a la sélection"

si tu pouvais encore m'aider sa serai super
 

zeb

Modérateur
Mais oui, je vais continuer à t'aider.

Erreur ligne 9 ? Ben il n'y a pas de feuille "digest PE" dans ton classeur, c'est tout.

C'est pas bon, ça :
Code:
Range(feuille_source.Range("B3" ), feuille_source.Range("B3" ).End(xlDown).Row + 1)
Il faut dans un Range(x, y), mettre des valeurs de type Range.
feuille_source.Range("B3" ) est bien de type Range.
feuille_source.Range("B3" ).End(xlDown).Row + 1 est un entier, ça marche pô !
Utilise feuille_source.Range("B3" ).End(xlDown).Offset(1) à la place.
(réfléchis et trouve pourquoi :o )
 

aprentizorrrr

Habitué
salut, en ce lundi ou j'ai fini mon stage mais j'ai quand même envie de finir ce truc :d
( pour moi et mon tuteur si il le veut toujours )
donc il y avait un espace après PE dans la feuille digest PE, oue c'est idiot comme erreur, enfin j'ai compris, le +1 donnerai la valeur de la cellule +1 alors que le .offeset(1) décale d'une ligne jusqu'à la fin, j'ai bon ?
 

aprentizorrrr

Habitué
bon j'ai une autre erreur bête je pense

Code:
Set classeur_source = Workbooks.Open("BILAN POINTAGE2008 test")

il me dit que le fichier est introuvable, pourtant j'ai copier coller le nom pour etre sur et il est dans le même dossier que le fichier cible,
j'ai teste sans les "", avec le .xls, avec le .xls et les "" et ou sa marche pas ou il me dit erreur argument alors je sèche
 

aprentizorrrr

Habitué
oui sa va le stage c'est bien passé, bonne intégration a l'équipe bonne ambiance, bon j'ai pas réellement fait d'automatisme comme j'aurai aime mais bon c'est pas grave, c'est toujours enrichissant, ( j'ai fais mon stage dans une entreprise de brûleur industriel, au service automatisme, et j'ai traite pas mal de schémas logique et réaliser des notices de blocs jusqu'à ce que mon tuteur me demande de faire l'application pour la gestion de ses affaires, pour amélioré leurs gestion pour avoir la norme qualité XXXX)
 

zeb

Modérateur
Code:
Set classeur_source = Workbooks.Open("C:\chemin\BILAN POINTAGE2008 test.XLS")

:spamafote:
 

aprentizorrrr

Habitué
ok sa marche, maintenant j'ai une erreur la :

Code:
For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Offset(1))
        For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.Range("A3").End(xlDown).Offset(1))
   ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent

            If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 1).Value = "A02" Then
    
                cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
                cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value

   ' // Si on a trouvé, on sort.
        Exit For
            End If
        Next
   ' // Si on n'a pas trouvé, on arrive donc ici.
   ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
   ' ici , sa permet de remplir entierment le num affaire, client , heures... si l'affaire existe dans les bilan mais pas dans le disgest pe ( feuille cible) ?
   
        cellule_cible.Value = cellule_source.Value
        cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
        cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
        cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value

Code:
cellule_cible.Value = cellule_source.Value

il me dit erreur d'exécution 91, variable objet, ou variable de bloc with non définie

je vais écrire un mot a microsoft, je comprend pas toujours leurs messages d'erreur
 

zeb

Modérateur
je vais écrire un mot a microsoft
[:diabolo]

Il y a dans ce code, deux erreurs.
Celle dont on parlera plus tard et qui t'embête bien, et une autre, dont je suis le modeste auteur :sol:

Code:
For Each cellule_source In ...
    For Each cellule_cible In ...
        If ... Then
            ...
            ' // Si on a trouvé, on sort.
            Exit For
        End If
    Next
    ' // Si on n'a pas trouvé, on arrive donc ici.
    ' // Si on a trouvé, on arrive ici aussi.
    ...
Next

Observe bien le commentaire de la ligne 10 [:patch]
Et oui....

Voici la solution au problème

Code:
Dim found As Boolean

For Each cellule_source In ...
    found = False
    For Each cellule_cible In ...
        If ... Then
            ...
            ' // Si on a trouvé, on sort.
            found = True
            Exit For
        End If
    Next
    ' // Si on n'a pas trouvé, on arrive donc ici.
    ' // Si on a trouvé, on arrive ici aussi.
    If Not found Then
        ...
    End If
Next

Bon, alors maintenant, imaginons que nous devions effectivement ne pas trouver. Nous arriverions à la ligne qui t'embête :[cpp]cellule_cible.Value = cellule_source.Value[/cpp]

Petite question. A ce moment du code, à quoi est égale cellule_cible, sur quelle cellule pointe la variable, et pourquoi ?
En répondant à cette question, et en relisant la ligne 2, tu devrais avoir la réponse.

Est-ce le cas ?
 

aprentizorrrr

Habitué
j'ai rajouter pour le found et effectivement j'ai compris sa, mais je vois pas le probleme dans l'erreur

Code:
cellule_cible.Value = cellule_source.Value

quand j'ai mis le curseur sur celle_source.value il m'a mis le nom d'un client a la place d'un numéro d'affaire, et pour cellule_cible.value toujours l'erreur 91, mais je comprends pas pourquoi
ce que je recherche c'est de donne le numéro d'affaire de la cellule_source a la cellule_cible quand l'affaire n'existe pas dans le digest PE
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 054
Membres
1 586 393
Dernier membre
mathhh28
Partager cette page
Haut