IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copier / Coller


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Financier
    Inscrit en
    Juillet 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Financier

    Informations forums :
    Inscription : Juillet 2019
    Messages : 41
    Par défaut Copier / Coller
    Bonjour à tous , débutant en VBA , je m'amuse à créer des modules grâce à des exemples que je trouve en ligne (cours, YT , ...). Suite à la réalisation d'un exemple que j'ai modifié personnellement, j'ai voulu réaliser la chose suivante : à partir de la cellule active , copier (la cellule active) , utiliser un décalage de 2, 2 , et coller . J'ai réussi facilement (rien de compliqué pour vous j'imagine bien entendu) , mais une interrogation m'est venue.
    Je vous présente mon résultat pour réaliser ce qui est dit plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub DecalerDroite()
    With ActiveCell
     .Copy
     .Offset(2, 2).Select
     
    End With
    ActiveCell.PasteSpecial xlPasteAllUsingSourceTheme
     
    End Sub
    Ma question est la suivante, au début j'avais écris ceci et j'aimerais savoir pourquoi ca ne marche pas (ne copie rien dans la cellule d'arrivée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub DecalerDroite()
    With ActiveCell
     .Copy
     .Offset(2, 2).Select
     .PasteSpecial xlPasteAllUsingSourceTheme
     
    End With
     
    End Sub

    Merci à tous pour votre aide

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour VBAMoJutsu, bonjour le forum,

    La règle d'or en VBA s'est d'éviter les Select et autre Activate inutiles. Ils ne font que ralentir l'exécution du code et sont source de plantage:
    La syntaxe simple d'un Copier/Coller c'est PlageSource.Copy PlageDestination. Ça donne par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A20").Copy Range("C1")
    Si la copie se fait dans un autre onglet il suffit de spécifier l'onglet source et l'onglet destination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Range("A1:A20").Copy Worksheets("Feuil2").Range("C1")
    Ton cas est légèrement différent car le collage est spécial mais ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveCell.Copy
    ActiveCell.Offset(2,2).PasteSpecial xlPasteAllUsingSourceTheme
    Aucune cellule n'est sélectionnée (aucun Select), c'est juste la cellule active qui est prise en compte...

    Ton deuxième exemple était trop confus/ambigu au niveau de la cellule active et a généré un bug...

  3. #3
    Membre averti
    Homme Profil pro
    Financier
    Inscrit en
    Juillet 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Financier

    Informations forums :
    Inscription : Juillet 2019
    Messages : 41
    Par défaut
    Hello Thautheme , merci beaucoup pour ta réponse , je me doutais que le problème venait du SELECT dans mon code mais je ne savais pas que je pouvais inserer le coller ici !

    Dans un cours les select et activate semblaient usefull , puis-je me fier à cette pratique?
    Merci

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    fait moi plaisir essaie la formule ".copy destination:=...."

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with sheets("toto").range("B3")
    .copy destination:=.offset(2,2)
    end with
    et regarde le format dans l'offset(2,2) et sans select
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Je rejoins Patrick qui précise l'argument Destination de la méthode Copy.

    Pour ma part, il convient de toujours procéder ainsi, par rigueur pour soi-même, et par souci de clarté pour ceux qui nous lisent.

    On voit trop souvent une suite d'arguments sans que l'on sache leur correspondance.

    Plutôt que d'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "Bonnes vacances en Vénétie", vbExclamation, "Tanti auguri"
    Il faudrait coder selon moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox Prompt:="Bonnes vacances en Vénétie", Buttons:=vbExclamation, Title:="Tanti auguri"
    Sur ce, je vais souhaiter un bel été au forum avant de le retrouver dans quelques semaines.
    Pour ma part, quelques verres de Valpolicella et autres Refosco (avec modération), ainsi que des tranches de mortadelle et de prosciuto de San Daniele seront passés par là.

    Arrivederci a Tutti. Buone ferie. Ci rivedremo presto!

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour Marcel
    non seulement ca mais avec cette formule le format est embarqué avec
    en gros c'est le même effet que (couper/coller) sans le couper

    Nom : demo2.gif
Affichages : 175
Taille : 251,6 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    Attention ! j'ai bien dit éviter les Select inutiles. Il est bien évident que quand cette sélection est nécessaire et inévitable il faut l'utiliser et le cours que j'ai parcouru rapidement me semble très bien fait pour cela. Mais, encore une fois, un Copier/Coller (et beaucoup d'autres actions) ne demande aucune sélection...
    Par Exemple :
    - Effacer le contenu de la plage A1:G50 :
    Range("A1:G50").ClearContents
    - Trier la plage A1: D500 par rapport à la cellule B1 (en-Tête) et la colorer de vert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Range("A1:D500")
        .Sort Range("B1"), xlAscending, Header:=xlYes
        .Interior.ColorIndex = 4
    End With
    etc.

    - Mais, si à la fin d'un code tu veux afficher l'onglet Feuil1 et rendre la cellule A1 active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets("Feuil1").Activate
    Worksheets("Feuil1").Range("A1").Select
    [Édition]
    Bonjour Patrick, nos posts se sont croisés...



  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour le Fil,
    Citation Envoyé par Thautheme Voir le message
    La règle d'or en VBA s'est d'éviter les Select et autre Activate inutiles. Ils ne font que ralentir l'exécution du code et sont source de plantage
    Attention ! j'ai bien dit éviter les Select inutiles. Il est bien évident que quand cette sélection est nécessaire et inévitable il faut l'utiliser
    Je ne peux que plusser , nous ne cessons pas de le répéter depuis le siècle précédent !

    et le cours que j'ai parcouru rapidement me semble très bien fait pour cela
    Je trouve au contraire que ,dans ce cours, l'accent n'est jamais mis sur inutilité et les inconvénients de la sélection :
    Le paragraphe précédent (Le VBA : un langage orienté objet) est aberrant : trop d'exemples concernent l'objet Selection au lieu d'utiliser un objet Range !

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Patrice je suis d'accords j'ai pas oser le dire quand je suis allé voir ce cours
    il doit certainement dater

    edit:

    bon après vérif.ce cours a été mis a jour le Mis à jour le 18/05/2018donc oui aberrent et le mot qu'il convient

    cela dit c'est un cours sur le thème de la sélection il est difficile de ne pas y faire allusion dans les exemples de code
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut Re
    Re,

    La programmation exige beaucoup de rigueur pour apprendre à coder correctement, voici quelques conseils qui éviterons bien des déboires :
    - commencer tous les modules par Option Explicit, qui oblige à déclarer toutes les variables ;
    - déclarer les variables avec le type ad hoc et limiter leur portée au strict nécessaire (i.e. locale, privée, publique ou globale) ;
    - envisager tous les types potentiels de chaque variable pour éviter les erreurs, dans le doute prévoir un gestionnaire d"erreur ;
    - ne jamais utiliser .Select, éviter les objets actifs : Selection, Activecell, Activesheet, ... (sauf, très très rarement, lorsque c'est absolument indispensable) ;
    - éviter d'utiliser des propriétés ou méthodes d'objet héritées qui pourraient ne pas exister. Ex: au lieu de Sheets(1).Range("A1") écrire Workheets(1).Range("A1")
    - éviter les références implicites (i.e. partielles), privilégier les références explicites (complètes). Ex: au lieu de =Cells(1,2) écrire =Worksheets(1).Cells(1,2).Value
    - éviter d'utiliser le Presse-Papier, préférer la copie directe (une seule instruction) : Source.Copy Destination ou Destination.valeur = Source.Valeur
    - commenter le code, penser à celui (peut-être toi) qui devra le déboguer dans deux ou trois ans !
    - respecter certaines règles de nommage des variables, notamment l'emploi d'un préfixe : le code est plus lisible par tous. Voir ici : http://argyronet.developpez.com/office/vba/convention/
    - ne pas écrire de procédures fleuves (très longues), les scinder en différentes procédures élémentaires : là encore le code sera plus lisible.

    Tu trouveras ici un excellent cours VBA gratuit pour débutants (et plus si affinités ...),
    même si, pour simplifier les explications, il n'applique pas toujours les conseils précédents :
    https://bidou.developpez.com/article/VBA/

    Et le premier d'une série de 5 cours gratuits très complets pour apprendre par la pratique :
    http://laurent-ott.developpez.com/tu...el-vba-tome-1/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] copier coller d'une valeur
    Par mic56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/06/2004, 11h43
  2. [Swing]copier coller... dans le menu.
    Par parksto dans le forum Composants
    Réponses: 3
    Dernier message: 10/05/2004, 22h56
  3. Copier coller Fichier windows
    Par KPitN dans le forum Windows
    Réponses: 8
    Dernier message: 20/04/2004, 17h32
  4. Copier Coller une ligne d'une table avec modif ?
    Par nolan76 dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/03/2004, 16h34
  5. [Débutant] Conserver la couleur lors d'un copier coller
    Par ADIDASman dans le forum JBuilder
    Réponses: 2
    Dernier message: 21/05/2003, 18h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo