[Excel] coller + mise en forme conditonnelle

J'ai un petit problème sous Excel.

La situation: sur une feuille, les cellules C3 à C13 forment une sorte de "formulaire" de saisie de données, Une macro Sub ajoutdivers() copiant ensuite ces données avec une transposée à la ligne 17 qui est la première ligne d'une base de données.

Le code de la macro :

Sub ajoutdivers()

    Rows("17:17").Select
    Application.CutCopyMode = False
    Selection.Insert Shift:=xlDown 'insertion d'une nouvelle ligne à la ligne 17

    Range("C3:C13").Select
    Selection.Copy 'copie des données du "formulaire"
    Range("B17").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True ' collage spécial transposé des données à la ligne 17

    Range("C3:C13").Select 'effacer les cellules du "formulaire" 
    Application.CutCopyMode = False
    Selection.ClearContents
    
End Sub


Jusque là tout va bien. Ensuite j'ai voulu créer une mise en forme conditionnelle dans la base de données pour que quand on sélectionne une cellule, toute la ligne soit "surlignée" (fond coloré) pour faciliter la lecture (le tableau a beaucoup de lignes, et elles sont assez longues).

Et là, quand j'essaie d'exécuter la macro, Excel me retourne :"erreur d'exécution 1004 : la méthode PasteSpecial de la classe Range a échouée". Après divers essais, j'ai l'impression qu'il est impossible de coller les données dans la base de données à cause de sa mise en forme "surlignement".

Donc bien sûr : est-ce que quelqu'un a une solution ?

merci d'avance
Configuration: Windows XP
Internet Explorer 7.0 & Mozilla 2.0

8 réponses

  1. Contributeur
    Lermitte va me flinguer...):
    Pourquoi.. Aucune raison!!
    Mais j'ai quand même une petite solution si tu à trouver le conflit.
    Sub test()
      Application.EnableEvents = False
        .....
        ....
      Application.EnableEvents = True
    End Sub

    C'est plus générique.
    A+
    1
    1. YYYYEEEEESSSSS
      ça marche merci beaucoup!!!!!!!!
      ++
      donc j'ai encadré ma macro par:
      Sub nommacro()
      Application.EnableEvents = False
      ...
      ...
      Application.EnableEvents = True
      End Sub


      Et dans celui de la feuille

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Application.EnableEvents = True Then Calculate
      End Sub
      0
  2. Contributeur
    Je vient de lire ton poste 3
    et comme demandé, où sont les fonction Ligne() et colonne()
    0
    1. en fait j'ai été dans
      ->Format
      ->Mise en forme conditionnelle
      ->j'ai sélectionné "La formule est" dans le petit menu déroulant
      ->j'ai saisi la formule "=LIGNE()=CELLULE("ligne")"
      ->j'ai choisi une couleur

      Puis j'ai été dans VBA editor, j'ai sélectionné ma feuille et j'ai tapé le code suivant:
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Calculate
      
      End Sub


      Voilà apparement c'est ce dernier qui plante et qui empêche de faire le faire le collage spécial.
      0
  3. Contributeur
    Hello Rob
    Comment as-tu défini ta mise en forme conditionnelle lors de la sélection d'une ligne? Par macro? Si oui, peux-tu donner le code pour voir s'il y a pas conflit?
    -1
    1. Merci pour la rapidité.
      J'ai défini la mise en forme conditionnellle grâce à format et pas grâce à une macro.
      la formule est: =LIGNE()=CELLULE("ligne") et après j'ai pris une couleur.
      En fait je voudrais que la mise en forme soit active tout le temps mais sur une portion réduite de la feuille (que dans la base de données).
      Par contre j'utilise cette formule pour la mise en forme soit effective:

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Calculate
      
      End Sub


      Peut-être que le problème se situe là ?
      0
  4. Contributeur
    Bonjour,
    Le fait de modifier la couleur de la ligne n'a rien à voir avec le problème.
    Erreur 1004, ne trouve pas l'objet ou l'adresse que tu donne n'est pas valable.

    essaye en ajoutant...
    Sub ajoutdivers()
        Sheets("NomFeuille").select

    A+
    -1
    1. Test effectué. Pas de changement.
      Mais merci.

      La macro marche parfaitement sans la mise en forme conditionnelle mais ne fonctionne plus dès qu'on met en place la mise en forme conditionnelle.
      0
    2. @Rob1Bonjour
      J'ai un problème de cacul en Excel et en plus comment il faut ajuster le lignes.
      La marge normal en Excel c'est combien?
      Peu-être quelqu'un à une reponse pour moi

      Merci et à bientôt
      0
  5. Contributeur
    quel version d'Excell ?
    -1
    1. Excel 2003 (11.6560.6568) SP2

      Pour le problème en cours, j'ai remarqué quand si je copie manuellement le contenu de cellules du "formulaire" puis que je vais dans une cellule de la base de données, je ne peux plus faire de coller (même le coller classique de base).

      Je suppose que c'est l'action de la mise en forme qui fait que je "perds" ce que j'ai copié. Dès qu'on fait une action sans rapport avec coller, Excel "perd" ce qu'il a copié (contrairement à d'autres logiciels comme Word, bloc-notes etc.).

      Donc je pense qu'il me faut faire ce surlignement d'une manière complètement différente.
      0
  6. Contributeur
    Oui, je comprenais pas; j'ai le 2000 et il n'y a pas cette possibilité.
    Mais pour mettre une ligne en surbrillance tu devrais pouvoir y arriver facilement avec l'éditeur de macro. et ensuite l'adapter
    -1
    1. Contributeur
      C'est le paste special qui entre en conflit avec ton Calculate lors du SelectionChange et je ne vois pas comment désactiver ce SelectionChange autrement que par une magouille du genre (Lermitte va me flinguer...):
      Public SelectionChangeDeactivated As Boolean
      Sub test()
          SelectionChangeDeactivated = True
          Rows("17:17").Select
          Application.CutCopyMode = False
          Selection.Insert Shift:=xlDown 'insertion d'une nouvelle ligne à la ligne 17
          Range("C3:C13").Select
          Selection.Copy 'copie des données du "formulaire"
          Range("B17").Select
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True ' collage spécial transposé des données à la ligne 17
          Range("C3:C13").Select 'effacer les cellules du "formulaire"
          Application.CutCopyMode = False
          Selection.ClearContents
          SelectionChangeDeactivated = True
      End Sub
      et pour bloquer ton Calculate lors de l'exécution de la macro:
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not SelectionChangeDeactivated Then Calculate
      End Sub
      A part ça, je n'arrive pas à comprendre la formule que tu utilise dans le formattage conditionnel. C'est quoi le "ligne" entre guillemets? J'ai essayé 2-3 truc avec ma version anglaise comme '=ROW=CELL("ROW")' mais rien n'y fait. Tu tiens ce truc que quelque part ou t'as découvert ça tout seul?
      -1
      1. J'ai bien compris ce que tu voulais faire par contre pourquoi avoir mis 2 fois TRUE (SelectionChangeDeactivated = True
        ) ? J'ai essayé de mettre false au deuxième mais ça ne marche non plus.

        Pour ce qui est du =LIGNE()=CELLULE("ligne") je l'ai trouvé sur le site:
        http://www.veriti.net/forum/viewtopic.php?t=239.
        0
      2. Contributeur
        @Rob1Désolé pour le true true. Décidément, j'ai de la peine avec mes copy/paste...
        Pour la formule, merci. Le truc fonctionne avec la version anglaise en mettant =ROW()=CELL("row").
        Mais si quelqu'un peut m'expliquer comment ça se fait que ça marche. Qu'est-ce que c'est que ce "row" ou "ligne" entre guillemets, balancé comme argument de la fonction CELLULE()???
        -1
      3. @plubarjCC
        je pense qu'en fait on lui demande de surligner la ligne de la cellule qui contient la ligne.
        ++
        0
    2. Contributeur
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Application.EnableEvents = True Then Calculate
      End Sub

      Pas besoin...
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
           Calculate
      End Sub

      mais tu peu dire merci à plubarj, c'est lui qui à trouver la faille.
      -1
      1. ok d'accord je viens de tester.

        Petite astuce pour ceux qui comme moi vont galérer je vous donne la formule pour qu'après avoir ajouter une ligne dans la base de données, la mise en forme se conserve:

        Range("B17:L17").Select 'Sélection de la ligne sur laquelle la mise en forme va être conservée
            Selection.FormatConditions.Delete
            Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
                "=LIGNE()=CELLULE(""ligne"")" 'Formule de la mise en forme
            Selection.FormatConditions(1).Interior.ColorIndex = 24 'Choix de la couleur(dépend de la mise en forme)


        Merci à plubarj et lermite222 pour votre aide

        ++ Rob1 (Et Pauline) ->binôme de choc
        0