Macro/excel pour la modification de feuilles

Bonjour à tous et ... au secours !
Je dois vous avouer que je galère un max sur un pb de macro et que depuis quelques soirs j'ai la tête comme un "cabanon".
Voilà mon pb
Sur Excel, je souhaiterais créer une macro qui me permette de réaliser les trois actions suivantes :
A partir de la sélection d'une cellule quelconque de la colonne A; pouvant être sélectionnée indifféremment sur 6 feuilles (correspondant a du matériel, donc avec une valeur texte) :
- copier la ligne sur laquelle se trouve cette cellule sur la première ligne vide de la feuille "Ventes". Ce collage doit être un collage spécial qui supprime les formules contenues dans la ligne pour ne laisser apparaître que les valeurs,
- rechercher la valeur de cette cellule active dans la colonne A de la feuille "Stock" et supprimer la ligne sur laquelle se trouve cette valeur,
- sur la feuille active, effacer sur la ligne active les cellules C1,D1,F1,G1,I1,J1,L1,M1,O1,P1,R1,S1,U1 et colorer la ligne en gris.
Si quelqu'un pouvait m'aider, ça me permettrait de diminuer ma dose d'aspirine.
Par avance merci.
Configuration: Windows XP
Firefox 3.5.3

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonjour

    Par souci de santé publique... ;-)
    essaies cette macro à copier dans le module "thisworkbook" de l'éditeur VBA

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Intersect(Target, Range("A1:A10000")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    With Sheets("ventes")
        .Rows(.Range("A65536").End(xlUp).Row + 1) = Rows(Target.Row).Value
    End With
    With Sheets("stocks")
        .Rows(.Columns(1).Find(Target.Value, .Range("A65536"), xlValues).Row).Delete
    End With
    lig = Target.Row
    cellule = Array(3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21)
    For cptr = 0 To UBound(cellule)
        Cells(lig, cellule(cptr)).ClearContents
    Next
    Rows(lig).Interior.ColorIndex = 15
    Application.EnableEvents = True
    End Sub

    1. Bonjour Michel
      C'est très sympa de ta part d'avoir bien voulu étudier mon pb.
      J'ai copié la macro dans le module "thisworkbook" de l'éditeur VBA mais je ne sais pas comment l'enregistrer ou la faire démarrer (j'ai honte). D'habitude, j'enregistre une macro quelconque, puis je la bidouille. Je ne suis jamais passé par le module "thisworkbook" et ne sais pas l'utiliser. Ça doit te paraître navrant ... mais je suis comme une poule devant un écrou de 12.
      Très cordialement
  2. Contributeur
    Re,

    Y' a pas à avoir honte! les forums aident justement à mutualiser les connaissances

    D'autant plus que j'avais pris l'événement "change" au lieu de "selectionchange": Ca ne risquait pas de marcher en cliquant sur la colonne A!... (c'est moi qui devrait avoir honte! :-)...) j'en ai profité pour éviter le B... quand on clique dans les feuilles "ventes" et "stocks" (re-honte)
    Je te donnerai tout ca demain
    1. Contributeur
      Tout compte fait voila la b^te:
      rassure-toi, ce n'était pas si évident que ça avec des pièges (chuis tombé dedans, of course)...

      Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      'si on sélectionne hors A1:10000 ou si la feuille active est "ventes" ou "stoks" :sortie de la macro
      If Intersect(Target, Range("A1:A10000")) Is Nothing _
      Or ActiveSheet.Name = "ventes" Or ActiveSheet.Name = "stocks" Then Exit Sub
      
      'détruit dans la feuille la ligne correspondant à la valeur sélectionnée en feuille active
      With Sheets("stocks")
          On Error GoTo erreur:
          .Rows(.Columns(1).Find(Target.Value, .Range("A65536"), xlValues).Row).Delete
      End With
      
      'report dans la 1° ligne vide de "ventes"  des valeurs de la ligne sélectionnée dans feuille active
      With Sheets("ventes")
          .Rows(.Range("A65536").End(xlUp).Row + 1) = Rows(Target.Row).Value
      End With
      
      'ligne de la sélection feuille active
      lig = Target.Row
      'tableau des num de colonnes à effacer
      cellule = Array(3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21)
      'boucle sur le tableau en effacant le contenu
      For cptr = 0 To UBound(cellule)
          Cells(lig, cellule(cptr)).ClearContents
      Next
      'colorie la ligne en gris
      Rows(lig).Interior.ColorIndex = 15
      Exit Sub
      
      erreur:
      MsgBox Target & " inconnu dans les stocks"
      End Sub

      1. Salut Michel
        Merci encore de prendre sur ton temps pour m'aider. Pourrais-tu me dire comment enregistrer cette macro et la faire fonctionner à partir du moment ou je l'ai copiée dans le module "thisworkbook" de l'éditeur VBA.
        Merci aussi pour ta patience, je ne voudrais pas trop en abuser.
        1. Rebonjour
          Je viens de copier comme ci-dessous, la macro dans un module (méthode de la découverte). Cependant quand je l'exécute, un message d'erreur apparaît qui parle d'erreur de syntaxe sur la ligne :
          SheetSelectionChange (ByVal Sh As Object, ByVal Target As Range)
          C'est grave docteur ?

          Sub Nouvelle_Macro()
          SheetSelectionChange (ByVal Sh As Object, ByVal Target As Range)

          'si on sélectionne hors A1:10000 ou si la feuille active est "ventes" ou "stok" :sortie de la macro
          If Intersect(Target, Range("A1:A10000")) Is Nothing _
          Or ActiveSheet.Name = "ventes" Or ActiveSheet.Name = "stock" Then Exit Sub

          'détruit dans la feuille la ligne correspondant à la valeur sélectionnée en feuille active
          With Sheets("stock")
          On Error GoTo erreur:
          .Rows(.Columns(1).Find(Target.Value, .Range("A65536"), xlValues).Row).Delete
          End With

          'report dans la 1° ligne vide de "ventes" des valeurs de la ligne sélectionnée dans feuille active
          With Sheets("ventes")
          .Rows(.Range("A65536").End(xlUp).Row + 1) = Rows(Target.Row).Value
          End With

          'ligne de la sélection feuille active
          lig = Target.Row
          'tableau des num de colonnes à effacer
          cellule = Array(3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21)
          'boucle sur le tableau en effacant le contenu
          For cptr = 0 To UBound(cellule)
          Cells(lig, cellule(cptr)).ClearContents
          Next
          'colorie la ligne en gris
          Rows(lig).Interior.ColorIndex = 15
          Exit Sub

          erreur:
          MsgBox Target & " inconnu dans le stock"
          End Sub
          1. Contributeur
            Ta méthode "la découverte" a tout fait foiré
            wokrbook selection change est un événement qui déclenche une macro sur tout le classeur(workbook) lorsqu'on clique sur une cellule( selectionchange)
            la macro se lance par
            Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) macro installé dans le module workbook

            su tu veux voir ce qui se passe tu cliques sur la 1° ligne if intersect...et tu mets un point d'arr^t par F9

            --
            1. Bien vu. Je viens de remettre la macro comme tu l'avais créee et elle fonctionne à merveille. C'est beau et je suis très impressionné.
              Toutefois, j'ai un petit pb. En effet, la macro ne doit pas se déclencher lorsque je clique sur une cellule car je rajoute du matériels (1 par ligne) dans les différentes feuilles. Pour ce faire, je dois donc cliquer sur une cellule de la colonne A pour entrer la référence (texte) de ce matériel.
              Il faudrait que je puisse déclencher la macro par un "Ctrl+V" par exemple, après avoir sélectionner un matériel en cliquant sur la référence, cellule A, de la ligne.
              C'est pour ça que je souhaitait créer un module comme ceux que l'on crée en utilisant la fonction "nouvelle macro" et en lui affectant un raccourci.
              J'ai conscience de ne pas être suffisamment clair et je ne voudrais pas que, par ma faute, tu devienne comme moi, accro à l'aspirine....
              Encore un grand merci