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”
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.
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 !
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
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…
Tu sais pouvoir copier / coller les intituler systématiquement (sur toute les lignes) ?
J’ai une ligne VBA qui a du m’échapper.