Oui, c'est une des façons de faire en vba (ici le contenu entier sera copié : formule, mise en forme), un autre exemple avec du vba (copie uniquement la valeur) :
VB:
Sub test()
Dim tab1()
tab1 = Workbooks("fichier source.xlsm").Worksheets("Feuil1").Range("A1:D20").Value
ActiveSheet.Range("A1:D20") = tab1
End Sub
A noter qu'il vaut mieux cerner la taille de la plage à copier, car une grande dimension risque de prendre du temps à être traité.
Bonjour à tous, le fil,
Voici un exemple de code pour pomper les données dans un classeur ouvert ou fermé
Il faudra modifié en conséquences qlq lignes de code ou j'ai commenté.
Bruno
VB:
Sub ouverture()
Application.ScreenUpdating = False
For Each Wb In Workbooks
If Wb.Name = "TonClasseur.xls" Then
Workbooks(Wb.Name).Activate: k = 1
End If
Next
If k = "" Then
chemfich = ThisWorkbook.Path & "\TonClasseur.xls"
On Error Resume Next
Workbooks.Open chemfich
If Err <> 0 Then MsgBox "TonClasseur.xls non trouvé": Exit Sub
End If
ActiveWindow.WindowState = xlMinimized
ThisWorkbook.Activate
ActiveWindow.WindowState = xlMaximized
With Workbooks("TonClasseur.xls").Sheets("DONNEES")
'modifier Feuil1 c'est le codename (voir en propriété)
Feuil1.[A1:K10000].Clear
'les colonnes restent à définir ici c'est décalé
Feuil1.[A1:A6000].Value = .[C1:C6000].Value
Feuil1.[B1:B6000].Value = .[D1:D6000].Value
Feuil1.[C1:C6000].Value = .[AX1:AX6000].Value
Feuil1.[D1:D6000].Value = .[AP1:AP6000].Value
Feuil1.[E1:E6000].Value = .[AU1:AU6000].Value
Feuil1.[F1:F6000].Value = .[BF1:BF6000].Value
Feuil1.[G1:G6000].Value = .[BG1:BG6000].Value
Feuil1.[H1:H6000].Value = .[BQ1:BQ6000].Value
Feuil1.[I1:I6000].Value = .[CF1:CF6000].Value
Feuil1.[J1:J6000].Value = .[CJ1:CJ6000].Value
Feuil1.[K1:K6000].Value = .[CU1:CU6000].Value
End With
if k="" then Workbooks("TonClasseur.xls").Close False
End Sub
Le code que tu as proposé est l'un des meilleur (car rapide) pour cet usage, celui que j'ai indiqué est plus utilisé lorsqu'il y a manipulation des données (calculs, tris, conditions, déplacements...).
Pour cerner la plage, il existe aussi plusieurs façons, mais pour choisir la plus adaptée, il faut connaître la forme des données (quelle est la colonne la plus grande et la ligne la plus grande par exemple), il existe un code de base qui permet de connaître la dernière cellule de la plage de travail (plage calculée automatiquement par Excel):
VB:
Cells.SpecialCells(xlCellTypeLastCell)
Ce qui donnerait dans ton code:
VB:
Fichier = "C:\Users\Benoist\Desktop\Planning Groupe 1.xlsm"
Workbooks(Fichier).Sheets("DONNÉES").range(cells(1,1),Cells.SpecialCells(xlCellTypeLastCell)).Copy ActiveWorkbook.sheets("DONNÉES").Range("A1").Paste
Merci pour vos réponses, j'ai adapté la méthode de @youky(BJ) et pour ce qui est des dernières lignes , pour éviter les énormes plages de cellules, je les récupères en premier via la méthode pour après m'en servir pour les autres plages.