Copier des données d'un classeur sans nom exact
Bonjour,
Je suis débutant de chez débutant en VBA, je commence juste à lire les tous premiers exercices
Voilà, j'ai environ 5000 classeurs avec comme nom "JOURNAL- puis la date (un par jour)" avec des données en feuille 5 cellule de A3 à F15 que je dois copier et coller dans mon classeur "BDD", il faudrait que je puisse coller ces cellules A3 à F15 en les transposant sur une ligne, les unes en dessous des autres de façon à ne pas avoir à tout trier derrière puisque cette macro me servira tous les jours ensuite, un nouveau classeur par jour...
En espérant que j'ai été assez clair
En tous cas merci beaucoup de votre aide si c'est possible bien sûr...
Pascal
Bonjour,
Donne le premier et le dernier nom du classeur "JOURNALxxx"
Envoie quelques classeurs "JOURNALXXXX" et le classeur BDD.
Sur les classeurs "JOURNALxxx" conserve quelques données significatives
Dans le classeur BDD remplit le (manuellement avec les données comme tu les souhaites organisées.
Par la suite, je suppose que tu souhaites rajouter les données des nouveaux classeurs (on ne réintègre pas chaque jour tous les classeurs).
@+
Bonsoir,
J'ai préparé deux exemples avec toutes les manips qu'il me faut.
Et oui par la suite et pratiquement tous les jours je devrai mettre à jour la base de données
Merci beaucoup de votre aide
@+
Bonjour,
avec toutes les manips qu'il me faut.
C'est VBA qui va les faire, sans passer par une feuille Traitement intermédiaire...
Le nombre d'éléments de la colonne A est souvent supérieur 10 : tu tronques systématiquement à 10 éléments ?
NB- je vais laisser Bernard qui s'est lancé, opérer, mais je voudrais vérifier une ou 2 commandes...
Cordialement.
Bonjour,
Merci, oui seules les 10 premières valeurs sont utiles. Une petite précision, les valeurs que je récupères dans la feuille intermédiaire n'ont pas toujours le même format, des fois il y a un espace entre chaque valeur et des fois 2 (je ne sais pas pourquoi
Encore merci
et à bientôt
Cordialement
J'ai vu ça ! Bé on les réduira à 1 !
Bonjour MFerrand,
Je cherche de mon côté,
Je consulte le forum, pour partager, mais surtout pour apprendre.
Je crois que mes connaissances ne vont pas être suffisantes pour arriver à une solution simple et performantes.
J'attends ta solution, si tu as le temps de te pencher sur le sujet.
@+
Salut Bernard,
Ma solution est prête, mais pas le feu !
Pour ma part je voulais en profiter pour vérifier une possibilité ou non dans l'affectation d'un tableau à une plage, mais la disposition finale ne me permettait pas de tester (sauf à reconstruire un test à part). Il s'agissait de savoir si un tableau dont on transformait une série d'éléments en tableaux pouvait être affecté à une plage et comment... (je le note pour une autre occasion).
A+
Bonjour,
Une petite contribution :
Je ne savais pas trop par quel bout prendre le problème.
Je ne suis pas satisfait mais chez moi ça marche.
J'aurais voulu pouvoir sélectionner les 5000 classeurs à traiter (je pense que c'est indispensable) mais là, je ne sais pas faire.
Je suis sûr qu'une autre approche va suivre et qu'elle sera beaucoup plus professionnelle et efficace.
Pour ma part j'ai pris du plaisir à chercher, mais j'attends avec impatience la solution de MFerrand....
@+.
Salut Bernard,
Je ne savais pas trop par quel bout prendre le problème.
J'ai du mal à te suivre, tu étais bien parti sur tes demandes initiales ! Et tu enchaînes en reprenant à l'envers !
Je reviens sur le raisonnement de base après manger... Pour le reste, j'ai naturellement quelques critiques pour améliorer ton code et le rendre plus efficace :
- éviter l'objet Window lorsqu'il ne s'agit pas d'affichage, mieux vaut travailler sur les objets "durs" : Workbooks, Worksheets...
- prendre conscience une bonne fois que tu es "Dieu" quand tu codes !!
Tu n'as pas à bouger, tu dis ! et VBA fait ! (donc pas de Select et encore moins des balades de Select alternés)... Le pouvoir de la parole ! Tu verras que ça marche, et plus vite !
- le dernier point est l'utilisation de tableau... il ne faut pas craindre de ne pas arriver au bout avec, sinon on ne se rode jamais ! C'est particulièrement efficace en VBA...
A+ (je commence à avoir faim !)
Heeuuuuu vous m'excuserez mais je n'ai pas tout compris, en fait rien du tout
Re, (pause un peu plus longue que prévue).
Comme tu l'avais demandé, notre ami a fourni des modèles de classeurs source et un classeur cible apprêté pour la réception, impeccable (entre parenthèses, il manquait juste une colonne sur la zone échange, je l'ai rétablie sur le classeur que j'ai utilisé, il faudra y penser sur un autre). Les classeurs source étant potentiellement nombreux et le classeur cible unique, c'est logiquement à partir de ce dernier que l'on va commander l'opération.
Pour les classeurs source, les éléments à prélever sont sur une feuille et une plage prédéfinie (13 lignes et 6 colonnes), toujours la même, et les noms comportent une partie générique commune et une partie variable correspondant à une date mise en forme. Il faudra les ouvrir tour à tour pour opérer les prélèvements et les affecter à la cible. La structure chronologique des noms permet de penser pouvoir opérer des traitements par lots, d'une date de début à une date de fin, opération pouvant être réitérée pour des lots de dates successifs.
On peut donc prévoir une boucle externe de traitement sur les dates retenues pour un lot donné...
L'affectation des données d'un classeur source occupe une seule ligne sur la cible : on devra donc déterminer la ligne de départ de traitement d'un lot et l'incrémenter à chaque classeur traite. Les données à affecter occupent 197 colonnes : 2 colonnes d'identification (numéro d'ordre et date), 13 fois 10 colonnes, chaque lot de 10 correspondant à une ligne de la colonne A de la source (éclatement des 10 premières valeurs qui y figurent, une dernière série est constituée par 5 fois 13 colonnes, chaque lot de 13 correspondant à l'une des 5 autres colonnes de la source (B à F), transposition de la source colonne par colonne.
Si l'on constitue un tableau unidimensionnel de 197 éléments, il sera aisé de l'affecter à la ligne cible (évitant ainsi une succession de copier-coller au profit d'une méthode plus rapide...)
Les deux premières valeurs ne présentent pas de difficulté : la date on l'aura pour rechercher et ouvrir le classeur à traiter, et le numéro d'ordre, dans la mesure où on commence ligne 3, sera le numéro de ligne d'affectation -2.
Il y aura ensuite 13 séries de 10 valeurs à récupérer sur chacune des 13 lignes de la source en col. A : une boucle pour parcourir ces 13 lignes, récupération de la chaîne en A (en éliminant les espaces d'extrémités et en réduisant les double-espaces de séparation à un) sous forme de tableau, une autre boucle imbriquée pour prélever les 10 premières valeurs de chaque ligne (recueillies dans un tableau temporaire, la combinaison des variables de ces deux boucles permet de mettre chaque élément à sa bonne position dans le tableau final...
Le dernier volet, 5 séries de 13 valeurs éventuelles (beaucoup de cellules sont vides), sera traité de même avec 2 boucles imbriquées, l'une pour parcourir les 5 colonnes et l'autres les 13 lignes de chaque colonne, là où l'on trouve une valeur, on la prélève pour l'affecter à sa position dans le tableau final.
Besoins en variables : une variable tableau de 197 éléments : T(196), variable de type Variant pour accueillir notre tableau temporaire de traitement col. A : tmp, variable non typée (Variant, accueillant valeur type Date ou Long) : d (boucle sur les classeurs à traiter, variable Integer : n (incrémentation de la ligne cible), deux autres variables Integer : i et j (compteurs pour les deux boucles évoquées).
Il convient d'ajouter deux variables String, pour le chemin des fichier à fixer au départ, et le nom du fichier à traiter : ch et fich.
Et dans la mesure où l'on peut mettre sous bloc With... End With la feuille source traitée, une variable Worksheet pour la feuille cible (ws) permet de simplifier l'écriture de l'opération.
Dernier élément à prévoir, si l'on fait une boucle sur des dates de façon à constituer des noms potentiels de fichiers à traiter, on peut supposer que certaines dates ne comporteront pas de fichier... donc, une gestion d'erreur sur l'ouverture du fichier est nécessaire de façon que l'on puisse poursuivre en cas de fichier manquant sur une date...
Cette procédure devant assurer le traitement d'un lot, il est loisible de la lancer avec en arguments les dates de début et de fin du lot à traiter.
La feuille Traitement, qui illustrait le traitement des données, n'ayant pas d'utilité peut permettre d'accueillir dans deux cellules ces dates de début et fin que l'on programme (ou l'une d'elle si l'on n'a qu'un classeur à traiter). Un bouton activera une procédure de lancement, récupérant ces dates pour lancer la proc. de traitement.
Tout étant défini, on peut passer à la réalisation...
Surfnature, j'espère que tu vas comprendre le raisonnement qui précède, parce qu'il résulte de tes propres indications de traitement !
Sub MajBDD(d1, d2)
Dim d, T(196), tmp, i%, j%, n%, ws As Worksheet, ch$, fich$
Set ws = ThisWorkbook.Worksheets("BDD")
n = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
If n < 3 Then n = 2
ch = "E:\Documents\"
Application.ScreenUpdating = False
For d = d1 To d2
fich = "JOURNAL_xxx_" & Format(d, "dd-mm-yyyy") & ".xlsx"
On Error GoTo noClass
With Workbooks.Open(ch & fich).Worksheets(5)
On Error GoTo 0
n = n + 1: T(0) = n - 2: T(1) = d
With .Range("A3:A15")
For i = 1 To 13
tmp = Split(Replace(Trim(.Cells(i, 1)), " ", " "))
For j = 0 To 9
T((i - 1) * 10 + 2 + j) = tmp(j)
Next j
Next i
For i = 1 To 5
tmp = .Offset(, i).Value
For j = 1 To 13
If tmp(j, 1) <> "" Then T((i - 1) * 13 + 131 + j) = tmp(j, 1)
Next j
Next i
End With
End With
ws.Range("A" & n).Resize(, 197) = T
Erase T
ActiveWorkbook.Close False
noClass:
Next d
ws.Activate
End SubLe chemin, surligné, est naturellement à redéfinir.
Proc. de lancement :
Sub Test()
Dim d1, d2
With ActiveSheet
d1 = .Range("C3")
If d1 <> "" Then
d2 = IIf(.Range("C4") <> "", .Range("C4"), d1)
Else
Exit Sub
End If
End With
MajBDD d1, d2
End SubCordialement.
Génial
Merci beaucoup, je viens de le faire sur un mois et ça fonctionne vraiment bien par contre il faut que je donne l'autorisation d'accès à chacun des fichiers, mais bon ça va quand même plus vite que de faire des copier/coller en manuel
J'ai essayé de comprendre mais j'ai quand même du mal.
J'ai voulu voir comment ça fonctionnait avec la première série de pièces les cellules A3:A15, (j'aurai certainement à refaire ce genre de tableau prochainement) je les ai déplacé au milieu en D et j'ai supprimer des lignes de valeurs sur 2 classeurs et j'ai tout laissé sur les 2 autres, j'ai "bidouillé" quelque peu la macro, et la c'est la "cata" soit ça me dit que l'indice ne correspond pas, soit que le second fichier n'existe pas... j'ai effacé, re-téléchargé ton fichier, re-modifié... ben non je n'y arrive pas
En tous cas Merci beaucoup
Bonjour,
par contre il faut que je donne l'autorisation d'accès à chacun des fichiers
Que veux-tu dire par là ?
A priori cela n'a rien à voir avec la procédure mais relève de tes paramètres de sécurité... !
j'ai "bidouillé" quelque peu la macro, et la c'est la "cata"
Tu as décrit une configuration très précise de tes fichiers source : 5e feuille, plage A3:F15, au moins 10 éléments séparables en col. A. La macro est bâtie sur ces critères exclusifs qu'elle doit retrouver rigoureusement dans tous les fichiers. Qu'un seul détail parmi ceux énumérés ci-dessus ne soit pas conforme et le processus bloquera !
Je ne te conseille pas de modifier quoi que ce soit sans avoir au préalable assimilé ce qui se passe à chaque ligne de la macro...
Cordialement.
Bonjour MFerrand,
Merci pour la solution et les explications, il me reste du chemin à faire, je vais tenter d'assimiler....
Bonne journée.
Salut Bernard !
Pas de fausse modestie... je n'ai pas de doute que si tu hésites encore à te lancer dans la manipulation de boucles imbriquées et de tableaux, tu ne soies à même de suivre le cheminement dans le code...
Après, il y a les expressions comme : T((i - 1) * 10 + 2 + j) = ; soit le moyen de faire correspondre le positionnement dans le tableau avec la position de l'élément à y affecter déterminée par i et j...
La bonne façon d'aborder cela est de te dire que "pour boucler la boucle"
[J'avoue que cela peut relever parfois du casse-tête, et qu'il m'est arrivé de passer infiniment plus de temps à un jeu de ce genre qu'à faire tout le reste... !
Bonne journée.
Bonjour,
J'essaie de suivre et comprendre mais ça reste encore très abstrait pour moi, ça m’intéresse vraiment mais je crois que pour comprendre au moins une partie de celle que tu m'as créé, il faudrait que je me préoccupe plus du début de celle-ci et pas de l'ensemble...
Sans vouloir abuser, serait-il possible d'avoir un exemple pour la première colonne toujours sur 13 lignes mais avec de temps en temps des lignes vides, la colonne pourrait être B,C ou une autre mais pas A, pour mes essaie je me suis mis en D23:D35 mais vraiment au hasard... je pense que cela me permettrait d'appréhender un peu mieux les opérations (pas sûr mais j'y crois)
Si ce n'est pas possible, pas de souci bien sûr mais je reviendrai certainement vers vous assez rapidement, j'y ai passé une bonne partie de la nuit et n'ai pas avancé de beaucoup en cherchant dans les exercices ou ailleurs sur le net
Bonne journée
Il y a une question préalable et une seule !
Est-ce que ta description du début correspond à la réalité ou non ?
J'en ai rappelé les 3 éléments, tout de même faciles à cerner.
Si cela correspond, la macro fonctionne !
Si cela ne correspond pas, elle ne fonctionne pas !
Et dans ce cas, il n'y a rien à chercher : on recommence la description de la configuration à traiter, on s'assure qu'elle est exacte, et à partir de là on reconstruit une macro sur cette nouvelle configuration.
Il faut bien se rendre compte qu'une telle macro de traitement de données est une mécanique de précision, adaptées aux données selon l'analyse préalable qui en a été faite. Le problème est toujours dans l'analyse
Oui oui sans problème et elle fonctionne parfaitement, mes 4897 fichiers pourront être traités demain en seulement quelques minutes grâce à toi
Le seul hic pour moi est que je ne comprends pas grand chose et que si je dois refaire (ce qui arrivera forcément) ce genre de macro à l'heure actuelle j'en serait totalement incapable, par exemple quand je regarde le code je bute déjà à la 3ème ligne pour n<3
Je vais chercher plus longuement, on verra bien.
En tout cas un grand grand merci pour tout cela et passez de très bonnes fêtes de fin d'année et mes meilleurs voeux pour 2017
Amicalement
pascal