TCD / VBA - isoler des valeurs en fonction d'une condition dans plusieurs feuilles

Bonjour à tous,

Dans un tableau comptable (balance) avec de nombreuses lignes je cherche à isoler un ensemble de ligne en fonction d’une condition :

=> Afficher les lignes “PIECE” si dans une des cellules de ces lignes, il y à la valeur (par exemple “512300”) dans la colonne “COMPTE”

(voir pj ci-jointe)

Il s’agit en faite d’isoler les dépenses en fonction d’un code banque et de garder la contrepartie “CREDIT”

Merci de votre aide!

banque.xlsx (32,1 Ko)

Bonjour,
Tu peut déplacer le champ “COMPTE” dans la zone “FILTRES”, ainsi tu choisis le (ou les) compte désiré.
banque.xlsx (29,3 Ko)

Merci Mimimathy !

Malheureusement avec cette manip’ je perds la contre partie du Crédit.
Chaque pièce est rattaché à un seul compte 512xxx mais à plusieurs compte 401xxx.
Je dois pouvoir filtrer le compte 512xxx et garder la contre partie. le point commun entre des deux valeurs est la “PIECE”

Voyez vous une solution ?

merci :slight_smile:

Re,

J’ai pas tout compris

place un classeur avec ce que tu voudrais obtenir par rapport à ce que tu as
c’est plus simple :wink:

:slight_smile:

Oui c’est pas simple ! Mais merci pour ton aide.

Tu trouveras le fichier avec une répartition par onglet :

  • ALL DATA : ce sont les données brut que j’ai en ma possession et que je dois traiter (en vrai j’ai 8000 lignes)

Ensuite les autre onglets c’est ce que je voudrais avoir comme résultat :

  • 512200 : uniquement les PIECE avec le compte débit 512200 et la contre partie 411** ou 412*** etc…
  • 512300 : uniquement les PIECE avec le compte débit 512300 et la contre partie 411** ou 412*** etc…
  • 519000 : uniquement les PIECE avec le compte débit 519000 et la contre partie 411** ou 412*** etc…
  • 512201 : uniquement les PIECE avec le compte débit 512201 et la contre partie 411** ou 412*** etc…

banque.xlsx (14,8 Ko)

cela te parait il plus clair ? :confused:

Re,

En effet, c’est plus clair, mais je pense pouvoir te régler cela en VBA
si j’ai compris, un feuille par compte commençant par 5 avec son crédit et sa pièce, avec en dessous le ou les comptes se rapportant à la pièce avec son ou ses débits.

Re,

Oui c’est ça ! après je me permet de faire une remarque :

Citation : une feuille par compte commençant par 5 avec son crédit et sa pièce, avec en dessous le ou les comptes se rapportant à la pièce avec son ou ses débits

=> dans « ALL DATA » les compte 411*** ne sont pas pas forcément en dessous ; les 51*** peuvent être au dessus en dessous ou au milieu

Sinon je ne suis pas un pro du VBA mais j’apprendrai comme ça !


J’ai réfléchi un une méthode, je te la partage :

Si on arrive à « tagger » les « PIECE » en fonction du CODE 5* à laquelle elle appartiennent, on pourrai filtrer les « PIECE » en fonction du 512300 / 512201 / etc… et avec la contre partie 41****

Je ne sais pas si je suis clair mais j’aurai tenté ma chance ! :smiley:

Encore une fois merci de ton aide !

Re,

J’avais bien compris, quand je dis “En-dessous”, c’est dans la feuille récapitulative du compte

Re

A tester si cela convient
Si OUI, je placerai les explications du code par la suite
J’ai repris les données du premier classeur en PJ

banque.xlsm (28,9 Ko)

Mimimathy,

C’est doublement impressionnant !

  • Premièrement parce que c’est exactement ce que je recherche.
  • Deuxièmement parce que j’ai jeté un oeil au code et que j’ai rien compris ! :slight_smile:

Cela me conforte dans l’idée qu’il faut que je me mette au VBA…
Du coup pour la communauté, peux tu partager l’explication du code ?

1000 Merci en tous cas !

Re,

Voici donc la macro avec ses explications

Option Explicit
'Déclaration des variables
Dim Wk As Worksheet, Ws As Worksheet, NewSheet As Worksheet
Dim exist As Boolean
Dim nom$, Onglet$
Dim i%, j%, Dl%, Lig%, Dte As Date, Piece$
Public Sub Essai()
  Application.ScreenUpdating = False 'déactive le rafraichissement d'écran
  Call Efface 'Exécute la macro Efface
  Set Ws = Sheets("Data") ' attribue la plage de recherche
  Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne A
    For i = 4 To Dl 'boucle de la ligne 4 à la dernière
      If Left(Ws.Cells(i, 2), 1) = 5 Then 'Si le premier chiffre est un 5
        Onglet = Ws.Cells(i, 2) ' Attribue à la variable Onglet la valeur de la cellule
        Call Feuille 'Exécute la macro Feuille pour savoir si la feuille existe, sinon elle se créée
        Lig = Sheets(Onglet).Range("A" & Rows.Count).End(xlUp).Row + 1 ' 1ère ligne vide de la feuille Onglet
        If Ws.Cells(i, 2).Text = nom Then 'Si le texte de la cellule colonne B est égale à la variable nom
          Ws.Activate 'j'active la feuille DATA
          Ws.Range(Cells(i, 1), Cells(i, 5)).Copy Sheets(Onglet).Cells(Lig, 1) 'et je copie dans la feuille Onglet la ligne (colonne A à E)
          Dte = Ws.Cells(i, 1) 'J'attribue à la variable Dte la valeur de la colonne A
          Piece = Ws.Cells(i, 3) 'J'attribue à la variable Piece la valeur de la colonne C
          For j = 4 To Dl 'je boucle de la ligne 4 à la derniere ligne
            If Left(Ws.Cells(j, 2), 1) <> 5 Then 'Si le premier chiffre n'est pas un 5
              If Ws.Cells(j, 1) = Dte And Ws.Cells(j, 3) = Piece Then 'si les cellules colonne A et colonne C sont égales à la ligne en cours
                Lig = Sheets(Onglet).Range("A" & Rows.Count).End(xlUp).Row + 1 'n° de la première ligne vide de la colonne A de la feuille Onglet
                Ws.Range(Cells(j, 1), Cells(j, 5)).Copy Sheets(Onglet).Cells(Lig, 1) 'et je copie dans la feuille Onglet la ligne (colonne A à E)
              End If
            End If
          Next j
        End If
      End If
      Sheets(Onglet).Columns("A:E").AutoFit 'Ajustement de la largeur des colonnes
    Next i
  End Sub
  
Sub Feuille() 'vérifie si l'onglet existe, sinon il se créé
nom = Onglet
exist = False 'attribue à la variable exist la valeur FAUX
For Each Wk In Worksheets 'boucle sur les onglets
    If Wk.Name = nom Then 'Si le nom de l'onglet est identique à la variable nom
        exist = True 'attribue à la variable exist la valeur VRAI
        Exit For 'Sort de la boucle, puisque la feuille existe
    End If
Next Wk
If exist = False Then 'Si la feuille n'exite pas
    With ThisWorkbook 'Avec ce classeur
        Set NewSheet = .Worksheets.Add(After:=.Sheets(.Sheets.Count)) 'Je créé une nouvelle feuille
    End With
    NewSheet.Name = nom 'je la nomme avec le nom de la variable Nom
    Set NewSheet = Nothing
End If
Ws.Range("A3:E3").Copy Sheets(nom).Cells(1, 1) 'Je copie dans la nouvelle feuille, la ligne d'entête de la feuille DATA
End Sub

Sub Efface() 'Efface les feuilles sauf la feuille 1 (DATA)
  Application.DisplayAlerts = False 'Je désactive les alertes
    For i = Sheets.Count To 2 Step -1 'je boucle sur toutes les feuilles de la plus grande à la feuille 2
      Sheets(i).Delete 'Je la supprime
    Next i
  Application.DisplayAlerts = True 'Je ré-active les alertes
End Sub

1 « J'aime »

:slight_smile:

Merci Mimimathy !

Je boucle avec mes 8000 lignes et te tiens au courant.

Bonjour Mimimathy,

J’ai bouclé avec mon fichier et tout semble parfaitement se dérouler.

J’ai cependant un dernier problème à résoudre :

Initialement dans mon fichier il y avait une colonne vide (colonne F), il s’agissait des intitulés de ligne.

J’ai essayé de modifier le code VBA en agrandissant la plage “copier-coller”

=> Ws.Range(Cells(i, 1), Cells(i, 5)).Copy Sheets(Onglet).Cells(Lig, 1) 'et je copie dans la feuille Onglet la ligne (colonne A à E)
=>> j’ai remplacé Cells(i, 5) par Cells(i, 6)

Lors du traitement j’ai bien l’intitulé qui se copie mais que 1 ligne sur 2… :frowning:
Tu sais pouvoir copier / coller les intituler systématiquement (sur toute les lignes) ?
J’ai une ligne VBA qui a du m’échapper.

Merci d’avance,
Stan

banque.xlsm (35,4 Ko)

Bonsoir,

Quand on ajoute une colonne, il faut ajouter la colonne partout dans le code

Je te laisse la vision de tes oublis, c’est comme cela qu’on avance :wink:

banque.xlsm (25,8 Ko)

Merci Mimimathy :slight_smile:

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.