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.
A voir également:

7 réponses

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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
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