XL 2010 Copie de plusieurs plages de cellules spécifiques dans le presse-papier

  • Initiateur de la discussion Initiateur de la discussion Renaud22
  • 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 !

Renaud22

XLDnaute Occasionnel
Bonjour à tous,

J'aurais besoin qu'on m'aide à concevoir un code VBA afin de copier simultanément dans le presse-papier trois plages de cellules spécifiques.

Dans le fichier ci-joint "Classeur_A.xlsm", j'ai une feuille de données quelconque qui contient des données dans les plages suivantes : P63 à P74, P79 à P90 et P94 à P105. J'aimerais que la macro copie les valeurs de chacune des plages dans le presse-papier afin qu'il soit copié dans le fichier "Classeur_B.xlsm". Veuillez noter que le fichier source et le fichier cible peuvent être nommés autrement.

Dans le fichier "Classeur_B.xlsm", j'ai affiché le tableau ORIGINAL sans les données copiées. Lorsque je sélectionne la cellule H63 et je colle les données présentes dans le presse-papier, je devrais obtenir le résultat apparaissant dans le tableau " AVEC LES VALEURS COPIÉES". La subtilité dans cette procédure est que les formules présentes dans les cellules "H75" et "H91" ne doivent pas être affectées. Dans cette exemple, le transfert de données s'applique à la colonne "H" mais pourrait s'appliquer à une autre colonne car, dans les faits, j'ai plus qu'un tableau.

Ceci n'est qu'un exemple qui me permettra d'adapter la macro à plusieurs situations. Dans la réalité, le fichier "Classeur_A.xlsm" contient plusieurs colonnes de données et le fichier "Classeur_B.xlsm" contient plusieurs tableaux. La macro devra fonctionner avec des fichiers indépendamment de leur nom.

Si vous désirez des précisions additionnelles, n'hésitez pas à me contacter.

En vous remerciant par avance pour votre précieuse aide.

Salutations,

Renaud22
 

Pièces jointes

Bonjour Renaud,
Un essai en PJ sans passer par le presse papier, avec :
VB:
Sub CopierColler()
Dim Fichier$, T1, T2, T3
Application.ScreenUpdating = False
Fichier = Application.GetOpenFilename( _
    FileFilter:="Fichiers Excel (*.xls*), *.xls*", _
    Title:="Choisissez un fichier Excel à ouvrir", _
    MultiSelect:=False)
If Fichier = "" Then Exit Sub
Workbooks.Open Fichier
T1 = [P63:P74]: T2 = [P79:P90]: T3 = [P94:P105]
ActiveWorkbook.Close SaveChanges:=False
[G63].Resize(12, 1).Value = T1
[G79].Resize(12, 1).Value = T2
[G94].Resize(12, 1).Value = T3
End Sub
 

Pièces jointes

Merci sylvanu pour votre réponse.

Cependant, il faut impérativement passer par le presse-papier car je dois copier des données d'un fichier ouvert ("Classeur_A.xlsm" : nom quelconque) contenant potentiellement plusieurs colonnes de données dans un autre fichier ouvert ("Classeur_B.xlsm" : nom quelconque) contenant potentiellement plusieurs tableaux.

Salutations,

Renaud22
 
Bonjour

copier coller des données d'un classeur A vers un classeur B, tous les deux ouverts, ne necessite pas le presse papier..

set classeurA=workbooks("ClasseurA.xlsm")
set ClasseurB=workbooks("ClasseurB.xlsm")

ClasseurA.sheets("Feuille1").range("A1")=classeurB.sheets("Feuill50").range("D18")
 
Bonjour à tous,
@Renaud22 ,
votre demande est à affiner : les zones cibles ne sont pas correspondantes à l'attendu de votre classeur B

Sinon, le code source ci-dessous devrait suffire ou faire une base :
VB:
Option Explicit
Sub CopyVal()
Dim F_Source As Worksheet
Dim Target As Range, Zone As Range, ShortName As String, In_Box
   
    Set F_Source = ThisWorkbook.Worksheets("Feuil1") ' <-- Classeur A
  
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "Sélection du Classeur Cible"
        .InitialFileName = ThisWorkbook.Path & "\"
        .Filters.Clear: .Filters.Add "Classeur Excel", "*.xls*"
        If .Show Then
            In_Box = InputBox("Indiquez la Cellule Cible" & vbLf & "du classeur à ouvrir", .SelectedItems(1), "H63")
            If In_Box <> "" Then
                ShortName = Mid(.SelectedItems(1), InStrRev(.SelectedItems(1), "\") + 1)
                On Error Resume Next
                    If Workbooks(ShortName) Is Nothing Then Workbooks.Open .SelectedItems(1)
                On Error GoTo 0
                Set Target = Workbooks(ShortName).Worksheets("Feuil1").Range(In_Box) ' <-- Classeur B
                For Each Zone In Union(F_Source.[P63:P74], F_Source.[P79:P90], F_Source.[P94:P105]).Areas
                    Target.Resize(Zone.Rows.Count).Select ' pour vérifier ce qui est ciblé, peut être enlevé
                    Target.Resize(Zone.Rows.Count).Value = Zone.Value
                    Set Target = Target.Offset(Zone.Rows.Count + 4)
                Next
            End If
        End If
    End With
   
End Sub

Il est à noter que ce code est une variante de celui de @sylvanu
 
Dernière édition:
Merci pour vos réponses. Cependant, celles-ci me permet pas de faire ce que je désire. La solution la plus facile, que je suis en mesure de faire, avec 3 macros, mais pas la plus conviviale sera de :
- faire une macro (1) qui sélectionne la plage P63 à P74 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H63 et je colle le contenu du presse-papier.
- faire une macro (2) qui sélectionne la plage P79 à P90 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H79 et je colle le contenu du presse-papier.
- faire une macro (3) qui sélectionne la plage P94 à P105 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H94 et je colle le contenu du presse-papier.
Au lieu d'avoir une seule procédure, j'en aurai trois.
Comme je l'ai précisé les cellules cibles (H63, H79 et H94) peuvent être différentes car ceci est un exemple. Cela pourrait être (L63, L79 et L94 ou M63, M79 et M94...).

Salutations,

Renaud22
 
C'est fou ca d'être borné à ce point !!
on te dit que tu n'as PAS besoin de passer par le presse papier...

tu dis que les DEUX classeurs sont ouverts donc
VB:
sub transferer()
set classeurA=workbooks("ClasseurA.xlsm")
set ClasseurB=workbooks("ClasseurB.xlsm")

ClasseurA.sheets("Feuille1").range("H63")=classeurB.sheets("Feuill50").range("P63:P74")
ClasseurA.sheets("Feuille1").range("H79")=classeurB.sheets("Feuill50").range("P79:P90")
ClasseurA.sheets("Feuille1").range("H94")=classeurB.sheets("Feuill50").range("P94:105")
end sub

ajuster le nom des feuilles Feuille1 et Feuill50 !
 
C'est fou ca d'être borné à ce point !!
on te dit que tu n'as PAS besoin de passer par le presse papier...

tu dis que les DEUX classeurs sont ouverts donc
VB:
sub transferer()
set classeurA=workbooks("ClasseurA.xlsm")
set ClasseurB=workbooks("ClasseurB.xlsm")

ClasseurA.sheets("Feuille1").range("H63")=classeurB.sheets("Feuill50").range("P63:P74")
ClasseurA.sheets("Feuille1").range("H79")=classeurB.sheets("Feuill50").range("P79:P90")
ClasseurA.sheets("Feuille1").range("H94")=classeurB.sheets("Feuill50").range("P94:105")
end sub

ajuster le nom des feuilles Feuille1 et Feuill50 !
 
Je suis désolé d'être borné à ce point. Les classeurs sources (A)et cible (B) peuvent être nommés autrement (voir demande : La macro devra fonctionner avec des fichiers indépendamment de leur nom). Les cellules cible (H63, H79 et H94) peuvent être également différentes de celles mentionnées en exemple. Votre code est spécifiques aux classeurs A, au classeur B et aux cellules H63, H79 et H94. Merci pour votre collaboration malgré votre commentaire ....

Salutations,

Renaud22
 
s fichiers indépendamment de leur nom
quelques soient les noms, il va bien falloir à un moment indiquer à la macro quels sont ces noms !, ou lui dire comment les trouver !
idem pour les zones à copier et leur destination

maintenant, si tu ne souhaites pas tenir compte des propositions faites et conseils donnés;. c'est ton droit.. mais dans ce cas.. pourquoi venir demander de l'aide

et dernière remarque...
dans le TITRE du post, tu indiques copie de cellules SPECIFIQUES
et maintenant tu dis que la cible peut changer... mais à aucun moment tu n'expliques comment determiner ces cellules cibles..
c'est un peu comme si tu rentrais dans ta voiture pour partir, tu allumes le GPS. mais tu ne lui dis pas ou tu veux aller...
 
Dernière édition:
Merci pour vos réponses. Cependant, celles-ci me permet pas de faire ce que je désire. La solution la plus facile, que je suis en mesure de faire, avec 3 macros, mais pas la plus conviviale sera de :
- faire une macro (1) qui sélectionne la plage P63 à P74 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H63 et je colle le contenu du presse-papier.
- faire une macro (2) qui sélectionne la plage P79 à P90 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H79 et je colle le contenu du presse-papier.
- faire une macro (3) qui sélectionne la plage P94 à P105 et qui copie ses valeurs dans le presse-papier. Je sélectionne la cellule H94 et je colle le contenu du presse-papier.
Au lieu d'avoir une seule procédure, j'en aurai trois.
Comme je l'ai précisé les cellules cibles (H63, H79 et H94) peuvent être différentes car ceci est un exemple. Cela pourrait être (L63, L79 et L94 ou M63, M79 et M94...).

Salutations,

Renaud22
Si je comprend bien, vous décrivez 3 opérations manuelles simples et standards.
Un code pour ce faire n'apportera rien de plus puisqu'il vous faudra de toute façons préciser les classeurs et cellules sources et cibles .....
 
Dans votre exemple les cellules dont les valeurs sont reportées sont celles qui ne sont pas vides. N'est-ce pas suffisant ? Si ça l'est, il n'est pas nécessaire de sélectionner plusieurs plages car ça peut se détecter dans une seule plage. Mais s'il vous le faut, mon UFmSelect permettrait de sélectionner des plages disjointes, toujours dans n'importe quel classeur ouvert. Dites moi s'il vous le faut.
 
Dernière édition:
Je vous ai préparé une deuxième procédure d'un usage plus général et assez conforme à votre description du poste #8 pour copier des valeurs de plusieurs plages une par une.
L'UFmSelect est réaffiché en fin d'exécution pour pour pouvoir ensuite copier une autre plage. L'avantage c'est qu'en remontant à la 1ère sélection il active automatiquement le classeur et la feuille contenant la dernière plage copiée de sorte que vous pouvez en sélectionner une autre à copier. Pareil pour la cellule cible de début.
Mais je confirme aussi qu'il n'y a pas lieu d'utiliser le presse papier.
 

Pièces jointes

- 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
3
Affichages
461
Retour