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 Sub

Merci d'avance pour vos idées !!!

Romain

Bonjour,

Pour nous permettre de t'aider efficacement, il faudrait que tu joignes un fichier exemple.

A+

Bonjour,

Voici un fichier d'exemple

Merci !

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 Sub

A+

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).ClearContents

A+

C'est nickel !

Merci beaucoup

Rechercher des sujets similaires à "petit probleme macro"