Macro concatenation
Bonjour,
Pour mon travail je dois réaliser un travail de concatenation et amateur de macros j'en utilise assez souvent. Le but est de réaliser une étude et pour cela je dois concatener plusieurs fichiers. j'ai alors trouvé une macro très bien écrit et qui correspond à mes attentes ! Le seul petit couac est que je ne comprends pas 3 lignes de cette macro qui sont les plus importantes afin de la personnaliser... C'est pour cela que je viens à vous (pour la première fois après toutes les infos utiles que j'ai pu récupérer sur ce forum !) afin de vous demander votre aide :
Je n'arrive pas à selectionner une plage de cellules sur les fichiers sources seulement cellule par cellule via le Offset(0,1) (0,2)(0,3).... mais je dispose de 3000 cellules sur les fichiers sources... je voudrais selctionner une palge de type ("B2:AD500") mais impossible je n'y arrive pas et pourtant j'y ai passé du temps et j'ai cherché partout.. Pouvez-vous m'aider afin de réaliser ce travail qui m'apporterai beaucoup Merci beaucoup
Je vous joins le fichier concatenation avec la macro à l'interieur (Test2 : macro --> bouton 1) et deux fichiers sources test !
voici la macro : http://www.gcexcel.com/vba-recuperer-les-donnees-de-plusieurs-fichiers/
Sub Creer_Recapitulatif()
Dim wbRecap As Workbook 'fichier recap
Dim wsRecap As Worksheet 'feuille où on écrit les données
Dim wbSource As Workbook 'fichier à ouvrir
Dim wsSource As Worksheet 'feuille où on cherche les données
Dim DernLign As Integer 'ligne où on écrit les données
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'on ouvre le fichier
Set wsSource = wbSource.Sheets("Concatenation") 'On copie les données de la feuille 1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(1, 0)
rgRecap = Time
With wsSource
rgRecap.Offset(0, 1) = .Range("B20")
End With
wbSource.Close 'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
Function Selectionner_Fichiers(sTitre As String) As Variant
Dim sFiltre As String, bMultiSelect As Boolean
sFiltre = "Fichiers XYZ (.xls)(.xlsm), *.xls*"
bMultiSelect = True 'Permet de choisir plusieurs fichiers à la fois
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Bonjour,
non testé, mais ceci devrait fonctionner
rgRecap.offset(0,1).resize(499,29) = .Range("B2:AD500")499 = nombre de lignes due la plage (2 à 500)
29 = nombre de colonnes de la plage (B à AD)
Bonjour h2so4,
Merci pour ton aide et du temps que tu m'accordes
Je viens de tester cela mais malheuresement cela ne fonctionne pas la macro ne ressort aucune donnée.. (à part l'heure du RgRecap = time)
Aurais-tu une autre idée en tête ou pourquoi cette astuce ne fonctionne pas ?
Merci
Stephane
re-bonjour,
j'ai oublié le .value
rgRecap.offset(0,1).resize(499,29).value = .Range("B2:AD500").valueRe,
Waouh merci beaucoup cela fonctionne à merveille !! Cela semble si simple pour toi...
Je n'ai pas tout à fait compris pourquoi un .Range("B2:AD500") ne marchait pas initialement... Afin que je ne fasse plus la même erreur pourrais tu m'expliquer brièvement ?
Merci beaucoup encore bonne journée
Stéphane
Bonjour,
je n'ai pas d'explication. je pensais que le .value était la propriété qui serait prise en compte par défaut? cela ne semble pas être le cas quand il y a une plage de plus d'une cellule.