RECUPERATION DES DONNEES FICHIERS .XLS

lasioule

Nouveau membre
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
 

zeb

Modérateur
Bonjour,

Change le titre de ton message s'il te plaît. Pour ce faire :
Vous devez être connecté pour voir les images.

Et comment prévois-tu de traiter ton problème ?
 

lasioule

Nouveau membre


MERCI 'ZEB' LE TITRE EST CHANGE.
 

zeb

Modérateur
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.
 

lasioule

Nouveau membre
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

 

beru

Habitué
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.
 

lasioule

Nouveau membre
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:
Code:
Sub import()

' Macro enregistrée le 16/09/2010 par la sioule
'

'
    Range("D2").Select
    Selection.Copy
    Windows("recap.xls").Activate
    ActiveSheet.Paste
    Windows("FAC1.xls").Activate
    ActiveWindow.Close
    Range("A8").Select
    Selection.Copy
    Windows("recap.xls").Activate
    Range("D3").Select
    ActiveSheet.Paste
    Windows("FAC2.xls").Activate
    ActiveWindow.Close
End Sub
 

chonos

Helper
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+
 

zeb

Modérateur
Merci de respecter le règlement. Toute pièce de code doit être présentée entre les balises
Code:
[[i]/[/i]code]
[:zeb:6]
 

lasioule

Nouveau membre
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
 

beru

Habitué
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" :)


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

lasioule

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

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

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

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

beru

Habitué
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 :
Code:
Private Sub ImporterNom()
Dim i As Integer
Dim Chemin, F1, F2 As String

    Chemin = "C:\Users\Desktop\GCP10\FACTURE 2010\"
    F1 = "FACTURE" 
    F2 = "FEUIL1"

        For i = 1 To 1802
            Workbooks.Open Filename:=Chemin & "FACT" & i & ".xls"
            Workbooks("recap.xls" ).Sheets(F2).Cells(i, 1) = Workbooks("FACT" & i & ".xls" ).Sheets(F1).Range("B3" )
            Application.DisplayAlerts = 0
            Windows("FACT" & i & ".xls" ).Close
            Application.DisplayAlerts = 1
        Next
End Sub

 

zeb

Modérateur
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 :
Code:
Dim wk_recap   As Workbook
Dim wk_facture As Workbook

' // La définition de la macro doit être dans recap.xls
Set wk_recap = ThisWorkbook

...
Set wk_facture = Workbooks.Open(Chemin & "FACT" & i & ".xls")
wk_recap.Worksheets("FACTIRE").Cells(i, 1) = wk_facture.Worksheets(1).Range("B3" )
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() :
Code:
Private Sub ImporterNom()
   	Dim cell_recap As Range
	Dim wk_facture As Workbook
	Dim fname      As String

	' // La définition de la macro doit être dans recap.xls
	Set cell_recap = ThisWorkbook.Worksheets("FACTURE").Range("A1")

	On Error Resume Next

    fname = Dir("C:\Users\Desktop\GCP10\FACTURE 2010\FACT*.xls")
    Do While fname <> ""
		Set wk_facture = Workbooks.Open(fname)
		If Not wk_facture Is Nothing Then
			cell_recap.Value = wk_facture.Worksheets(1).Range("B3" )
			Set cell_recap = cell_recap.Offset(1)
			wk_facture.Close False
		End If
		fname = Dir
    Loop

    On Error GoTo 0
End Sub

Qu'en pensez-vous ?
 

beru

Habitué
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?

 

zeb

Modérateur
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.

;)

l'astuce du close que je ne connaissais pas
RTFM !!!!
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

Code:
Dim i As Long
Dim j As Long

j = 1
For i = 1 To 10
    ' // Tant qu'à faire du code pas beau, j'utilise Range au lieu de Cells ;-)
    If Feuil1.Range("B" & i) = 1 Then 
    	Feuil2.Range("A" & j) = Feuil1.Range("A" & i)
    	j = j + 1
    End If
Next

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

Code:
Dim cell_source As Long
Dim cell_target As Long

Set cell_target = Feuil2.Range("A1")
For cell_source In Feuil1.Range("A1:A10")
    If cell_source.Offset(0, 1).Value = 1 Then 
    	cell_target.Value = cell_source.Value
    	Set cell_target = cell_target.Offset(1, 0)
    End If
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:
 

beru

Habitué
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.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 114
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut