Microsoft 365 boucle macro pour importer des données

Arnaud Legay

XLDnaute Nouveau
Bonjour la communauté,
J'ai besoin de votre aide.
Je suis totalement novice en vba, donc je me documente, je teste, je "bricole", mais ça prends forme....

Je souhaite importer des données (colonne A à D, à partir de la ligne 8) de plusieurs fichiers excel situés dans un dossier.
Ces données sont systématiquement (si l'onglet existe) dans un onglet appelé "BOISSONS".

J'ai réussi à lancer ma macro pour :
- ouvrir une boite de dialogue pour sélectionner mes fichiers,
- que ces fichiers s'ouvrent tous sur mon onglet "BOISSONS",
- que les lignes souhaitées soient copiées,
- que ces lignes copiées soient collées (collage spéciales "valeurs") dans mon nouveau document,
- et qu'une partie de mise en forme se fasse.

Mon soucis est que pour le moment, il y a bien une boucle qui se fait si je sélectionne plus que 1 fichier, mais à chaque fois, le collage des données se fait sur le premier collage, donc écrase le premier, et ainsi de suite, alors que j'aimerai que tout se mette à la suite....

Mon explication est-elle claire ?
Pouvez vous m'aider ?

Un grand merci d'avance.

Si dessous mes lignes de code :

Sub Import_quantités_boissons_semaine()

'Affiche la boîte de dialogue "Ouvrir"
Dim l As Long
Dim ClasseurDoc As Variant
l = 0
ClasseurDoc = Application.GetOpenFilename(MultiSelect:=True)
If IsArray(ClasseurDoc) Then
For l = LBound(ClasseurDoc) To UBound(ClasseurDoc)
Workbooks.Open ClasseurDoc(l)

'Sélectionner l'onglet "BOISSON"
ActiveWorkbook.Worksheets("BOISSONS").Activate
On Error Resume Next

'Dans l'onglet "BOISSONS" sélectionner A8/D8 à A50/D50
Range("A8:D50").Select

'Copier les donneés sélectionnées
Selection.Copy

'Retourner dans le fichier de destination
Windows("Test boissons.xlsm").Activate

'Sélectionner la première ligne vide
With Sheets("Feuil")
DLg = .Range("A65536").End(xlUp).Row
If Not .Cells(DLg, 1) = "" Then DLg = DLg + 1
End With

'Coller les données (contenu uniquement)
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

'Supprimer les lignes vides
With Sheets("Feuil1")
For I = .Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
If .Cells(I, 1) = "" Then
Cells(I, 1).EntireRow.Delete
End If
Next I
End With

'Supprimer lignes contenant Glaces Cubes
For I = [A65000].End(xlUp).Row To 1 Step -1
If Not Cells(I, 1).Find("Glaces cubes (2,5kg)") Is Nothing Then Rows(I).Delete
Next I

'Supprimer lignes contenant Glaces Cubes
For I = [A65000].End(xlUp).Row To 1 Step -1
If Not Cells(I, 1).Find("TOTAL") Is Nothing Then Rows(I).Delete
Next I

'Continuer la boucle
Next l
Else
Workbooks.Open ClasseurDoc

End If

'Ajuster la colonne A au texte
Columns("A:A").EntireColumn.AutoFit

'Supprimer les colonnes B à C inutiles
Columns("B:C").Select
Selection.Delete Shift:=xlToLeft

'Supprimer les colonnes E à O inutiles
Columns("C:O").Select
Selection.Delete Shift:=xlToLeft

End Sub
 

xUpsilon

XLDnaute Accro
Bonjour,

De manière générale, il faut éviter les Activate et les Select (sauf certains cas bien spécifiques qui ne servent pas lorsqu'on apprend à faire des macros ;) )
Aussi, peux-tu mettre ton code entre </> pour que tout apparaisse mis en forme proprement stp ? :)

VB:
Comme ceci

Bien à toi,
 

Arnaud Legay

XLDnaute Nouveau
Bonjour,

De manière générale, il faut éviter les Activate et les Select (sauf certains cas bien spécifiques qui ne servent pas lorsqu'on apprend à faire des macros ;) )
Aussi, peux-tu mettre ton code entre </> pour que tout apparaisse mis en forme proprement stp ? :)

VB:
Comme ceci

Bien à toi,
Merci @xUpsilon pour ta réponse.
Je ne suis pas sûr de comprendre ta demande de forme de mon code.
Je le mets du coup en pièce jointe avec Notepad++
 

Pièces jointes

  • macro - forum.txt
    1.9 KB · Affichages: 2

xUpsilon

XLDnaute Accro
Dans la barre juste au dessus de là où tu écris ton message, tu as plein de mise en forme, en gras, en italique, souligné, etc ... A droite de cette barre il y a le symbole </> qui te sert à insérer un code "proprement" dans ton post.

Voir quelques corrections ci-joint. Teste et dis moi si ça va mieux.
Aussi, pour les parties de "Suppression de lignes", il faudrait probablement étendre ton With jusque là.

Bonne journée,
 

Pièces jointes

  • macro - forum.txt
    1.7 KB · Affichages: 2

Arnaud Legay

XLDnaute Nouveau
Dans la barre juste au dessus de là où tu écris ton message, tu as plein de mise en forme, en gras, en italique, souligné, etc ... A droite de cette barre il y a le symbole </> qui te sert à insérer un code "proprement" dans ton post.

Voir quelques corrections ci-joint. Teste et dis moi si ça va mieux.
Aussi, pour les parties de "Suppression de lignes", il faudrait probablement étendre ton With jusque là.

Bonne journée,
Merci pour ton aide.
Ca ne marche pas, au lancement, j'ai message "Propriété ou méthode non gérée par cet objet"...
 

Arnaud Legay

XLDnaute Nouveau
Mets ton fichier en PJ. Essayer d'aider sans avoir le fichier c'est comme chercher l'interrupteur dans le noir dans une pièce que tu ne connais pas : sauf si tu as de la chance, sinon tu peux essayer des heures sans trouver.

Bonne journée,
Désolé..... je comprends.
Voici mon fichier.
Merci pour ton aide et ta réactivité.
 

Pièces jointes

  • Test boissons.xlsm
    19.9 KB · Affichages: 4

xUpsilon

XLDnaute Accro
Regarde ci-joint, j'ai encore fait quelques modifs par rapport au With.
Je veux bien avoir un fichier "ClasseurDoc" exemple (sans données confidentielles) pour pouvoir comprendre là où ça bloque, parce qu'a priori je ne vois plus d'erreur.

Bonne journée,
 

Pièces jointes

  • Test boissons.xlsm
    21.2 KB · Affichages: 4

Arnaud Legay

XLDnaute Nouveau
Regarde ci-joint, j'ai encore fait quelques modifs par rapport au With.
Je veux bien avoir un fichier "ClasseurDoc" exemple (sans données confidentielles) pour pouvoir comprendre là où ça bloque, parce qu'a priori je ne vois plus d'erreur.

Bonne journée,
J'ai le même message qu'avant qui s'affiche... :-(
Ci joint un fichier exemple que j'ai vidé, je n'ai laissé que les valeurs qui nous intéressent.
A savoir que certains fichiers que j'ouvrirai n'auront pas l'onglet "BOISSONS", d'où ma ligne de code qui ignore si pas cet onglet....
 

Pièces jointes

  • fichier exemple.xlsm
    878.4 KB · Affichages: 2

xUpsilon

XLDnaute Accro
Re-bonjour,

Voir ci-joint.
Il y avait plusieurs erreurs, notamment en termes de sélection de la feuille depuis laquelle copier et vers laquelle coller.
J'ai donc pris la liberté de renommer certaines variables pour qu'elles soient plus parlantes.

Bonne journée,
 

Pièces jointes

  • Test boissons.xlsm
    25.5 KB · Affichages: 3

Arnaud Legay

XLDnaute Nouveau
Re-bonjour,

Voir ci-joint.
Il y avait plusieurs erreurs, notamment en termes de sélection de la feuille depuis laquelle copier et vers laquelle coller.
J'ai donc pris la liberté de renommer certaines variables pour qu'elles soient plus parlantes.

Bonne journée,
Merci pour ton temps et ton travail.
Ca ne fonctionne pas totalement.
Dès que je sélectionne tous mes fichier, si certains n'ont pas l'onglet "BOISSONS" ça bug, et ca écrase les autres données.
Je vais replancher un peu dessus et te tiens au courant.
Il faudrait que j'améliore aussi 2 ou 3 truc du genre refermer les fichiers après la copie....
 

Arnaud Legay

XLDnaute Nouveau
Un tout grand MERCI !!!
C'est trop bien, ça fonctionne très bien.

Est-ce que je peux abuser et te demander encore 2 améliorations ?

1- peut on demander à ce qu'à la fermeture des fichiers, je n'ai pas besoin de cliquer sur "Ne pas enregistrer" ou sur "Ne pas mettre à jour" ?

2- à la fin de la boucle, supprimer toute les lignes vides ou étant égales à 0 dans les 2 colonnes (A et B) ?

et là ça sera le top du top ;-)
 

xUpsilon

XLDnaute Accro
Bonjour,

1- peut on demander à ce qu'à la fermeture des fichiers, je n'ai pas besoin de cliquer sur "Ne pas enregistrer" ou sur "Ne pas mettre à jour" ?
Je pensais que désactiver le diplayalerts serait suffisant. Il faut que je me renseigne davantage.

2- à la fin de la boucle, supprimer toute les lignes vides ou étant égales à 0 dans les 2 colonnes (A et B) ?
En théorie, c'est déjà le cas avec ta macro, et ça fonctionne lorsqu'on exécute la macro en Pas-à-Pas, mais ça ne fonctionne pas quand on exécute la macro "normalement". Je te tiens au courant si j'avais à trouver une solution.

Autre chose : le fait de supprimer les colonnes de C à E fonctionne pour ramener les cellules en F, mais du coup F -> C, et si on réutilise la macro sur le même fichier, on va donc supprimer de C à E de nouveau, ce qui va supprimer les données qu'on avait importées à l'utilisation précédente. Est-ce vraiment ce que tu veux ?

Bonne journée,
 

Arnaud Legay

XLDnaute Nouveau
Bonjour,


Je pensais que désactiver le diplayalerts serait suffisant. Il faut que je me renseigne davantage.


En théorie, c'est déjà le cas avec ta macro, et ça fonctionne lorsqu'on exécute la macro en Pas-à-Pas, mais ça ne fonctionne pas quand on exécute la macro "normalement". Je te tiens au courant si j'avais à trouver une solution.

Autre chose : le fait de supprimer les colonnes de C à E fonctionne pour ramener les cellules en F, mais du coup F -> C, et si on réutilise la macro sur le même fichier, on va donc supprimer de C à E de nouveau, ce qui va supprimer les données qu'on avait importées à l'utilisation précédente. Est-ce vraiment ce que tu veux ?

Bonne journée,
Merci pour tes réponses et tes réflexions (et surtout ton temps).
Pour les colonnes, il ne faut rien toucher c'est parfait comme cela.
Ce que j'aimerai c'est supprimer les lignes ou il y a des 0.
 

Discussions similaires

Réponses
12
Affichages
318

Statistiques des forums

Discussions
313 225
Messages
2 096 347
Membres
106 583
dernier inscrit
yasinus