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
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
enfin brefJ'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
Autres pages sur : extraction donnees plusieurs fichier mettre aut
Lassé par la pub ? Créez un compte
bon voila ou jen suis pour l'extraction, sa vance guere, mais je continue a cherche
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é
)
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))
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é
)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
j'essaye de le comprendre et de m'en inspirer mais j'en suis la
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
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
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
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
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
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
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
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.
Bon, maintenant, il manque un ptit truc entre l'ouverture et la fermeture
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.
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>)
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
On va parcourir la feuille source en collectant les informations pertinentes pour la comparaison avec la feuille cible.
Parcourir, c'est facile :
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...
Parcourir, c'est facile :
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 : 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
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 ?
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
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 ?
Salut, en ce dimanche tout autan caniculaire,
voila le code actuel
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
voila le code actuel
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
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 :
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
)
Erreur ligne 9 ? Ben il n'y a pas de feuille "digest PE" dans ton classeur, c'est tout.
C'est pas bon, ça :
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
)
salut, en ce lundi ou j'ai fini mon stage mais j'ai quand même envie de finir ce truc
( 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 ?
( 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
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
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 :
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
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
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
Citation :
je vais écrire un mot a microsoft![[:diabolo] [:diabolo]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/0c/9e/diabolo.gif)
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
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] [:patch]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/e5/c5/patch.gif)
Et oui....
Voici la solution au problème
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 :
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
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
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
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 :
Reste à savoir où tu veux mettre ta valeur.
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 :
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
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
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 :
je le fais poru chaque classeur ? l'un après l'autre ?
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 :
Set classeur_source = Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointages\BILAN POINTAGE2008 test.xls")
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 :
une idée?
voici le 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("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointagesbis\BILAN POINTAGE2008 test.xls")
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
Dim found As Boolean
For Each cellule_source In feuille_source.Range(feuille_source.Range("B3"), feuille_source.Range("B3").End(xlDown).Offset(1))
found = False
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
found = True
' // Si on a trouvé, on sort.
Exit For
End If
Next
' // Si on n'a pas trouvé, on arrive donc ici.
' //If Not found Then
'//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
'//ellule_cible.Offset(, 4).Value = cellule_cible.Offset(, 4).Value + cellule_source.Offset(, 4).Value
' //End If
Exit For
Next
' // Fermeture
classeur_source.Close False
End Sub
une idée?
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)
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é.
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)
Dis-donc, il sert à quoi ce Exit For à la ligne 19 ?
For Each cellule_source In feuille_source.Range(feuille_source.Range("B3" ), _
feuille_source.Range("B3" ).End(xlDown).Offset(1))
found = False
For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("A3" ),
feuille_cible.Range("A3" ).End(xlDown).Offset(1))
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
found = True
Exit For
End If
Next
' // Si on n'a pas trouvé, on arrive donc ici.
....
Exit For
Next
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
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
pour remplir les cellules BEE et SOFT c'est entre les ligne 9 et 12
cellule_cible.Offset(, 7).Value = cellule_cible.Offset(, 7).Value + cellule_source.Offset(, 3).Value // BEE
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
Euh........
Mékesturacont ?
Exercice pour tout de suite:
Mékesturacont ?
Exercice pour tout de suite:
Dim i As Integer
For i = 0 To 9
MsgBox "Sans Exit For : " & i
Next
For i = 0 To 9
MsgBox "Avec Exit For : " & i
Exit For
Next
For i = 0 To 10000
MsgBox i & ", plus que " & 10000 - i & " clics"
If i = 9 Then
MsgBox "Y en a marre !"
Exit For
End If
Next
Salut, j'ai tout vérifié alors en fait c'est :
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 ................
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 ................
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 ?
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
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
Rhooo ! Je disais :Il fallait lire
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.
Citation :
Tu es sûr de ça ? Et es-tu sûr de ne pas comparer " toto" et "toto " (note les espaces) par exemple ? 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
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
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
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("C:\Documents and Settings\Administrateur\Bureau\dossier Pillard\Fiches Pointagesbis\BILAN POINTAGE2008 test.xls")
Set feuille_source = classeur_source.Worksheets("Bilan")
Dim cellule_source As Range
Dim cellule_cible As Range
Dim found As Boolean
For Each cellule_source In feuille_source.Range(feuille_source.Range("A3"), feuille_source.Range("A3").End(xlDown).Offset(1))
found = False
For Each cellule_cible In feuille_cible.Range(feuille_cible.Range("B3"), feuille_cible.Range("B3").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(, 2).Value = "A02" Then
cellule_cible.Offset(, 39).Value = cellule_cible.Offset(, 39).Value + cellule_source.Offset(, 3).Value
cellule_cible.Offset(, 42).Value = cellule_cible.Offset(, 42).Value + cellule_source.Offset(, 4).Value
found = True
' // Si on a trouvé, on sort.
Exit For
End If
Next
' // Si on n'a pas trouvé, on arrive donc ici.
' If Not found Then
'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
' End If
Exit For
Next
' // Fermeture
classeur_source.Close False
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
merci
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumComment mettre un fichier sur utorrent
- ForumExtraction nom de fichier
- ForumExtraction liste fichier repertoire
- ForumComment mettre un fichier iso sur dvd
- ForumMettre un fichier sur le serveur
- ForumMettre un dossier dans un fichier
- ForumComment mettre un fichier word sur cd
- ForumMettre un fichier en csv
- ForumRechercher dans un fichier excel des données
- ForumExtraction donnã e dans plusieurs fichier excel
- Voir plus
)
![[:spamafote] [:spamafote]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/3e/46/spamafote.gif)
![[:boudamagic] [:boudamagic]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/3a/35/boudamagic.gif)