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 :

[VBA-E] souci avec copier/coller


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut [VBA-E] souci avec copier/coller
    Bonjour a tous

    voila en gros mon souci, dans un Workbook_SheetActivate, je viens mettre de la couleur ds certaines celulle par la fct ActiveSheet...(un systeme de raffraichissement).

    le souci: si je selectionne une celulle d'une autre feuille, que je copie cette celulle,quand je vais sur une autre feuille, automatiquement , du faite de la fct activeSheet.range dans ma procedure Workbook_SheetActivate, ca remet le presse papier a zero, donc ne peut plus faire un Paste.

    Y a t'il une solution pour garder une celulle copier et garder ma fonction telle qu'elle...
    ou bien
    comment je peux savoir si une zone de celulle est selectionner et en copie, la feuille ou se trouve cette zone ainsi que le range selectionner (en mode; les petits points qui tourne autour de la zone selectionner)?

    merci par avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    ActiveSheet.Range("G4:g22").Font.ColorIndex = xlAutomatic
    End Sub

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Quand tu colles ta cellule, au lieu de le faire avec Paste, fais-le avec PasteSpecial. Regarde dans l'aide ou enregistre la macro, mets-nous le code, on te le simplifiera
    Activecell signifie que tu sélectionnes ta cellule (!) N'utilise-pas Select ni activate pour faire ça. Tu peux très bien t'en passer et ça accélérera ta procédure.
    Il suffit que tu désignes la feuille et la cellule (ainsi que le classeur si les données proviennent d'un autre classeur). Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NoLigne = 5
    NoColonne = 3 'C
    Workbooks(NomFichier).worksheets(NomFeuille).cells(NoLigne, NoColonne).copy
    Activesheet.Range("D6").PasteSpecial Paste:=xlValues
    Paste:=xlValues ne colle que la valeur, non le format
    Tu dis

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Merci pour ta réponse, j'ai du mal m'expliquer...

    quand je suis sur une feuille 1, et que je memorise une cellule avec les touches(non avec une macro)... quand je bascule sur une autre feuille
    ma cellule copié n'est pas plus active...
    ca deselectionne a cause de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("G4:g22").Font.ColorIndex = xlAutomatic
    Le faite de mettre une couleur vire la memorisation de mon copier.

    Le phenomene est identique manuellement, va sur une feuille 1, capture une zone et copie la par le bais de Ctrl+C, va sur une autre feuille
    choisi une celulle, mets la en rouge!!!
    et tu vas te rendre compte que tu ne peux plus faire CTrl+V,

    ca doit etre du a Excel qui ne permet pas de faire ce que je souhaite...
    c'est pour ca que je voulais contourné le probleme!!
    avant d'inserer mes couleurs ds l'evenement activesheet, je voulais savoir si une zone avait été copié, ensuite sur quelle feuille, et les coordonnées de cette zone capturer, je pouvais donc la recreer apres avoir changer mes couleurs....
    mais je n'ai pas trouvé les fonctions qui te disent ou se trouve le copier....
    juste selection.copy, mais cela met juste ds le presse papier, moi j'ai besoin de connaitre l'origine du copy

    un petit souci sympa!!! j'ai l'habitude de delphi, mais la, je depends d'excel et de ses possibilités en evenements....

    beyey

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    en vba je ne vois pas comment "sauver" puis récupérer le contenu du presse papier.., ( avec les apis peu-être..)

    mais tu peu peu-être contourner ton probléme :
    déjà pose toi la question ... ( et donne nous la réponse..) quand est-ce que ces couleurs peuvent changer ...? ne peu tu pas choisir un autré événement pour appliquer ta correction ..? l'ouverture ou la fermeture du classeur par exemple..?
    pour les événements d'un classeur voir :
    Les évènements du module objet ThisWorkbook (Classeur)


  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok, j'ai répondu à côté...
    Tu as peut-être une solution du côté de le feuille de code de la feuille de calcul, si tu as la possibilité de mémoriser "quelque part" l'adresse de la cellule sélectionnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
          msgbox target.address
          'où target de fournit l'adresse de la cellule sélectionnée
    end sub
    Tu dis

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Utilise un autre événement que le SheetActivate...

    Pour ma part, je choisirais le Worksheet_Change, ce qui me paraît plus logique puisque tant que rien n'a été modifié, il n'y a rien à raffraichir.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    explication de l'idée general de mon souci.

    J'ai besoin d'imprimer une feuille parmis 31 éxistante, mais sur l'impression il y a des zones que je ne souhaite pas etre vu !...
    Donc avec ce module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Cancel = False
     
    If ActiveSheet.Index > 2 And ActiveSheet.Index < 34 Then
     
     
     ActiveSheet.Range("G4:G51").Font.ColorIndex = 2
     ActiveSheet.Range("J4:J43").Font.ColorIndex = 2
     ActiveSheet.Range("M4:M43").Font.ColorIndex = 2
     ActiveSheet.Range("P4:P43").Font.ColorIndex = 2
    End If
    End Sub
    Je cache une zone font blanc sur pen blanc...
    nickel!!


    par contre, apres impression , ca ne revient pas, ce qui est normal,
    vu qu'il n'existe pas d'evenement apres impression pour remettre en etat visuel!.
    j'ai concu deux modules
    l'un si je reactive la feuille par la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal target As Range)
    Raffraichir 'je remet les couleurs en etat
    End Sub
    et l'autre modules si je vais sur une autre feuille, je m'assure avant de reafficher les valeurs, car je peux imprimer et partir sur une autre feuille sans la remise a jour!...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Raffraichir
    End Sub
    j'aurais pu utiliser l'evenemtn Workbook_SheetdeActivate
    a ce moment la, je fais le raffraichissment avant de quitter la feuille, mais mon souci de selection reste a l'identique!...
    car des que j'ordonne le coloriage d'une celulle, je perds la zone selectionnée ...
    il mets donc impossible de faire un coller ensuite!:!

    meme avec des apis, je ne suis pas sur d'y arriver!!... mais bon, ds le pire des cas, je ferais un bidouillage !(pas top mais bon)

    si la zone a colorier est déjà colorier j'ignore le rafraichssieemnt, et donc je ne perds pas ma selection coller.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Voila ce que je te propose :
    juste après ton impression, tu remets les couleurs que tu as modifié...
    Et comment?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private printonce As Boolean  ' Petite variable qui permet d'annuler l'impression lancée par l'utilisateur (1), mais pas celle par la macro (2)
     
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
        If printonce = False Then
            Cancel = True   ' Annule l'action (1) d'impression
            printonce = True ' Pour que l'appel (2) ne rentre pas dans cette boucle If
            Range("a1").Font.ColorIndex = 5  ' Change la couleur avant impression
            ThisWorkbook.PrintOut , , 1        ' Imprime vraiment (2)
            Range("a1").Font.ColorIndex = 0  ' Remet la couleur après impression
            printonce = False      ' Re-initialise l'impression
        End If
    End Sub
    J'espère que cela te sera utile

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Génial,
    apres une petite modif de ton code, ca marche nickel,
    j'avais peur que le preview ne fonctionne pas, vu que tu fais un printout direct .... mais nickel
    je peux donc copier mes cellules du feuille a l'autre sans souci..


    merci à tous
    pour info;
    le soft que j'ecris, c'est a gerer le planning de travail d'une equipe de 30 personnes, (il ne doivent voir que leur activité), ca fait la gestion des conges, absences et bien plus encore !!....

    merci encore

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    suite à la réponse à skillyRoad... la : vider automatiquement le presse papier
    .
    . j'ai trouvé une autre solution à ton probléme, répondant à la question telle que posé initialement je la poste pour le "fun":
    donc necessite d'activer la référence "Microsoft Forms 2.0 Object Library" (FM20.DLL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim d As New DataObject
    d.GetFromClipboard  'sauve le pressepapier
    ActiveSheet.Range("G4:g22").Font.ColorIndex = xlAutomatic
    If Not d Is Nothing Then d.PutInClipboard 'Restaure le presse-papier
    End Sub

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Merci a toi, ca pourra peut etre me servire pour d'autres evenement qui necessite la restauration du presse papier avec un change de couleur ou autres action qui désactive le presse papier...

    Merci encore!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Bonjour a tous a nouveau!

    Je relance mon sujet d'y il a quqlues mois.
    cette solution est super mais !!!!

    Citation Envoyé par dadavyvy
    Voila ce que je te propose :
    juste après ton impression, tu remets les couleurs que tu as modifié...
    Et comment?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private printonce As Boolean  ' Petite variable qui permet d'annuler l'impression lancée par l'utilisateur (1), mais pas celle par la macro (2)
     
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
        If printonce = False Then
            Cancel = True   ' Annule l'action (1) d'impression
            printonce = True ' Pour que l'appel (2) ne rentre pas dans cette boucle If
            Range("a1").Font.ColorIndex = 5  ' Change la couleur avant impression
            ThisWorkbook.PrintOut , , 1        ' Imprime vraiment (2)
            Range("a1").Font.ColorIndex = 0  ' Remet la couleur après impression
            printonce = False      ' Re-initialise l'impression
        End If
    End Sub
    J'espère que cela te sera utile

    donc le mais!!!
    Quand je veux faire un apercu ou par le menu imprimer,, je n'ai plus la boite de dialogue qui pourrait me permettre de choisir mon imprimante, il imprime directement sur la derniere imprimante selectionner.
    j'ai donc rajouté une application.dialog(Xlprint....).show a la place de thisworkbook.printout...
    a present j'ai bien ma boite de dialogue, mais j'ai un phenome qui quand je change d'imprimante, il reste avec les drivers l'imprimante par defaut.. donc tt le dimenssionnement du docuement est invalide a l'impriamnte et ca plance avec un message de souci d'impression.
    SI je n'utilise pas appllication.dialog, et desactive beforeprint... la boite de dialogue marche nickel en l'appelant par Menu/fichier/imprimer.

    la question, la voici, comment faire pour recuperer la boite de dialogue ds un beforeprint ?

    merci par avance.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Bien, j'ai resolu mon probleme, voici donc ma solution
    j'ai détourné l'action sur la touche apercu et imprimer.
    ainsi je n'utilise plus beforeprint.
    et je peux joué avec la boite de dialogue imprimer sans galere.

    voici ma solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    Sub RedefinePrintPreview()
     
    Dim CBar As CommandBar
    Dim Found As CommandBarControl
    Dim Found2 As CommandBarControl
     
        For Each CBar In CommandBars
            Set Found = CBar.FindControl(ID:=109, recursive:=True)
            Set Found1 = CBar.FindControl(ID:=4, recursive:=True)
            If Not Found Is Nothing Then Found.OnAction = "Previewprint"
            If Not Found1 Is Nothing Then Found1.OnAction = "sanspreviewPrint"
     
        Next CBar
     
     
        Preview = False
     
     
    End Sub
     
     
    Sub PreviewPrint()
        Preview = True
        cache
        ActiveSheet.PrintPreview
        Preview = False
        Raffraichir
    End Sub
     
    Sub SansPreviewprint()
        Preview = True
        cache
        Application.Dialogs(xlDialogPrint).Show
        'ActiveSheet.PrintPreview
        Preview = False
        Raffraichir
    End Sub
    au demarrage du document xls ,on lance RedefinePrintPreview ce qui detourne les actions, print et apercu, apres j'ai plus qu'a faire joujou dans mes procedures.

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

Discussions similaires

  1. [XL-2013] VBA : Ajout feuille M+1 avec Copier/coller
    Par curiosity69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/05/2015, 16h50
  2. [XL-2010] Boucle VBA ou formule avec Copier Coller Image
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/07/2013, 15h16
  3. Problemes avec copier/coller avec VI
    Par fgalves dans le forum Linux
    Réponses: 7
    Dernier message: 06/01/2009, 15h43
  4. [VBA] Pb avec Copier/coller d'une feuille Excel
    Par sebastien_oasis dans le forum Excel
    Réponses: 3
    Dernier message: 14/12/2007, 11h08
  5. [VBA Excel]probleme de copier/coller
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 31/01/2006, 14h22

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