Extraire donnees vers plusieurs classeurs

FireGunz

XLDnaute Nouveau
Bonjour,

Voila j'ai un fichier avec enormement de lignes.
j'ai mis un exemple en piece jointe.
En fait je voudrais creer un classeur par nom de client avec les produits qu'il a achete.
Mes connaissances Excel s'arretant aux macros, je ne vois pas trop comment faire...
De plus, cela devrait etre a une place speciale dans le fichier.
Il me faudrait au moins le numjeros d'item, apres je pourrais faire des vlookup.

ps: je suis en version americaine.

En vous remerciant d'avance.
 

Pièces jointes

  • Exemple.xlsx
    9.9 KB · Affichages: 44
  • Exemple.xlsx
    9.9 KB · Affichages: 42
  • Exemple.xlsx
    9.9 KB · Affichages: 46
  • Template.xlsx
    10.4 KB · Affichages: 38
  • Template.xlsx
    10.4 KB · Affichages: 40
  • Template.xlsx
    10.4 KB · Affichages: 44

Robert

XLDnaute Barbatruc
Repose en paix
Re : Extraire donnees vers plusieurs classeurs

Bonjour FireGuz, bonjour le forum,

Le code ci-dessous nécessite que tous les classeurs soient dans le même dossier que le fichier Exemple.xlsm pour pouvoir fonctionner !
Il va vérifier toutes les cellules éditées (noms des clients) en colonne D.
Soit, le fichier valeur_de_la_cellule.xlsx existe et, dans ce cas, il l'ouvre et copie la ligne entière à la suite... Sinon, il ouvre le fichier Template.xlsx, il l'enregistre sous valeur_de_la_cellule.xlsx, copie la ligne entière à la suite. Le classeur Template.xlsx est alors fermé sans enregistré.
Le classeur valeur_de_la_cellule.xlsx est sauvé puis fermé... La boucle passe à la cellule suivante.
Le code :

Code:
Sub Macro1()
Dim ch As String 'déclare la variable ch(CHemin d'accès)
Dim cs As Workbook 'déclare la variable cs(Classeur Source)
Dim dl As Integer 'déclare la variable dl(Dernière Ligne)
Dim pl As Range 'déclare la variable pl(PLage)
Dim cel As Range 'déclare la variable cel(CELlule)
Dim cc As Workbook 'déclare la variable cc(Classeur Cible)
Dim dest As Range 'déclare la variable dest(cellule de DESTination)


Application.ScreenUpdating = False 'masque les changements à l'écran
ch = ThisWorkbook.Path & "\" 'définit le chemin d'asccès ch
Set cs = ThisWorkbook 'définit le classeur source
With cs.Sheets("Sheet1") 'prend en compte l'onglet "Sheet1" du classseur source
    dl = .Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne éditée de la colonne 4 (=D)
    Set pl = .Range("D2:D" & dl) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Sheet1" du classseur source
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Set cc = Workbooks(ch & cel.Value & ".xlsx") 'définit le classeur cible (génère une erreur si le classeur n'est pas ouvert)
    If Err <> 0 Then Err = 0 Else GoTo suite 'si une erreur a été générée, annule l'erreur, sinon va à l'étiquette "suite"
    Workbooks.Open (ch & cel.Value & ".xlsx") 'ouvre le classeur (génère une erreur si le classeur n'existe pas)
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        Workbooks.Open (ch & "template.xlsx") 'ouvre le fichier "Template.xlsx"
        ActiveWorkbook.SaveAs (ch & cel.Value & ".xlsx") 'enregisre le fichier sous : nom de la cellule
        Workbooks("template.xlsx").Close SaveChanges:=False 'ferme le classeur Template.xlsx sans sauver
    End If 'fin de la condition
suite: 'étiquette
    On Error GoTo 0 'annule la gestion des erreurs
    Set cc = ActiveWorkbook 'définit le classeur cible
    Set dest = cc.Sheets("Sheet1").Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination dans l'onglet "Sheet1" du classeur cible
    cel.EntireRow.Copy dest 'copie la ligne enière de la cellule et la colle dans dest
    cc.Close SaveChanges:=True 'ferme le classeur cible en sauvant les données
Next cel 'prochaine cellule de la boucle
Application.ScreenUpdating = True 'affiche les changements à l'écran
MsgBox "Traitement des données terminé !" 'message
End Sub
Le classeur :
 

Pièces jointes

  • Exemple.xlsm
    21.3 KB · Affichages: 41
  • Exemple.xlsm
    21.3 KB · Affichages: 47
  • Exemple.xlsm
    21.3 KB · Affichages: 54

FireGunz

XLDnaute Nouveau
Re : Extraire donnees vers plusieurs classeurs

Mille merci deja sa m'avance pas mal.
Est-il possible de ne pas copier toute la ligne ?
Le customer number en b17 dans template.
Name sera le nom du classeur mais apparait aussi en B16 dans le template
Ord Type on s'en fiche
Unit price en E dans template mais je ferais des vlookup si ce n'est pas possible
On peut mettre invoice date en H mais ce n'est pas tres important.
Target et Action on laisse c'est a faire manuellement quand il recommande le produit mais avec le nouveau format on en aura plus besoin.
Pour les colones B,C,D je voudrais faire un vlookup d'un autre classeur car les informations ne sont pas exacte sur le fichier.
 

FireGunz

XLDnaute Nouveau
Re : Extraire donnees vers plusieurs classeurs

Re Bonjour,

J'ai finnalement fait mon Vlookup avant, c'etait plus logique.
Mes deux tablaux ont maintenant cette forme:
Item Number Item Description 1 Item Description 2 Item Description 3 List Price Quantity Total Customer# Name

8 Colones donc.

Ne pas tennir compte de quantity et total.

La maccro fonctionne bien, mais serait il possible de faire apparaitre le numeros de client et le nom juste une fois en haut (comme dans le template). De plus, creer une feuille differente pour chaque item description differente (qui ccorespond en fait a une collection) avec le nom de la description.

Pourrais tu me donner ton mail par mp ou autre stp ?
 

FireGunz

XLDnaute Nouveau
Re : Extraire donnees vers plusieurs classeurs

J'ai trouver une autre solution, je mis mes prix par dates dans un pivottable.
Il faudrais juste qu'au lieu de copier toute la ligne avec la macro que sa copie certaine colone.
En fait je mettrais mon vlookup dans le template.
Merci d'avance
 

Catsnroses

XLDnaute Nouveau
bonjour,
je reviens sur ce post qui date un peu. Ce code m'a énormément aidé mais j'aurais besoin de le modifier pour qu'il colle les données sans les formules, juste les valeurs. J'ai beau chercher, je ne trouve pas comment le modifier. Merci d'avance pour votre aide.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Heu oui ça date (comme dirait Anouar El)...
Pour copier/coller les valeur ça donnerait :
VB:
    cel.EntireRow.Copy 'copie la ligne enière de la cellule
    dest.PasteSpecial (xlPasteValues)  'colle les valeurs dans dest
 

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 216
Membres
103 158
dernier inscrit
laufin