Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 [Résolu] Copie de plage de cellules d'un fichier à un autre / Utilisation de Range et Cells

miloo

XLDnaute Junior
Bonjour à tous.

Je souhaiterais copier une plage de cellules d'un fichier vers un autre. Les 2 fichiers sont identiques dans leur structure.
J'ai appliqué le code de "BENNASR" dans ce post https://www.developpez.net/forums/d...xcel/macro-copier-coller-cellules-d-classeur/
Je l'ai adapté à mes fichiers, le voici:
VB:
Sub CopiePlanning()

Dim wkbSource As Workbook, wkbCible As Workbook
Dim chemin As String, fichier As String
Dim PlageCopie As Range

Set wkbSource = ThisWorkbook
chemin = ThisWorkbook.Path
fichier = "Planning CDS 2021-4.0mCible.xlsm"
Workbooks.Open chemin & "\" & fichier
Set wkbCible = ActiveWorkbook

wkbCible.Sheets("Janvier").Range("C6:C95").Value = wkbSource.Sheets("Janvier").Range("C6:C95").Value

Cela fonctionne de cette manière, mais je dois maintenant complexifier le code et remplacer C6:C95 par des variables.

J'ai donc fait ce code intermédiaire avant de passer aux variables: (remplacement de Range("C6:C95") par Range(Cells(...),Cells(...)) pour me permettre de définir des variables à la place de 6 ,3 et 95, 3 par la suite)

Code:
Sub CopiePlanning()

Dim wkbSource As Workbook, wkbCible As Workbook
Dim chemin As String, fichier As String
Dim PlageCopie As Range

Set wkbSource = ThisWorkbook
chemin = ThisWorkbook.Path
fichier = "Planning CDS 2021-4.0mCible.xlsm"
Workbooks.Open chemin & "\" & fichier
Set wkbCible = ActiveWorkbook

wkbCible.Sheets("Janvier").Range(Cells(6, 3), Cells(95, 3)).Value = wkbSource.Sheets("Janvier").Range(Cells(6, 3), Cells(95, 3)).Value

Mais Excel me retourne une erreur '1004' lors de l'exécution.
Y a-t-il une erreur évidente que je n'arrive pas à saisir? Sur l'utilisation de Range et Cells (que j'ai pourtant déjà utilisés dans ce genre de cas il me semble, mais peut-être pas avec des .Value...)

NB. je dois ensuite encore complexifier le code avec une boucle sur la colonne (actuellement '3'), puis une boucle sur les onglet.
Je pense savoir comment faire, mais j'aurai peut-être des questions à suivre si ce premier problème est résolu.

Merci d'avance à ceux qui voudront bien se pencher sur le sujet!

Miloo
 
Solution
Bonjour Miloo, Staple1600 , le forum

L'utilisation de range(cells(...) aboutit effectivement à quelques inconvenients.
Il faut lister précisémment les sources, idéalement en les définissant comme dans l'exemple ci-joint sur une plage "B6:C9" à copier.

Exemple

Set rng1 = wkbSource.Sheets("Janvier").Range(wkbSource.Sheets("Janvier").Cells(6, 2), wkbSource.Sheets("Janvier").Cells(9, 3))
Set rng2 = wkbCible.Sheets("Janvier").Range(wkbCible.Sheets("Janvier").Cells(6, 2), wkbCible.Sheets("Janvier").Cells(9, 3))

rng2.Value = rng1.Value

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Miloo

=>Miloo
Et en testant ceci, l'erreur est toujours présente
VB:
Sub CopiePlanning()
Dim wkS As Workbook, wkC As Workbook, chemin$, fichier$
Set wkS = ThisWorkbook
chemin = ThisWorkbook.Path
fichier = "Planning CDS 2021-4.0mCible.xlsm"
Workbooks.Open chemin & "\" & fichier
Set wkC = ActiveWorkbook
wkC.Sheets("Janvier").Range("$C$6:$C$95").Value = wkS.Sheets("Janvier").Range("$C$6:$C$95").Value
End Sub

EDITION: Bonjour zebanx
 
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Miloo, Staple1600 , le forum

L'utilisation de range(cells(...) aboutit effectivement à quelques inconvenients.
Il faut lister précisémment les sources, idéalement en les définissant comme dans l'exemple ci-joint sur une plage "B6:C9" à copier.

Exemple

Set rng1 = wkbSource.Sheets("Janvier").Range(wkbSource.Sheets("Janvier").Cells(6, 2), wkbSource.Sheets("Janvier").Cells(9, 3))
Set rng2 = wkbCible.Sheets("Janvier").Range(wkbCible.Sheets("Janvier").Cells(6, 2), wkbCible.Sheets("Janvier").Cells(9, 3))

rng2.Value = rng1.Value
 

miloo

XLDnaute Junior
Bonjour Staple1600, bonjour zebanx.
Merci pour vos réponses.
Je n'ai pas actuellement accès à mon PC pour tester vos propositipons, demain au plus tôt, je vous en ferai un retour.
Maintenant que je vois la solution de zebanx, ma (petite) mémoire croit me rappeler que j'ai déjà été confronté à ce problème il y a longtemps et que je l'avais solutionné de cette manière.
Pourtant, dans le reste de mon code sur mon fichier Source (car ile fichier source possède aussi tout un tas de macros), cela marche sans faire référence au chemin complet.
Est-ce dû au fait que ces macros n'interviennent que dans ce fichier, mais que dès que l'on fait intervenir plusieurs fichiers, il faut répéter le chemin dans Cells, même s'il est déjà précisé avant le Range?
Merci en tout cas et je vous fait le retour dès que possible, pour, espérons-le mettre ce fil en Résolu!
 

miloo

XLDnaute Junior
Bonjour Staple1600, bonjour zebanx.
J'ai utilisé la méthode de zebanx, et c'est impeccable, ça marche! Merci beaucoup à vous.
Zebanx, sais-tu répondre à ma question: comment se fait-il que que dans les dans les Sub de mes autres modules, les Cells fonctionnent sans faire référence au chemin complet? C'est uniquement quand il y a des références à plusieurs fichiers? Quel est alors le "périmètre"? La Sub? le module?
Merci
 

zebanx

XLDnaute Accro
Bonjour Miloo, staple1600, le forum

Ci-joint une explication en anglais que j'avais chargé (mais qui hélas n'existe plus).
Reste l'explication et la pratique..
@+

---


One final point which often catches people out when passing range objects as arguments to the Range property is that if you need to specify a worksheet object (which is good practice), you need to specify it for all of the Range/Cells properties you use.

So this is wrong:
Sheets("Sheet1").Range(Cells(1, "A"), Cells(10, "B"))

because the two Cells properties do not have a worksheet specified.

Although this may work some of the time, it will be dependent on where the code is (in a worksheet code module, unlike other modules, any use of Range or Cells without a worksheet object reference refers to the sheet containing the code and not the active sheet) and which worksheet is active at the time so sometimes it will fail – this kind of bug can be very hard to track down.

The correct syntax for the above is:
Sheets("Sheet1").Range(Sheets("Sheet1").Cells(1, "A"), Sheets("Sheet1").Cells(10, "B"))

or you can use a With … End With block to save a little typing:
With Sheets("Sheet1")
.Range(.Cells(1, "A"), .Cells(10, "B"))
End With
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…