Se connecter avec
S'enregistrer | Connectez-vous

RECUPERATION DES DONNEES FICHIERS .XLS

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

lasioule a dit :
bonjour

j'ai stockés mes factures que j'ai nommés (FACT 1.xls, FACT 2.xls,.......FACT N.xls)

dans un dossier nommé 'FACTURES'.

comment dois-je récupérer les noms des clients qui se trouvent dans les cases B3 de chaque facture et les regrouper par ordre (1,2,3.....N)

merci de votre aide


MERCI 'ZEB' LE TITRE EST CHANGE.
Expert Programmation

Salut,

Arrête de crier, et lâche la touche [Maj] :lol: 
Ne mets pas mon nom entre guillemets, c'est mon vrai nom. :fou: 

Je répète : Et comment prévois-tu de traiter ton problème ?
Quel programme traite, où vont les données, etc.

Re ZEB, merci pour les conseils.

Voilà mes factures sont classées de 1 à n+1 (FACT 1.xls, FACT 2.xls,.......FACT N.xls) dans un dossier nommé : FACTURES.

Les noms des clients se trouvent dans chaque feuilles (FACT N.xls) dans les cases B3.

mon problème, j'ai crée un autre classeur utilisant une feuille où j'ai rentré plusieurs données et j'aimerais créer une colonne pour importer les noms des clients qui logent ds la case B3 de chaque facture (qui se trouvent dans le dossier : FACTURES)

Y a t-il un moyen avec la fonction RECHERCH ou il faut créer une macro?

Encore une fois Merci ZEB http://img.infos-du-net.com/forum/icones/tongue.gif

A mon avis, utiliser la fonction RECHERCH ne suffira pas. Etant donné que tu dois rechercher le nom chaque fois dans un fichier différent (qu'il faudra donc ouvrir, et par la même occasion fermer aussi). Il faudra donc à mon avis obligatoirement passer par une macro. En tout cas, cela me semble la solution la plus simple pour moi.

Sans te donner directement la réponse, utilise l'enregistreur de macro pour importer un seul nom.

En gros tu lances l'enregistreur et ensuite tu procèdes à toutes les étapes nécessaire pour importer le nom, à savoir ouvrir le fichier Fact1.xls, copier le nom dans la colonne que tu souhaites, fermer le fichier Fact1.xls et enfin arrêter l'enregistreur de macro. Ensuite tu reviens avec le code qu'il a généré en le recopiant sur ce forum (n'oublie pas de l'intercaler entre les balises).
Et on regardera ensemble ce qu'il faudra modifier pour qu'il puisse faire la même chose avec toutes tes factures.

Merci pour la réponse,

Le problème c'est l'ouverture et fermeture de chaque facture (il y en a 1800).

Pouvez me donner le code pour la macro qui fait cette cherche. J'essayerais une seule facture. Merci

en suivant votre démarche, suite à l'essai pour 2 factures ci joint l'enregistrement de la macro:
  1. Sub import()
  2.  
  3. ' Macro enregistrée le 16/09/2010 par la sioule
  4. '
  5.  
  6. '
  7. Range("D2").Select
  8. Selection.Copy
  9. Windows("recap.xls").Activate
  10. ActiveSheet.Paste
  11. Windows("FAC1.xls").Activate
  12. ActiveWindow.Close
  13. Range("A8").Select
  14. Selection.Copy
  15. Windows("recap.xls").Activate
  16. Range("D3").Select
  17. ActiveSheet.Paste
  18. Windows("FAC2.xls").Activate
  19. ActiveWindow.Close
  20. End Sub

as tu la possibilité de faire le chemin inverse !

a la place d'aller chercher l'info de chaque fichier c'est la facture qui doit ecrit dans un fichier la valeur de ta cellule dans un fichier qui se nomera client et qui vas centralisé tous tes client

PS : fait gaf de bien crée une nouvelle ligne pour chaque client !
a+

Bonsoir et merci de ton aide

mais les factures sont enregistrées de (FACT 1.xls à FACT 1802.xls) je me vois mal à reprendre toute les factures une par une, afin de sortir à chaque les noms des clients qui se trouvent dans B3 et les exporter sur une colonne d'une autre feuille.
merci de m'indiquer si je fais le test sur une facture et comment faire une boucle de recherche sur les autres facture sans que je les ouvre toutes.
cordialement

Voilà de quoi te dépanner. Bon C'est pas du grand art, mais en principe cela fonctionne. Je laisse au bon soin de Zeb d'améliorer mon code pour faire plus "pro" :-)


  1. Private Sub ImporterNom()
  2. Dim i As Integer
  3. Dim Chemin, F1, F2 As String
  4.  
  5. Chemin = "C:\fichiers\excel\" ' à remplacer par le rep où se trouve tes factures
  6. F1 = "Feuil1" ' à remplacer par le nom de la feuille où est stocké le nom que tu vx copier
  7. F2 = "Feuil1" ' à remplacer par le nom de la feuille où tu va écrire le nom ds le fichier Recap.xls
  8. For i = 1 To 1802
  9. Workbooks.Open Filename:=Chemin & "fact " & i & ".xls"
  10. Workbooks("recap.xls").Sheets(F2).Cells(i, 1) = Workbooks("fact " & i & ".xls").Sheets(F1).Range("B3")
  11. Application.DisplayAlerts = 0
  12. Windows("fact " & i & ".xls").Close
  13. Application.DisplayAlerts = 1
  14. Next
  15. End Sub

Bonjour et merci pour ton aide beru. ci joint le code avec les modifications:

  1. Private Sub ImporterNom()
  2. Dim i As Integer
  3. Dim Chemin, F1, F2 As String
  4. Chemin = "C:\Users\Desktop\GCP10\FACTURE 2010\"
  5. ' à remplacer par le rep où se trouve tes factures
  6. F1 = "FACTURE" ' à remplacer par le nom de la feuille où est stocké le nom que tu vx copier
  7. F2 = "FEUIL1" ' à remplacer par le nom de la feuille où tu va écrire le nom ds le fichier Recap.xls
  8. For i = 1 To 1802
  9. Workbooks.Open Filename:=Chemin & "FACT " & i & ".xls"
  10. Workbooks("recap.xls").Sheets(F2).Cells(i, 1) = Workbooks("FACT " & i & ".xls").Sheets(F1).Range("B3")
  11. Application.DisplayAlerts = 0
  12. Windows("FACT " & i & ".xls").Close
  13. Application.DisplayAlerts = 1
  14. Next
  15. End Sub


Le chemin est correcte mais s'abloque au niveau de la ligne:
  1. Workbooks.Open Filename:=Chemin & "FACT " & i & ".xls"


Merci pour toi ....Au secours c'est presque

Dans ton exemple, tu as indiqué que le nom des fichiers étaient Fact 1.xls (à savoir avec un espace entre le Fact et le 1)
si ce n'est pas le cas il faut bien entendu le retirer ce qui devient :
  1. Private Sub ImporterNom()
  2. Dim i As Integer
  3. Dim Chemin, F1, F2 As String
  4.  
  5. Chemin = "C:\Users\Desktop\GCP10\FACTURE 2010\"
  6. F1 = "FACTURE"
  7. F2 = "FEUIL1"
  8.  
  9. For i = 1 To 1802
  10. Workbooks.Open Filename:=Chemin & "FACT" & i & ".xls"
  11. Workbooks("recap.xls" ).Sheets(F2).Cells(i, 1) = Workbooks("FACT" & i & ".xls" ).Sheets(F1).Range("B3" )
  12. Application.DisplayAlerts = 0
  13. Windows("FACT" & i & ".xls" ).Close
  14. Application.DisplayAlerts = 1
  15. Next
  16. End Sub


Expert Programmation

Salut Béru,

C'est mal mal dis donc :) 
Juste une petite chose, pour ne pas avoir à se fier au nom des fenêtres, utilise des variables. Et étudie les paramètres de Close() pour ne pas avoir à te prendre la tête avec des DisplayAlerts :
  1. Dim wk_recap As Workbook
  2. Dim wk_facture As Workbook
  3.  
  4. ' // La définition de la macro doit être dans recap.xls
  5. Set wk_recap = ThisWorkbook
  6.  
  7. ...
  8. Set wk_facture = Workbooks.Open(Chemin & "FACT" & i & ".xls")
  9. wk_recap.Worksheets("FACTIRE").Cells(i, 1) = wk_facture.Worksheets(1).Range("B3" )
  10. wk_facture.Close False


Autre chose, ce programme ne fonctionne plus si on a pas exactement 1802 fichiers FACT. C'est un peu dommage.

Plutôt qu'un For, je propose un Dir() :
  1. Private Sub ImporterNom()
  2. Dim cell_recap As Range
  3. Dim wk_facture As Workbook
  4. Dim fname As String
  5.  
  6. ' // La définition de la macro doit être dans recap.xls
  7. Set cell_recap = ThisWorkbook.Worksheets("FACTURE").Range("A1")
  8.  
  9. On Error Resume Next
  10.  
  11. fname = Dir("C:\Users\Desktop\GCP10\FACTURE 2010\FACT*.xls")
  12. Do While fname <> ""
  13. Set wk_facture = Workbooks.Open(fname)
  14. If Not wk_facture Is Nothing Then
  15. cell_recap.Value = wk_facture.Worksheets(1).Range("B3" )
  16. Set cell_recap = cell_recap.Offset(1)
  17. wk_facture.Close False
  18. End If
  19. fname = Dir
  20. Loop
  21.  
  22. On Error GoTo 0
  23. End Sub


Qu'en pensez-vous ?

Nettement plus pro, il n'y a pas à dire. J'admire !!
Merci pour l'astuce du close que je ne connaissais pas, et au poil l'utilisation de l'offset.
Sinon, petite question pour ma culture générale, le Goto 0 il fait quoi là dedans, ou du moins permet de retourner à quel niveau du code?

Expert Programmation

Quand on ne précise rien, le VB plante lamentablement en cas d'erreur.

Pour éviter les fichiers qui ne s'ouvrent pas, ou ce genre de chose, je passe à la suite en cas de problème (Resume Next). A l'issue, je remets le système dans l'état dans lequel il était : On Error GoTo 0.

;) 

Citation :
l'astuce du close que je ne connaissais pas
RTFM !!!!
Citation :
au poil l'utilisation de l'offset.
Ah ça, j'en use et j'en abuse. J'en mets partout. Et t'as vu, pas de variable inutile, de double indentation dans la feuille source et dans la feuille cible.

Le cas classique : Copier la zone A1:A10 de la feuille 1 vers la feuille 2 si on a 1 dans la colonne B

  1. Dim i As Long
  2. Dim j As Long
  3.  
  4. j = 1
  5. For i = 1 To 10
  6. ' // Tant qu'à faire du code pas beau, j'utilise Range au lieu de Cells ;-)
  7. If Feuil1.Range("B" & i) = 1 Then
  8. Feuil2.Range("A" & j) = Feuil1.Range("A" & i)
  9. j = j + 1
  10. End If
  11. Next


Beurk. J'aime les objets, moi :love: 

  1. Dim cell_source As Long
  2. Dim cell_target As Long
  3.  
  4. Set cell_target = Feuil2.Range("A1")
  5. For cell_source In Feuil1.Range("A1:A10")
  6. If cell_source.Offset(0, 1).Value = 1 Then
  7. cell_target.Value = cell_source.Value
  8. Set cell_target = cell_target.Offset(1, 0)
  9. End If
  10. Next


Je trouve cela tellement plus élégant. La beauté est dans le fait que rien n'est recalculé plus d'une fois. De là découlent des macros très rapides. Et en VB, ce n'est pas une petite économie :sarcastic: 

C'est vrai que le second code est nettement plus élégant (et pourtant il y a des range :-), mais il faut avouer que pour des personnes qui débutent en vba, ils auront plus facile de "décrypter" le premier code que le second. Pour moi les deux ont leur intérêt je trouve.

Bonsoir beru et encore merci pour votre réponse.

Ci joint un fragement du code qui bloque,
j'ai fait un essai pour facture (i=1 to i=2) mais en vain.

  1. Private Sub ImporterNom()
  2. Dim cell_recap As Range
  3. Dim wk_facture As Workbook
  4. Dim fname As String
  5.  
  6. ' // La définition de la macro doit être dans recap.xls
  7. Set cell_recap = ThisWorkbook.Worksheets("FACTURE" ).Range("A1" )
  8.  
  9. On Error Resume Next
  10.  
  11. fname = Dir("C:\Users\Desktop\GCP10\FACTURE 2010\FACT*.xls" )
  12. Do While fname <> ""
  13. Set wk_facture = Workbooks.Open(fname)
  14. If Not wk_facture Is Nothing Then
  15. cell_recap.Value = wk_facture.Worksheets(1).Range("B3" )
  16. Set cell_recap = cell_recap.Offset(1)
  17. wk_facture.Close False
  18. fname = Dir
  19. Loop
  20.  
  21. On Error GoTo 0
  22. End Sub

Bjr,

je viens de voir votre discussion et je pense que vous pouvez m'aider.

j'ai un fichier1.xls qui ce créer chaque jours à l'aide d'un logiciel, et j'ai un autre fichier2.xlsx qui est ma base de donnée ou je me permet de faire des calcul bien définit etc...
Sans les données qui se trouvent dans le fichier1, le fichier2 ne sert à rien!
J'aimerais donc récupérer les données du fichiers1.

Pour cela je n'ai pas fait comme vous j'ai adressé une formule dans ma cellule qui me permettrais de récuperer les données si les fichier1 s'ouvrent lors de leurs création!!!!! et comme il ne doit pas avoir d'action manuelle dans mon logiciel il fo que cela se fasse automatiquement.

Ma formule dans les cellules du fichier 2:

='C:\Users\test\[RGEnergie201101021123.xls]feuil1'!C5

Comment je pourrais ouvrir des fichiers qui n'existe pas encore avec les macros ou le vba?
Lassé par la pub ? Créez un compte