XL 2019 Problème de copie de plages non contiguës vers une autre feuille en VBA

  • Initiateur de la discussion Initiateur de la discussion flc13090
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

flc13090

XLDnaute Nouveau
Salut à toute la communauté,

Je rencontre une petite difficulté pour coller 2 plages non contiguës d'une feuille vers la première ligne vide d'une autre feuille de calculs dans le même classeur.

A l'aide d'un USF je saisie des données qui s'insèrent ligne après ligne dans ma feuille xlWshSource. RAS
Certaines lignes insérées sont susceptibles d'être collées dans une autre feuille de calculs.
Voici comment je procède via un module standard :
J'utilise la fonction Union pour mettre bout à bout mes 2 plages non contiguës
VB:
Set rngSource = Union(Range(xlWshSource.Cells(LastRowSource, 1), xlWshSource.Cells(LastRowSource, 4)), Range(xlWshSource.Cells(LastRowSource, 6), xlWshSource.Cells(LastRowSource, 7)))
Je désigne la plage de destination :
Code:
Set rngCible = xlWshCible.Range(xlWshCible.Cells(LastRowCible, 1), xlWshCible.Cells(LastRowCible, 6))
Pour coller mes données vers la feuille xlWshCible, j'utilise :
Code:
For Each c In rngCible
    c.Value = rngSource.Cells(i + 1)
    i = i + 1
Next c
Mon problème est que les valeurs provenant du 2ème range de ma fonction Union ne sont pas collées vers la feuille xlWshCible (voir img)
Si quelqu'un avait une idée, merci d'avance.

20250325_09.jpg
 
Solution
Salut,
Je vous remercie tous pour vos propositions respectives.
J'avais complètement squeezé la propriété Resize()
Quant aux tableaux dynamiques, je les manipule de manière basique. Je ne suis qu'un grand débutant.
@+
Je passe en mode Résolu, merci.
Bonsoir.
À mon avis vous auriez intérêt à préparer vos données sources et cibles dans des tableaux dynamiques et à les décharger en une fois à la fin.
Sinon au moins en ligne par ligne :
VB:
ReDim TSrc(1 To 1, 1 To 8)
xlWshSource(LastRowSource, 1).Resize(, 8).Value = TSrc
If LaLigneEstÀCopier Then
   ReDim TCbl(1 To 1, 1 To 6)
   For C = 1 To 4: TCbl(1, C) = TSrc(1, C): Next C
   TCbl(1, 5) = TSrc(1, 6): TCbl(1, 6) = TSrc(1, 7)
   xlWshCible.Cells(LastRowCible, 1).Resize(, 6).Value = TCbl
   End If
 
Bonsoir job75

Bon puisque j'ai testé ceci à partir du premier message, je poste
(ce n'est pas une solution, c'est juste pour illustrer ce qu'il se passe)
J'ai reproduis la syntaxe du 1er message
Code:
Sub Test_sur_Feuilles_vierges()
Dim rngSource As Range, rngCible As Range, LastRowSource&, LastRowCible&
LastRowSource = 5: LastRowCible = 7
Feuil1.Range("A5") = "1600": Feuil1.Range("A5:J5").DataSeries
Set rngSource = Union(Range(Feuil1.Cells(LastRowSource, 1), Feuil1.Cells(LastRowSource, 4)), Range(Feuil1.Cells(LastRowSource, 6), Feuil1.Cells(LastRowSource, 7)))
rngSource.Interior.Color = vbYellow
MsgBox rngSource.Address, vbOKOnly, "On continue le test ?"
Set rngCible = Feuil2.Cells(LastRowCible, 1)
rngSource.Copy
rngCible.PasteSpecial xlValues
Application.CutCopyMode = False
Feuil2.Activate
End Sub
EDITION: Bonsoir Dranreb
 
Bonjour tout le monde,
Merci d'avoir pris le temps de répondre.
Entre le moment où j'ai déposé ce post, le fuseau horaire et la lecture de vos réponses, j'avais trouvé entre temps une solution, pas forcément pro, je ne maitrise pas encore les tableaux dynamiques, mais elle fait le job.
VB:
With xlWshCible
    .Cells(LastRowCible, 1).Value = xlWshSource.Cells(LastRowSource, 1).Value
    .Cells(LastRowCible, 2).Value = xlWshSource.Cells(LastRowSource, 2).Value
    .Cells(LastRowCible, 3).Value = xlWshSource.Cells(LastRowSource, 3).Value
    .Cells(LastRowCible, 4).Value = xlWshSource.Cells(LastRowSource, 4).Value
    .Cells(LastRowCible, 5).Value = xlWshSource.Cells(LastRowSource, 6).Value
    .Cells(LastRowCible, 6).Value = xlWshSource.Cells(LastRowSource, 7).Value
End With
Merci à tous
 
Bonjour.
Écrivez le au moins comme ça plutôt, que ce soit deux fois plus rapide :
VB:
xlWshCible.Cells(LastRowCible, 1).Resize(, 4).Value = xlWshSource.Cells(LastRowSource, 1).Resize(, 4).Value
xlWshCible.Cells(LastRowCible, 5).Resize(, 2).Value = xlWshSource.Cells(LastRowSource, 6).Resize(, 2).Value
 
Bonjour

Comme j'ai testé dans VBE, je poste
(pour pas laisser perdre 😉)
Code:
Sub Test_II()
Dim ar As Variant, rngS As Range, rngC As Range, LastRowSource, LastRowCible&
LastRowSource = 5: LastRowCible = 7 'valeurs définies en dur,juste pour test

Set rngS = xlWshSource.Cells(LastRowSource, 1).Resize(, 10)
Set rngC = xlWshCible.Cells(LastRowCible, 1)
    With rngS
        ar = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 2, 3, 4, 6, 7))
    End With
rngC.Resize(, UBound(ar)) = ar
End Sub
 
Salut,
Je vous remercie tous pour vos propositions respectives.
J'avais complètement squeezé la propriété Resize()
Quant aux tableaux dynamiques, je les manipule de manière basique. Je ne suis qu'un grand débutant.
@+
Je passe en mode Résolu, merci.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
733
Réponses
3
Affichages
531
Retour