Petit problème dans une macro
Bonjour A tous,
J'ai un petit problème de macro...
Je cherche le moyen d'éditer le plus automatiquement possible des factures pour mes clients.
Pour cela il faudrait que les différents versements effectués à des dates différentes soient reportés en bas de chaque facture.
Concrètement il faut afficher la date, le montant et le mode de règlement du client dont le nom est en case G4 de l'onglet "Facture", en allant chercher les infos dans l'onglet "Encaissements" à condition que l'ordre soit "SASU"
Du coup j'ai eu l'idée de créer la macro ci-dessous.
Peut-être que ce n'est pas le moyen le plus simple mais je n'en ai pas trouvé d'autre.
Le seul problème de ma macro, c'est qu'au lieu de copier le nom de la cellule G4, quel qu'il soit au moment de l’exécution, la macro a enregistré le nom au moment où je l'ai crée et m'affiche toujours les mêmes montants...
Est-ce que quelqu'un a une idée pour réparer ça ou bien une solution autre que la macro à proposer ?
Sub Test()
'
' Test Macro
'
'
Range("G4:I4").Select
ActiveCell.FormulaR1C1 = "Mr Martin"
Sheets("Encaissements").Select
ActiveSheet.ListObjects("Tableau2").Range.AutoFilter Field:=5, Criteria1:= _
"SASU"
ActiveSheet.ListObjects("Tableau2").Range.AutoFilter Field:=1, Criteria1:= _
"=Mr Martin", Operator:=xlAnd
Range("B155:D484").Select
Selection.Copy
Sheets("Factures").Select
ActiveWindow.SmallScroll Down:=21
Range("G37:I42").Select
ActiveSheet.Paste
ActiveWindow.SmallScroll Down:=-33
Sheets("Encaissements").Select
Application.CutCopyMode = False
ActiveSheet.ListObjects("Tableau2").Range.AutoFilter Field:=1
ActiveSheet.ListObjects("Tableau2").Range.AutoFilter Field:=5
Sheets("Factures").Select
ActiveWindow.SmallScroll Down:=-3
Range("B10").Select
End SubMerci d'avance pour vos idées !!!
Romain
Bonjour,
Pour nous permettre de t'aider efficacement, il faudrait que tu joignes un fichier exemple.
A+
Dans la proposition jointe, le traitement est effectué automatiquement lorsque le nom du client est modifié.
A+
Bonjour Frangy,
Merci beaucoup de t'être penché sur mon problème.
Je teste ta solution dès que je peux, demain en milieu d'aprem mais j'ai hate.
Très bonne fin de journée.
Romain.
Bonjour Frangy,
Je viens de tester. Ca fonctionne parfaitement et c'est exactement ce que je voulais obtenir.
Mais peux-tu m'expliquer comment ça fonctionne ?
Parce que je ne trouve aucune formule ni rien et je voudrais pouvoir le reproduire à l'occasion.
Et merci beaucoup !
Romain.
Bonjour,
Peux-tu m'expliquer comment ça fonctionne ?
Parce que je ne trouve aucune formule ni rien et je voudrais pouvoir le reproduire à l'occasion.
C’est magique ! … ou presque
Pour que le traitement soit effectué automatiquement lorsque le nom du client est modifié, il faut utiliser une procédure évènementielle qui va détecter la modification dans la cellule G4 et effectuer les opérations de filtrage et de copie.
Cette procédure s’appelle Worksheet_Change() et se trouve dans le module de la feuille Feuil7 (Factures).
Pour voir le code, tu appuies simultanément sur Alt + F11 pour accéder à l’éditeur,
ensuite Ctrl + R pour ouvrir l’explorateur de projets,
puis clic sur le module et là ... t’as tout (je n’ai pas pu m’empêcher de la faire !
Voici le code commenté
Private Sub Worksheet_Change(ByVal Target As Range)
'Si plusieurs cellules sont modifiées simultanément, on sort de la procédure
If Target.Count > 1 Then Exit Sub
'Si la cellule modifiée est G4, alors ...
If Target.Address = "$G$4" Then
'On désactive l'actualisation de l'écran
Application.ScreenUpdating = False
'On efface le tableau de détail des encaissements
Range(Range("G37:I37"), Range("G37:I37").End(xlDown)).ClearContents
'Les instructions suivantes se rapportent à la feuille "Encaissements"
With Sheets("Encaissements")
'On filtre les données sur le champ "Ordre" avec le critère "SASU"
.ListObjects("Tableau2").Range.AutoFilter Field:=5, Criteria1:="SASU"
'On ajoute un filtre sur le champ "Nom" avec le nom du client.
.ListObjects("Tableau2").Range.AutoFilter Field:=1, Criteria1:="=" & Target.Value, Operator:=xlAnd
'On copie les données filtrées
.Range("B3:D" & .Range("A" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy
'On affiche la feuille "Factures"
Sheets("Factures").Select
'On sélectionne la cellule G37, première cellule du tableau de détail des encaissements
Range("G37").Select
'On colle les données
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'On annule le mode Copier et on supprime la marque de sélection
Application.CutCopyMode = False
'On efface le filtre sur le champ "Nom"
.ListObjects("Tableau2").Range.AutoFilter Field:=1
'On efface le filtre sur le champ "Ordre"
.ListObjects("Tableau2").Range.AutoFilter Field:=5
'On sélectionne la cellule G4
Range("G4").Select
End With
End If
End SubA+
Merci Frangy !
C'est on ne peut plus clair.
Je ne connaissais pas l'existance de ces procédures.
Et en plus tu as détaillé toutes les lignes ce qui est vraiment très instructif
Tu codes à la main par habitude ou bien il existe un système genre WYSIWYG ?
Quelle ligne pourrait-on rajouter pour ne plus avoir de message d'érreur quand aucune ligne n'est trouvée ?
En effet, il existe des clients pour lesquels il n'y a pas de paiement pour à l'ordre de la SASU...
Très bonne soirée
Romain.
Tu codes à la main par habitude ou bien il existe un système genre WYSIWYG ?
Tout à la main et en finesse bien sûr ! C’est de l’artisanat
Avec WYSIWYG, se serait un peu comme un tatouage à l’imprimante 3D.
Quelle ligne pourrait-on rajouter pour ne plus avoir de message d'erreur quand aucune ligne n'est trouvée ?
J’ai apporté une modification, je te laisse le loisir de la découvrir.
A+
Ca fonctionne à merveille
J'ai vu lta modif : If WorksheetFunction.Subtotal(103, MaPlage) > 0 Then
Et l'arrivée de toto
Je te remercie infiniment pour ton aide précieuse.
Je vais enfin pouvoir éditer mes factures !!!
Très bonne soirée.
Romain.
Une dernière petite chose si tu veux bien
J'ai commencé à éditer les 3à premières facture.
Or j'ai remarqué un petit problème :
Quand je sélectionne le nom pour la nouvelle facture, le processus qui va récupérer les lignes des encaissements supprime le nom de la facture précédente qui se trouve en dessous de la nouvelle (je les mets toutes les unes à la suite des autres).
Peut-on limiter l'effacement qui du tableau G37;I37 à la ligne 42 ?
Sinon je suis obligé de refaire 2 fois chaque facture...
Mais celles qui sont en dessous ne sont pas affectées.
Bonjour,
Pour limiter l'effacement aux lignes 37 à 42, modifie cette ligne de code
'On efface le tableau de détail des encaissements
Range("G37:I37").Resize(6).ClearContentsA+
C'est nickel !
Merci beaucoup