Rechercher : dans
Par :

Macro/excel pour la modification de feuilles

Dernière réponse le 28 oct 2009 à 09:10:43 fax32, le 27 oct 2009 à 08:10:31 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « macro/excel pour la modification de feuilles » dans :
Exécuter une macro VoirExécuter une macro Excel et Calc proposent plusieurs façons d’exécuter une macro : en la sélectionnant dans une liste, dans la boîte de dialogue Macro ; par un raccourci clavier ; en l’attachant à un bouton de la barre d’outils ; ...

1

michel_m, le 27 oct 2009 à 10:54:44

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

Cordialement, Michel

Répondre à michel_m

2

fax32, le 27 oct 2009 à 18:36:59

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

Répondre à fax32

3

michel_m, le 27 oct 2009 à 19:15:09

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
Cordialement, Michel

Répondre à michel_m

4

michel_m, le 27 oct 2009 à 19:26:44

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

Cordialement, Michel

Répondre à michel_m

5

fax32, le 27 oct 2009 à 22:10:17

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.

Répondre à fax32

6

fax32, le 27 oct 2009 à 23:06:37

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

Répondre à fax32

7

michel_m, le 28 oct 2009 à 08:22:33

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






--

Répondre à michel_m

8

 fax32, le 28 oct 2009 à 09:10:43

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

Répondre à fax32