Macro : classer des données sur differents onglets

ordaz75

XLDnaute Nouveau
Bonjour

J'ai une problématique sur mon fichier ci joint.

Dans mon onglet "base déclaré restitué" j'ai des lignes avec des données sur des clients et leurs immatriculations de véhicules. Sur cet onglet j’ai juste besoin d’inscrire les immatriculations et par le billet d’une formule je récupère toute les informations du client de l’onglet « mise en page déclaré ». Jusqu’à là tout va bien !

Ma problématique est que je dois classer ces clients par N° DE CONTRAT comme vous pouvez le voir sur l’onglet « base déclaré restitué » où il y figure un exemple avec différents client.

Pour dissocier le type de client c’est simple les contrats à plus de 7 chiffres sont des clients à insérer dans l’onglet « declaré restitué petit compte » et les autres dans l’onglet « déclaré restitué grand compte »

Pour cela sur mon onglet « base declaré restitué » j’aimerais ajouter un bouton qui permettrait d’ajouter les clients avec leurs données dans l’onglet leur correspondant, de remettre la feuille vierge de donnée et ce même bouton lancerais aussi automatiquement l’impression donc des onglets « déclaré restitué petit compte » et « déclaré restitué grand compte »

Merci de votre aide je n’y arrive point….

Fichier ci joint
 

Pièces jointes

  • Copie de COMPIL OK.xlsm
    81.9 KB · Affichages: 36

Modeste

XLDnaute Barbatruc
Re : Macro : classer des données sur differents onglets

Bonjour ordaz75,

Je ne suis pas certain que ce soit bien clair: tu encodes dans la feuille "Base déclaré restitué" des données que tu vas ensuite dispatcher dans deux autres feuilles, pour ensuite effacer le contenu de "Base déclaré restitué"?

Euh ... et pourquoi ne pas simplement encoder directement dans les feuilles petits comptes ou grand comptes :confused:
 

ordaz75

XLDnaute Nouveau
Re : Macro : classer des données sur differents onglets

Salut Modeste

Oui sa aurait été plus simple d'encoder directement dans les feuilles petit compte ou grand compte c'est la première idée que j'ai eu mais par rapport au processus je ne peux pas procéder ainsi...
 

Modeste

XLDnaute Barbatruc
Re : Macro : classer des données sur differents onglets

Re,

Et si tu nous "plantais un peu le décor"?

Par exemple, à quoi peut bien servir la feuille "mise en page déclaré"? Uniquement à remettre dans un ordre différent les colonnes de la feuille "Historique" ... pour qu'ensuite les RECHERCHEV puissent trouver l'immatriculation dans la colonne la plus à gauche??

Et la feuille "Saisie", quelle est sa particularité, par rapport à la feuille "Base déclaré restitué"? Les colonnes sont encore les mêmes ... mais pas ce que tu y encodes? Sinon ça fait un peu double encodage!?

Dans cette feuille "Base déclaré restitué", tu encoderais toute une liste de véhicules, avant de les répartir ... ou tu envisages de le faire au fur et à mesure, un véhicule à la fois (ce qui permettrait l'un ou l'autre contrôle, le cas échéant)?

Ne vas pas imaginer que je fasse durer les choses par plaisir, mais autant allumer la lumière avant d'emprunter l'escalier d'une cave qu'on ne connaît pas ;)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro : classer des données sur differents onglets

Bonjour le fil, bonjour le forum,

Je me suis même pas poser la question pour l'encodage, j'ai carrément effacé les formules des onglets Petit et Grand Compte...
Le code :

Code:
Private Sub CommandButton1_Click()
Dim S As Object 'déclare la variable S (onglet Source)
Dim PC As Object 'déclare la variable PC (onglet Petit Compte)
Dim GC As Object 'déclare la variable GC (onglet Grand Compte)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set S = Sheets("Base déclaré restitué ") 'définit l'onglet S [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set PC = Sheets("déclaré restitué petit cpte ") 'définit l'onglet PC [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set GC = Sheets("déclaré restitué grand cpte") 'définit l'onglet GC
DL = S.Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne éditée DL de á colonne 3 (=C) de l'onglet S
Set PL = S.Range("C12:C" & DL) 'définit la palge PL
For Each CEL In PL 'boucle sur toutes les cellule CEL de la palge PL
    If Len(CEL.Value) > 7 Then 'condition : si le nombre de caractères de la cellule CEL est supérieur à 7
        Set DEST = PC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    Else 'sinon
        Set DEST = GC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    End If 'fin de la condition
    CEL.Resize(1, 6).Copy
    DEST.PasteSpecial (xlPasteValues) 'copie la cellule CEL redimensionnée à 6 colonnes et la colle dans DEST
Next CEL 'prochaine cellule de la boucle
S.Range("B12:H" * Application.Rows.Count).ClearContents 'efface le contenue des données de l'onglet S
PC.Select 'sélectionne l'onglet PC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
GC.Select 'sélectionne l'onglet GC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
S.Select 'sélectionne l'onglet S (vierge)
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
N'ayant pas d'imprimante chez moi je n'ai pas testé la partie impression, j'ai recopié ce que donnait l'enregistreur de macro...

J'espère que je me suis pas vautré la gueu... dans l'escalier de la cave. Mais en principe c'est pour remonter, bourré que je me vautre...
Le fichier :
 

Pièces jointes

  • Ordaz_v01.xlsm
    96.5 KB · Affichages: 37

ordaz75

XLDnaute Nouveau
Re : Macro : classer des données sur differents onglets

En ce qui concerne l'onglet base déclaré restitué c'est exactement ton explication.

Pour le processus je vais te résumer la chose. Je réceptionne des dossiers avec des infos que je saisie dans mon onglet "saisie". Cet onglet me permet d'effectuer le "relevé cg" "l'attestation" et avoir un historique des véhicules saisie.

Suite a sa je traite les dossiers de A a Z avec differents process. Un à deux mois plus tard je les récupères pour effectuer le fameux déclaré restitué qui se distingue en grand et petit compte.

D’où pour quoi j'ai crée un onglet base déclaré restitué qui me chope mes infos avec les immatriculations saisie et tout cela via mon historique, il ne me manquerait plus qu'a les dispatcher et imprimer donc
 

Modeste

XLDnaute Barbatruc
Re : Macro : classer des données sur differents onglets

Re²,
Salut Robert :)
Salut Robert,
C'est exactement cela que je veux merci beaucoup, par contre ta macro me dispatch bien les petits compte mais sur mon onglet grand compte rien apparait :(
Ah ça, c'est ce qui arrive quand on envoie Robert à la cave, avant, pendant ou après l'heure du repas :p: il remonte des trucs qu'on n'a pas demandés et il oublie pourquoi il est descendu ;)

[Edit:] Pour éviter les feuilles non-indispensables, on peut utiliser directement cette formule en B12 de la feuille "Base déclaré restitué":
Code:
=SI($D12="";"";INDEX(Historiq.!$A$2:$G$5000;EQUIV('Base déclaré restitué '!$D12;Historiq.!$C$2:$C$5000;0);EQUIV('Base déclaré restitué '!B$11;Historiq.!$A$1:$G$1;0)))
... à recopier vers le bas et vers la droite (sauf en colonne D, bien sûr). "Historique" peut ensuite être supprimée.
Comme ça j'aurai apporté ma petite contribution!
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro : classer des données sur differents onglets

Bonjour le fil, bonjour le forum,

Bon, ça y est, j'ai cuvé...
Je pense que le problème venait du fait que la colonne B n'était pas bien "nettoyée" car les données étaient copiées mais en bas du tableau. En pièce jointe la version 2...
Le code :

Code:
Private Sub CommandButton1_Click()
Dim S As Object 'déclare la variable S (onglet Source)
Dim PC As Object 'déclare la variable PC (onglet Petit Compte)
Dim GC As Object 'déclare la variable GC (onglet Grand Compte)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

ActiveCell.Select 'enlève le focus au bouton
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set S = Sheets("Base déclaré restitué ") 'définit l'onglet S [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set PC = Sheets("déclaré restitué petit cpte ") 'définit l'onglet PC [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set GC = Sheets("déclaré restitué grand cpte") 'définit l'onglet GC
'condition : si "oui" au message
If MsgBox("Voulez-vous effacer les anciennes données des onglets Petits et Grands Comptes ?", vbYesNo) = vbYes Then
    PC.Range("B12:H47").ClearContents 'efface les anciennes données de l'onglet Petit Compte
    GC.Range("B12:H47").ClearContents 'efface les anciennes données de l'onglet Grand Compte
End If 'fin de la condition
DL = S.Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne éditée DL de á colonne 3 (=C) de l'onglet S
Set PL = S.Range("C12:C" & DL) 'définit la palge PL
For Each CEL In PL 'boucle sur toutes les cellule CEL de la palge PL
    If Len(CEL.Value) > 7 Then 'condition : si le nombre de caractères de la cellule CEL est supérieur à 7
        Set DEST = PC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    Else 'sinon
        Set DEST = GC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    End If 'fin de la condition
    CEL.Offset(0, -1).Resize(1, 6).Copy
    DEST.PasteSpecial (xlPasteValues) 'copie la cellule CEL redimensionnée à 6 colonnes et la colle dans DEST
Next CEL 'prochaine cellule de la boucle
Application.CutCopyMode = False 'supprime le clignotement des celllues copiées
S.Range("B12:H" * Application.Rows.Count).ClearContents 'efface le contenue des données de l'onglet S
PC.Select 'sélectionne l'onglet PC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
GC.Select 'sélectionne l'onglet GC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
S.Select 'sélectionne l'onglet S (vierge)
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Le fichier :
 

Pièces jointes

  • Ordaz_v02.xlsm
    96.4 KB · Affichages: 38

ordaz75

XLDnaute Nouveau
Re : Macro : classer des données sur differents onglets

Merci Robert pour ton aide, mais j'ai toujours une erreur sur la macro. Je te joins un imprime écran

Par ailleurs lorsque je lance la macro la colonne "commentaire", n'est pas dispatcher sur les onglets.


compil .jpg
 

Modeste

XLDnaute Barbatruc
Re : Macro : classer des données sur differents onglets

Re²,

Dans l'escalier de la cave, soit Robert est retombé (en y mettant beaucoup de bonne volonté), soit il est redescendu de son plein gré (et on ne le reverra que demain ... au mieux!) :p


Il y a une erreur, à la ligne surlignée en jaune: remplace '*' par '&' (sans les apostrophes!)

Pour garder les commentaires remplace le 6 par un 7 dans l'instruction
Code:
CEL.Offset(0, -1).Resize(1, 6).Copy
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro : classer des données sur differents onglets

Bonjour le fil, bonjour le forum,

Bon Ok j'avoue ! Je suis redescendu à la cave... Je ne vais pas envoyer une v03 puisque Modeste à déjà vu et corrigé les erreurs de la v02... Mais je m'en fous, je me vengerai...
 

ordaz75

XLDnaute Nouveau
Re : Macro : classer des données sur differents onglets

Merci Robert & Modeste j'ai rectifié le code erroné.

Une dernière modification et sa sera le top pour moi. :D Lors de l'effacement de mes données dans la feuille "base déclaré restitué" je veux juste que ce soit la colonne D de cet onglet qui soit effacé car si toute les cellules de cet onglet sont effacé je perds toute les formules inséré pour la recherche vertical via cet page.

Par contre a chaque nouvelle saisie de donnée dans la "base déclaré restitué" j'aimerais que les données s'efface des onglets grand compte et petit compte a l'apparition de la boite de dialogue "Voulez vous effacer les anciennes données des onglets Grands et petits compte?".
Puisque lorsque je clique sur le bouton dispatcher les données, le code me mets des lignes a la suite sans effacer les précédentes dans ces onglets.

Apres cela sera tout pour moi et je pourrais hiberner a la cave avec mon fichier :p
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro : classer des données sur differents onglets

Bonjour le fil, bonjour le forum,

Bon finalement, il fallait la v03... La voici !
Le code :

Code:
Private Sub CommandButton1_Click()
Dim S As Object 'déclare la variable S (onglet Source)
Dim PC As Object 'déclare la variable PC (onglet Petit Compte)
Dim GC As Object 'déclare la variable GC (onglet Grand Compte)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

ActiveCell.Select 'enlève le focus au bouton
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set S = Sheets("Base déclaré restitué ") 'définit l'onglet S [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set PC = Sheets("déclaré restitué petit cpte ") 'définit l'onglet PC [ATTENTION ! IL Y A UN ESPACE À LA FIN DANS TON FICHIER EXEMPLE]
Set GC = Sheets("déclaré restitué grand cpte") 'définit l'onglet GC
'condition : si "oui" au message
If MsgBox("Voulez-vous effacer les anciennes données des onglets Petits et Grands Comptes ?", vbYesNo) = vbYes Then
    PC.Range("B12:H47").ClearContents 'efface les anciennes données de l'onglet Petit Compte
    GC.Range("B12:H47").ClearContents 'efface les anciennes données de l'onglet Grand Compte
End If 'fin de la condition
DL = S.Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne éditée DL de á colonne 3 (=C) de l'onglet S
Set PL = S.Range("C12:C" & DL) 'définit la palge PL
For Each CEL In PL 'boucle sur toutes les cellule CEL de la palge PL
    If Len(CEL.Value) > 7 Then 'condition : si le nombre de caractères de la cellule CEL est supérieur à 7
        Set DEST = PC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    Else 'sinon
        Set DEST = GC.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
    End If 'fin de la condition
    CEL.Offset(0, -1).Resize(1, 7).Copy
    DEST.PasteSpecial (xlPasteValues) 'copie la cellule CEL redimensionnée à 6 colonnes et la colle dans DEST
Next CEL 'prochaine cellule de la boucle
Application.CutCopyMode = False 'supprime le clignotement des celllues copiées
S.Range("D12:D" & Application.Rows.Count).ClearContents 'efface le contenue de la colonne D de l'onglet S
PC.Select 'sélectionne l'onglet PC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
GC.Select 'sélectionne l'onglet GC
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False 'imprime l'onglet
S.Select 'sélectionne l'onglet S (vierge)
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Heu Ordaz... Est-ce que tu lis les commentaires que je m'efforce de mettre dans le code ? Parce que sinon je ressors de violon de mon grand-père et j'y urine allègerment dedans. Ne t'inquiète pas il l'avait acheté pour ça...
 

ordaz75

XLDnaute Nouveau
Re : Macro : classer des données sur differents onglets

Robert merci pour la correction du code !

Tu n'avais pas besoin de ressorti le violon pour le coup j'y suis parvenu de moi même via tes commentaires justement.

Merci beaucoup de ton aide
 

Discussions similaires

Statistiques des forums

Discussions
312 113
Messages
2 085 426
Membres
102 888
dernier inscrit
medoit