Macro/excel pour la modification de feuilles

fax32 Messages postés 27 Statut Membre -  
fax32 Messages postés 27 Statut Membre -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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

    0
    1. fax32 Messages postés 27 Statut Membre
       
      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
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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

    0
  4. fax32 Messages postés 27 Statut Membre
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fax32 Messages postés 27 Statut Membre
     
    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
    0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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

    --
    0
  8. fax32 Messages postés 27 Statut Membre
     
    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
    0