Erreur '1004' La méthode a échoué - Copier et coller plusieurs plages
Hello,
J'ai créé le code ci-dessous pour aller copier 2 plages de données et les coller dans un autre onglet.
Cela fonctionnait bien jusqu'à présent et là, je ne sais pas il me bloque à :
Range("A12:M40000,S12:W40000").Select
J'ai mis 40000 pour être sûre qu'il me copie toutes les données de cette plage car le tableau n'est pas toujours constitué du même nombre de lignes.
Voici le message suivant qui s'affiche lorsqu'il bug sur Range("A12...etc. Saurez-vous me dire ce qu'il ne va pas dans ma macro ?
Merci par avance :-)
Sub AjouterFeuilleDevantUneAutreFeuille()
'si la feuille "Pour_Plan" existe = la supprimer
Dim ws As Worksheet
nom = "Pour_PLAN"
For Each ws In Worksheets
If ws.Name = nom Then
Application.DisplayAlerts = False
ws.Delete
Exit For
End If
Next ws
'Ajouter une feuille avec le nom de la Feuille "Pour_PAN"
Sheets.Add(Before:=Worksheets("BASE")).Name = "Pour_PLAN" 'ajoute une Feuille devant la Feuille "BASE"
'Copie les données de l'onglet BASE pour les copier dans l'onglet "Pour_PLAN"
Sheets("BASE").Select
Range("A12:M40000,S12:W40000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Pour_PLAN").Select
Range("A4").Select 'Colle les données en A4 de la feuille "Pour_PLAN"
ActiveSheet.Paste
Bonjour,
Un exemple de résolution à adapter.
Tes données devraient être sous forme de tableau structuré (dynamique).
Cdlt.
Sub AjouterFeuilleDevantUneAutreFeuille()
Dim wb As Workbook
Dim wsData As Worksheet, newWS As Worksheet
Dim rngData As Range
Const NM As String = "Pour_PLAN"
Set wb = ThisWorkbook
Set wsData = wb.Worksheets("BASE")
Application.DisplayAlerts = False
On Error Resume Next
wb.Worksheets(NM).Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set newWS = wb.Worksheets.Add(Before:=wsData)
newWS.Name = NM
With wsData
Set rngData = Application.Union(.Range("A12:M22"), .Range("S12:W22"))
End With
rngData.Copy Destination:=newWS.Cells(4, 1)
End Sub
.
Bonjour ! Merci !
Votre correction fonctionne à merveille.
Le codage a changé donc j'y comprends plus grand chose.
C'était quoi qui posait problème dans la mienne ? Je déclarais, écrivais mal quelque chose ? (c'est pour savoir, j'ai repris la vôtre qui fonctionne très bien).
Belle journée !
Re,
Un peu d'explications sur la procédure.
Cdlt.
Sub AjouterFeuilleDevantUneAutreFeuille()
'Déclaration des variables
Dim wb As Workbook
Dim wsData As Worksheet, newWS As Worksheet
Dim rngData As Range
Const NM As String = "Pour_PLAN"
'Initialisation des variables
Set wb = ThisWorkbook
Set wsData = wb.Worksheets("BASE")
Application.DisplayAlerts = False
'Suppression feuille NM = "Pour_Plan (déclaré en constante)
On Error Resume Next
wb.Worksheets(NM).Delete
On Error GoTo 0
Application.DisplayAlerts = True
'Ajout nouvelle feuille nommée NM = Pour_PLAN
Set newWS = wb.Worksheets.Add(Before:=wsData)
newWS.Name = NM 'Feuille Pour_PLAN
'Initialisation plage à copier, en utilisant la méthode Union (défaut de ton précédent code)
'Pour une aide, Double-clic sur le terme Union et F1
With wsData 'Feuille BASE
Set rngData = Application.Union(.Range("A12:M22"), .Range("S12:W22"))
End With
'Copie de rngData dans NM (newWS = Pout_PLAN) et cellule A4
rngData.Copy Destination:=newWS.Cells(4, 1)
End Sub
Bonjour …
Quel est l’intérêt de rajouter une feuille ?
Cela implique lignes codées supplémentaires en plus donc des risques en plus à traiter.
Si la feuille d’arrivée est déjà créée et même formatée, avec un bouton dans la feuille contenant les plages* : cela le fera
Private Sub U_Click()
Feuil2.Rows("3:10000").Delete
[ç1].Copy Feuil2.Cells(2, 1)
[ç2].Copy Feuil2.Cells(2, [ç1].Columns.Count + 1)
End Sub
Où ç1 et ç2 les noms des 2 plages et Feuil2 le nom de la feuille visée.
* Cette macro est à écrire dans la fenêtre des codes de l’onglet du bouton. Elle ne tient pas compte de la durée de traitement qui peut croître avec un nombre phénoménal de données. Dans ce cas il sera envisageable d’utiliser des tableaux VBA (pas appelés structurés ceux-ci étant pourtant très performants donc à utiliser).
Dans le fichier joint, avec les évènements Activate et Deactivate, on se dispense du bouton et on se retrouve avec une réduction des données copiées qui pourrait être, notamment avec un excès de formules matricielles par exemple.
Merci à vous 2 ! Il va falloir que je prenne un peu plus de temps pour regarder vos réponses et étudier :)
Merci belle journée à vous,