Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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
Lassé par la pub ? Créez un compte

bon voila ou jen suis pour l'extraction, sa vance guere, mais je continue a cherche
  1. Option Explicit
  2.  
  3. Sub LancerExtraction()
  4.  
  5. Extraction "BILAN POINTAGE2008test.XLS"
  6. Extraction "BILAN POINTAGE2009test.XLS"
  7.  
  8. 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))


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

  1. Option Explicit
  2. Sub LancerExtraction()
  3.  
  4. Extraction "momo.XLS"
  5. Extraction "dodo.XLS"
  6. Extraction "fofo.XLS"
  7. Extraction "bobo.XLS"
  8. Extraction "zozo.XLS"
  9. Extraction "coco.XLS"
  10. Extraction "popo.XLS"
  11. Extraction "toto.XLS"
  12. End Sub
  13.  
  14. Sub Extraction(NomDuClasseur As String)
  15.  
  16. Dim UneCellule As Range
  17.  
  18. Dim Mois As String
  19. Dim NomDuGars As String
  20. Dim NomClient As String
  21. Dim NumAffaire As String
  22. Dim chapitre As String
  23. Dim TotalHeures As Double
  24. Dim HrConge As Double
  25. Dim HrMaladie As Double
  26. Dim HrCeDp As Double
  27. Dim HrRecup As Double
  28. Dim Hstandard As Double
  29. Dim HrQualite As Double
  30. Dim HrDucument As Double
  31. Dim HrSTechnique As Double
  32. Dim HrTFiliales As Double
  33. Dim HrTLicenciés As Double
  34. Dim HrGInterne As Double
  35. Dim HrPrest_SAV As Double
  36.  
  37. Dim FinDePlage As String
  38.  
  39. Dim I As Integer
  40.  
  41. Dim NomClasseurORIGINE As String
  42. Dim NomClasseurOUVERT As String
  43.  
  44. 'initialisation du classeur ouvert (Consolidation Pointage)
  45. NomClasseurORIGINE = ActiveWorkbook.Name
  46.  
  47. 'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
  48. NomClasseurOUVERT = NomDuClasseur
  49.  
  50. 'initialisation de la feuille du classeur (Consolidation Pointage)
  51. Worksheets("Heures Imputees").Activate
  52.  
  53. 'Initialisation de la cellule du debut de chargement soit A2 ou derniere cellule remplie +1
  54. 'Se place sur A2
  55. Range("A2").Select
  56.  
  57. ' Tester si A2 est vide
  58. If Range("A2") <> 0 Then
  59.  
  60. 'Si A2 n'est pas vide chercher la derniere cellule non vide
  61. FinDePlage = Range("A2").End(xlDown).Address
  62.  
  63. 'selectionne la derniere cellule non vide
  64. 'puis ajoute 1 pour etre sur la premiere cellule vide
  65. Range(FinDePlage).Select
  66. Range(FinDePlage).Offset(1, 0).Select
  67.  
  68. End If
  69.  
  70. 'initialise le chemin d'acces au classeur actif soit le classeur pointage
  71. Workbooks.Open ActiveWorkbook.Path & "\" & NomClasseurOUVERT
  72.  
  73. 'Borne le compteur de la page 1 a la derniere page (Sheets;count)
  74. For I = 1 To Sheets.Count
  75.  
  76. 'initialise a la feuille de l'index I
  77. Worksheets(I).Activate
  78.  
  79. 'Transfert le nom du technicien dans NomDuGars
  80. NomDuGars = Range("O3")
  81.  
  82. 'recuperer le mois dans la feuille pointé
  83. Mois = ActiveSheet.Name
  84.  
  85. 'Selection de la zone de parcours contenant les N° de commandes (Cellule d'origine)
  86. Range("C7:C22").Select
  87.  
  88. 'Parcours de la selection
  89. For Each UneCellule In Selection
  90.  
  91. 'Tester si la cellule parcourue est nulle
  92. If UneCellule <> 0 Then
  93.  
  94. 'Transfert le contenu de la Cellule (C7) dans NumAffaire
  95. NumAffaire = UneCellule
  96.  
  97. 'Transfert le contenu de la Cellule (C7)-2 => A7 concatené avec (C7)-1 => B7 dans NomClient
  98. NomClient = UneCellule.Offset(0, -2) & _
  99. UneCellule.Offset(0, -1)
  100.  
  101. 'Transfert le contenu de la Cellule (C7)+1 => D7 & (C7)+2 => E7 & (C7)+3 => F7 dans Chapitre
  102. chapitre = UneCellule.Offset(0, 1) & _
  103. UneCellule.Offset(0, 2) & UneCellule.Offset(0, 3)
  104.  
  105. 'Transfert le contenu de la Cellule (C7)+35 => AL7 dans TotalHeures
  106. TotalHeures = Val(UneCellule.Offset(0, 35)) 'Val permet de convertir une chaine en valeur
  107.  
  108. ' Activer le classeur d'origine
  109. Workbooks(NomClasseurORIGINE).Activate
  110.  
  111. 'Y copier les donnees des variables
  112. Selection = Mois
  113. Selection.Offset(0, 1) = NomDuGars
  114. Selection.Offset(0, 2) = NomClient
  115. Selection.Offset(0, 3) = FORMATAffaire(NumAffaire) 'NumAffaire
  116. Selection.Offset(0, 4) = chapitre
  117. Selection.Offset(0, 5) = TotalHeures
  118.  
  119. 'Passe à la ligne suivante
  120. Selection.Offset(1, 0).Select
  121.  
  122. 'Activer le classeur ouvert
  123. Workbooks(NomClasseurOUVERT).Activate
  124.  
  125.  
  126.  
  127. End If
  128.  
  129. Next
  130.  
  131. Next I
  132.  
  133. 'fermeture du classeur ouvert nota: false permet de fermer sans enregistrer les changements
  134. Workbooks(NomClasseurOUVERT).Close False
  135.  
  136. End Sub
  137.  
  138. Sub Testworkbooks()
  139.  
  140. Dim K As Integer
  141.  
  142. For K = 1 To Workbooks.Count
  143.  
  144. Debug.Print Workbooks(K).Name
  145.  
  146.  
  147. Next
  148.  
  149.  
  150. End Sub


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

  1. Option Explicit
  2. Sub LancerExtraction()
  3.  
  4. Extraction "BILAN POINTAGE2008test.XLS"
  5. Extraction "BILAN POINTAGE2009test.XLS"
  6.  
  7. End Sub
  8.  
  9. Sub Extraction(NomDuClasseur As String)
  10. Dim n°affaire As String
  11. Dim NomClasseurORIGINE As String
  12. Dim NomClasseurOUVERT As String
  13. Dim heures As Integer
  14. Dim chapitre As String
  15. 'initialisation du classeur ouvert (Consolidation Pointage)
  16. NomClasseurORIGINE = ActiveWorkbook.Name
  17.  
  18. 'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
  19. NomClasseurOUVERT = NomDuClasseur
  20.  
  21. 'initialisation de la feuille du classeur (Consolidation Pointage)
  22. 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

  1. Option Explicit
  2. Sub LancerExtraction()
  3.  
  4. Extraction "BILAN POINTAGE2008test.XLS"
  5. Extraction "BILAN POINTAGE2009test.XLS"
  6.  
  7. End Sub
  8.  
  9. Sub Extraction(NomDuClasseur As String)
  10. Dim n°affaire As String
  11. Dim NomClasseurORIGINE As String
  12. Dim NomClasseurOUVERT As String
  13. Dim heures As Integer
  14. Dim chapitre As String
  15. Dim BEE As Integer
  16. Dim SOFT As Integer
  17. Dim cellule_digestPE As Range
  18. Dim cellule_bilan As Range
  19. Dim n°affaire_Bilan As String
  20. Dim chapitre_Bilan As String
  21. Dim BEE_Bilan As Integer
  22. Dim SOFT_Bilan As Integer
  23.  
  24.  
  25.  
  26. 'initialisation du classeur ouvert (Consolidation Pointage)
  27. NomClasseurORIGINE = ActiveWorkbook.Name
  28.  
  29. 'Transfert dans NomClasseurOUVERT le nom du classeur de pointage (issue de Sub lancerExtraction)
  30. NomClasseurOUVERT = NomDuClasseur
  31.  
  32. 'initialisation de la feuille du classeur (Consolidation Pointage)
  33. Worksheets("Heures Imputees").Activate
  34.  
  35. 'voila il faut d'abord mettre en place la structure de l'extration, J'ai besoin d'aide svp
  36.  
  37.  
  38. ' la je suis dans les fichiers bilan pointage et feuille Bilan
  39.  
  40. For Each cellule_bilan In Worksheets("Bilan").Range("A3:A65536")
  41.  
  42. n°affaire_Bilan = cellule_bilan.Value
  43. chapitre_Bilan = cellule_bilan.Offset(, 2).Value
  44. BEE_Bilan = cellule_bilan.Offset(, 3).Value
  45. SOFT_Bilan = cellule_bilan.Offset(, 4).Value
  46.  
  47.  
  48. ' je suis dans le fichier Planing_blian_heurestest
  49.  
  50. 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
  51.  
  52. n°affaire = cellule_digestPE.Value ' On est en colonne B
  53. BEE = cellule_digestPE.Offset(, 7).Value 'colonne AR
  54. SOFT = cellule_digestPE.Offset(, 4).Value 'colonne AO
  55.  
  56. Do While n°affaire = n°affaire_Bilan And chapitre_Bilan = "A02"
  57.  
  58. BEE = BEE + BEE_Bilan
  59. SOFT = SOFT + SOFT_Bilan
  60.  
  61. Loop
  62.  
  63.  
  64.  
  65. 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

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
Expert Programmation

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.

  1. Dim feuille_cible As Worksheet
  2. Dim ligne_cible As Range
  3.  
  4. ' // On suppose que la macro est dans le classeur cible
  5. Set feuille_cible = ThisWorkbook.Worksheets(<feuille_cible>)


  1. Dim classeur_source As Workbook
  2. Dim feuille_source As Worksheet
  3.  
  4. ' // On fera une boucle pour en ouvrir plusieurs
  5. Set classeur_source = Workbooks.Open(<classeur à ouvrir>)
  6. Set feuille_source = classeur_source.Worksheets(<feuille bilan>)
  7.  
  8. ...
  9.  
  10. ' // Fermeture
  11. classeur_source.Close False


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

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

Parcourir, c'est facile :
  1. Dim cellule_source As Range
  2. Dim cellule_cible As Range
  3.  
  4. For Each cellule_source In feuille_source.Range(feuille_source.Range("A1"), feuille_source.????)
  5. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.????)
  6. ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
  7. If cellule_source.Offset(..).Value = cellule_target.Offset(..).Value And _
  8. cellule_source.Offset(..).Value = cellule_target.Offset(..).Value And _
  9. .... _
  10. Then
  11. ' // On a trouvé. Il faut copier les valeurs de la source, vers la cible
  12. ...
  13. ' // Si on a trouvé, on sort.
  14. Exit For
  15. End If
  16. Next
  17. ' // Si on n'a pas trouvé, on arrive donc ici.
  18. ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
  19. ...
  20. Next


Bon maintenant, comment déterminer la dernière ligne de chaque zone ?
Et bien on relit cet article : http://www.presence-pc.com/forum/ppc/Programmation/tuto...

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

  1. Set classeur_source = Workbooks.Open(<classeur à ouvrir> )
  2. 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 ?
Expert Programmation

Citation :
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 ;)  )

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

  1. Option Explicit
  2.  
  3. Sub remplire_digest_PE()
  4.  
  5.  
  6. Dim feuille_cible As Worksheet
  7. Dim ligne_cible As Range
  8. 'On suppose que la macro est dans le classeur cible
  9. Set feuille_cible = ThisWorkbook.Worksheets("digest PE")
  10.  
  11. Dim classeur_source As Workbook
  12. Dim feuille_source As Worksheet
  13. ' //On fera une boucle pour en ouvrir plusieurs, voila comment faire une boucle avec ceci sachant que le workbooks.open change,
  14. ' //je n 'ai pas encore compris comment faire
  15. Set classeur_source = Workbooks.Open("BILAN POINTAGE2008test")
  16. Set feuille_source = classeur_source.Worksheets("Bilan")
  17.  
  18.  
  19. Dim cellule_source As Range
  20. Dim cellule_cible As Range
  21. Dim BEE As Integer
  22. Dim SOFT As Integer
  23.  
  24.  
  25. For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Row + 1)
  26. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.Range("A3").End(xlDown).Row + 1)
  27. ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
  28.  
  29. If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 1).Value = "A02" Then
  30.  
  31. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  32. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  33.  
  34. ' // Si on a trouvé, on sort.
  35. Exit For
  36. End If
  37. Next
  38. ' // Si on n'a pas trouvé, on arrive donc ici.
  39. ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
  40. ' //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) ?
  41.  
  42. cellule_cible.Value = cellule_source.Value
  43. cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
  44. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  45. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  46.  
  47.  
  48. Exit For
  49. Next
  50.  
  51.  
  52.  
  53.  
  54. ' // Fermeture
  55. classeur_source.Close False
  56.  
  57.  
  58. 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
Expert Programmation

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 :
  1. 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  )

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 ?

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

  1. 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

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)

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

  1. For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Offset(1))
  2. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.Range("A3").End(xlDown).Offset(1))
  3. ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
  4.  
  5. If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 1).Value = "A02" Then
  6.  
  7. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  8. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  9.  
  10. ' // Si on a trouvé, on sort.
  11. Exit For
  12. End If
  13. Next
  14. ' // Si on n'a pas trouvé, on arrive donc ici.
  15. ' // Il faut copier les valeurs de la source, vers la cible, y compris les données d'identification
  16. ' 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) ?
  17.  
  18. cellule_cible.Value = cellule_source.Value
  19. cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
  20. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  21. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value


  1. 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
Expert Programmation

Citation :
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: 

  1. For Each cellule_source In ...
  2. For Each cellule_cible In ...
  3. If ... Then
  4. ...
  5. ' // Si on a trouvé, on sort.
  6. Exit For
  7. End If
  8. Next
  9. ' // Si on n'a pas trouvé, on arrive donc ici.
  10. ' // Si on a trouvé, on arrive ici aussi.
  11. ...
  12. Next


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

Voici la solution au problème

  1. Dim found As Boolean
  2.  
  3. For Each cellule_source In ...
  4. found = False
  5. For Each cellule_cible In ...
  6. If ... Then
  7. ...
  8. ' // Si on a trouvé, on sort.
  9. found = True
  10. Exit For
  11. End If
  12. Next
  13. ' // Si on n'a pas trouvé, on arrive donc ici.
  14. ' // Si on a trouvé, on arrive ici aussi.
  15. If Not found Then
  16. ...
  17. End If
  18. Next


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


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 ?

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

  1. 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
Expert Programmation

Tu as une erreur 91 parce que la variable cellule_cible ne pointe pas sur une cellule valide.

A l'intérieur de la seconde boucle, c'est le For Each .. In qui fixait la valeur de ta variable. Mais à l'extérieur ?

Il faut donc que tu fasses quelque chose comme ça, juste après le If Not found :
  1. Set cellule_cible = feuille_cible.Range(???)

Reste à savoir où tu veux mettre ta valeur.

ah je pensais a sa mais je n'etais pas sur, ducoup sa me pose probleme
car le digest PE contient les affaires de plusieur années

2010
2009
2008
......

si l'affaire est de 2008 par exemple, il faut que la cellule soit dans les lignes de 2008, sachant que les lignes sont remplies de 2010 a 1999, comment faire pour dire que si une affaire est en 2008, il créé une ligne dans les affaire 2008.
sachant que j'ai une colonne ou il a marque les années

exemple
2010 10445551
2009 09004418
2008 08005521
2007 07058881

si j'ai une affaire 2008, qui n'est pas renseigne dans le digest PE il faut qu'elle vienne crée une ligne entre les années 2009 et 2007
les numéraux d'affaire comment toujours par les 2 derniers chiffres de l'années exemple 2010 afffare 01XXXXXX et 2008 08XXXXXX

j'espère avoir été assez explicite pour que tu puisse m'aider
Expert Programmation

Tu as été explicite, mais tu viens de me demander de faire pour toi un travail évident.

>> comment faire pour dire que si une affaire est en 2008, il créé une ligne dans les affaire 2008.

Sais-tu créer une ligne ? (demande à l'enregistreur de macro)
Sais-tu repérer la zone des 2008 ?

ah oui je l'avais oublie celui la l'enregistreur, pour créer une ligne je pense savoir le faire mais la zone des 2008 n'est pas fixe car on rajoute des affaire régulièrement, mais mon tuteur (enfin ancien du coup ) m'a dit car je suis allé le voir car il était en vacance quand je suis partie , de lui afficher un message comme quoi l'affaire n'est pas renseigne si je n'arrivais pas a faire l'insertion.
je pense donc pour l'instant supprimer la partie ou les affaires n'existe pas pour faire d'abord marcher le programme et remplir les affaires qui sont trouvé,

donc j'en reviens au départ comment on fait pour extraire

je fais :
  1. Set classeur_source = Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointages\BILAN POINTAGE2008 test.xls")
  2. Set feuille_source = classeur_source.Worksheets("Bilan")


je le fais poru chaque classeur ? l'un après l'autre ?

j'ai lancer le programme tel quel après avoir mis en commentaire la partie pour les affaire inexistantes et le programme s'effectue mais rien ne se remplie dans le tableau digest PE dans les cellule BEE et SOFT

voici le code :
  1. Option Explicit
  2.  
  3. Sub remplire_digest_PE()
  4.  
  5.  
  6. Dim feuille_cible As Worksheet
  7. Dim ligne_cible As Range
  8. 'On suppose que la macro est dans le classeur cible
  9. Set feuille_cible = ThisWorkbook.Worksheets("digest PE ")
  10.  
  11. Dim classeur_source As Workbook
  12. Dim feuille_source As Worksheet
  13. 'On fera une boucle pour en ouvrir plusieurs, voila comment faire une boucle avec ceci sachant que le workbooks.open change,
  14. 'je n 'ai pas encore compris comment faire
  15. Set classeur_source = Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointagesbis\BILAN POINTAGE2008 test.xls")
  16. Set feuille_source = classeur_source.Worksheets("Bilan")
  17.  
  18.  
  19. Dim cellule_source As Range
  20. Dim cellule_cible As Range
  21. Dim BEE As Integer
  22. Dim SOFT As Integer
  23. Dim found As Boolean
  24.  
  25.  
  26. For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Offset(1))
  27. found = False
  28. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3"), feuille_cible.Range("A3").End(xlDown).Offset(1))
  29. ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
  30.  
  31. If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 1).Value = "A02" Then
  32.  
  33. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  34. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  35. found = True
  36.  
  37. ' // Si on a trouvé, on sort.
  38. Exit For
  39. End If
  40. Next
  41. ' // Si on n'a pas trouvé, on arrive donc ici.
  42.  
  43. ' //If Not found Then
  44. '//cellule_cible.Value = cellule_source.Value
  45. '//cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
  46. '//cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  47. '//ellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  48. ' //End If
  49.  
  50.  
  51. Exit For
  52. Next
  53.  
  54.  
  55.  
  56.  
  57. ' // Fermeture
  58. classeur_source.Close False
  59.  
  60.  
  61. End Sub


une idée?
Expert Programmation

Déjà, t'as raison, un problème à la fois.

Les lignes de codes sont trop longues à mon goût. Les yeux me piquent.
Je réécris ça (L'EDI de VB, c'est vraiment de la merde. Pas moyen de présenter proprement le code)

  1. For Each cellule_source In feuille_source.Range(feuille_source.Range("B3" ), _
  2. feuille_source.Range("B3" ).End(xlDown).Offset(1))
  3. found = False
  4. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3" ),
  5. feuille_cible.Range("A3" ).End(xlDown).Offset(1))
  6. If cellule_source.Value = cellule_cible.Value And _
  7. cellule_source.Offset(, 1).Value = "A02" _
  8. Then
  9. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + _
  10. cellule_source.Offset(, 3).Value
  11. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + _
  12. cellule_source.Offset(, 4).Value
  13. found = True
  14. Exit For
  15. End If
  16. Next
  17. ' // Si on n'a pas trouvé, on arrive donc ici.
  18. ....
  19. Exit For
  20. Next
Dis-donc, il sert à quoi ce Exit For à la ligne 19 ?
Les calcul se font entre les lignes 9 à 12. C'est là qu'il faut se concentrer.
Tu me rappelles les règles de calcul de BEE et SOFT, steuplé.

Salut, alors le BEE et SOFt ne servent a rien dans le code j'ai oublier de les virer,

pour remplir les cellules BEE et SOFT c'est entre les ligne 9 et 12

  1. cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value // BEE
  2. cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value // SOFT


on a 2 for each alors il faut bien 2 exite for et next, il me semble, j'ai essaye d'enlever le exit for next de la fin, il me dit, for sans next erreur compilation

et oui VB c'est vraiment la merde pour faire un code propre
Expert Programmation

Euh........
Mékesturacont ?

Exercice pour tout de suite:
  1. Dim i As Integer
  2. For i = 0 To 9
  3. MsgBox "Sans Exit For : " & i
  4. Next
  5.  
  6. For i = 0 To 9
  7. MsgBox "Avec Exit For : " & i
  8. Exit For
  9. Next
  10.  
  11. For i = 0 To 10000
  12. MsgBox i & ", plus que " & 10000 - i & " clics"
  13. If i = 9 Then
  14. MsgBox "Y en a marre !"
  15. Exit For
  16. End If
  17. Next
Expert Programmation

Alors c'est la condition qui ne correspond pas [:spamafote]
  1. cellule_source.Value = cellule_cible.Value And _
  2. cellule_source.Offset(, 1).Value = "A02"

Tu es sûr de ça ? Et es-tu sûr de ne pas comparer " toto" et "toto " (note les espaces) par exemple ?

Salut, j'ai tout vérifié alors en fait c'est :

  1. If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 2).Value = "A02"


la colonne chapitre dans le fichier source est décale de 2 cran et pas 1 par rapport a la cellule_source mais après avoir rectifier sa, le programme s'exécute toujours mais rien ne change( rien ne se remplie, rien ne se modifie.....)

la j'ai tout vérifié alors je comprends pas pourquoi sa marche pas, même si pour l'instant je le fais que pour une année alors qu'il me faut toutes les années, sa devrait au moins marcher ................
Expert Programmation

Pose un point d'arrêt sur cette ligne.
Dans la fenêtre espion, ajoute ces lignes :

cellule_source.Address
cellule_source.Value
cellule_cible.Address
cellule_cible.Value
cellule_source.Offset(, 2).Address
cellule_source.Offset(, 2).Value
cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 2).Value = "A02"

Lance (F5) ton traitement et quand ça s'arrête, appuie sur F8.
Lis tes valeurs et vérifie-les. Puis relance (F5). Alors ?

je crois avoir trouver le problème, qui est vraiment bête mais dure a résoudre vu le nombre d'affaire dans le digest PE
les affaire dans les bilans sont de la forme xx.xx.xxxx or dans le digest pe, elles sont xxxxxxxx , il n'y a pas de points, du coup je pense qu'il trouve aucune affaire identique et donc ne renseigne rien, j'ai mis sous la même forme une affaire du digest pe et du bilan et ne marche toujours pas, ps merci beaucoup pour les espions j'ai lu comment sa marche et sa ma permis aussi de voir que j'avais mis les mauvaises adresses de mes cellule_source et cible, enfin la j'ai reste, la fenêtre espion m'indique les bonnes infos et l'affaire est introuvable du fait que la forme est différente donc normal que sa ne marche pas, par contre quand je teste sans le point d'arrêt, les heures de l'affaire que j'ai dont j'ai mis la même forme des 2 cotés ne se remplissent pas, alors la je comprends pas pourtant, j'ai bien verifié les valeurs de mes fenêtres espions et il y a les bonnes adresses, type, et valeur A02
Expert Programmation

Rhooo ! Je disais :
Citation :
Tu es sûr de ça ? Et es-tu sûr de ne pas comparer " toto" et "toto " (note les espaces) par exemple ?
Il fallait lire
Citation :
Tu es sûr de ça ? Et es-tu sûr de ne pas comparer ".t.o.t.o." et "toto" par exemple ?


Je crois que tu fais tes tests sur trop de données à la fois.
Isole quelques lignes pertinentes, une dizaine, et recommence tes tests.
Et oublie F5, fais tout avec F8 ou alors multiplie les points d'arrêt.

salut, j'ai fait des tests avec 2 affaire qui sont dans mon fichier 2008, et cela marche que sur la 1er,

apres j'ai une question comment on peut comparer des affaires de formes xx.xx.xxxx avec xxxxxxxx

pour mes test j'ai mis dans le planning 2 affaires de la forme xx.xx.xxxxx identiques a celles de ma feuille bilan 2008, alors je comprends pas pourquoi il me renseigne bien la 1er et pas la 2eme

je remets le code que j'ai actuellement

  1. Option Explicit
  2.  
  3. Sub remplire_digest_PE()
  4.  
  5. Dim feuille_cible As Worksheet
  6. Dim ligne_cible As Range
  7. 'On suppose que la macro est dans le classeur cible
  8. Set feuille_cible = ThisWorkbook.Worksheets("digest PE ")
  9.  
  10. Dim classeur_source As Workbook
  11. Dim feuille_source As Worksheet
  12. 'On fera une boucle pour en ouvrir plusieurs, voila comment faire une boucle avec ceci sachant que le workbooks.open change,
  13. 'je n 'ai pas encore compris comment faire
  14. Set classeur_source = Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointagesbis\BILAN POINTAGE2008 test.xls")
  15. Set feuille_source = classeur_source.Worksheets("Bilan")
  16.  
  17.  
  18. Dim cellule_source As Range
  19. Dim cellule_cible As Range
  20. Dim found As Boolean
  21.  
  22.  
  23. For Each cellule_source In feuille_source.Range(feuille_source.Range("A3"), feuille_source.Range("A3").End(xlDown).Offset(1))
  24. found = False
  25. For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("B3"), feuille_cible.Range("B3").End(xlDown).Offset(1))
  26. ' // Autant de ligne que de valeur à vérifier pour savoir si les lignes correspondent
  27.  
  28. If cellule_source.Value = cellule_cible.Value And cellule_source.Offset(, 2).Value = "A02" Then
  29.  
  30. cellule_cible.Offset(, 39).Value = cellule_cible.Offset(, 39).Value + cellule_source.Offset(, 3).Value
  31. cellule_cible.Offset(, 42).Value = cellule_cible.Offset(, 42).Value + cellule_source.Offset(, 4).Value
  32. found = True
  33.  
  34. ' // Si on a trouvé, on sort.
  35. Exit For
  36. End If
  37. Next
  38. ' // Si on n'a pas trouvé, on arrive donc ici.
  39.  
  40. ' If Not found Then
  41. 'cellule_cible.Value = cellule_source.Value
  42. 'cellule_cible.Offset(, 1).Value = cellule_source.Offset(, 2).Value
  43. 'cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value
  44. 'cellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
  45. ' End If
  46.  
  47. Exit For
  48. Next
  49.  
  50. ' // Fermeture
  51. classeur_source.Close False
  52.  
  53. End Sub


je sèche surtout sur le fait qu'il marche sur la 1er affaire et pas la 2eme, en plus je les ai mis en haut du fichier pour être sur que les autres affaires gênent pas

Bonjour, voila pour la différences de formats des affaires de mes bilans et planning c'est résolue, dans le fichier bilan pointage duquel j'étais partie, il y avait un petit module pour mettre en forme les affaires avec les "." donc je pense le réutiliser pour mettre en forme les affaires du planning mais sinon concernant le fait que le programme marche sur ma 1er affaire test et pas la 2eme je n'ai pas encore résolue ce problème; toutes idées sont la bienvenue
merci
Lassé par la pub ? Créez un compte