Microsoft 365 VBA - Rapport simplifié selon réponses questions

thecrabe7887

XLDnaute Nouveau
Bonjour,

Dans l'onglet rapport, j'ai ajouté 2 boutons "Actualiser" et "Effacer".
Je souhaiterais que le bouton "Actualiser" puisse :
- selon onglet "Audit" et que la valeur en colonne A = 1
- reprendre les éléments des colonnes H à M de l'onglet "Audit" sur l'onglet "Rapport" dans les colonnes E à J
- masquer (ou supprimer) les éléments des lignes où la valeur en colonne A = 0

Je souhaiterais que le bouton "Effacer" puisse remettre le rapport en version "vierge" :
- avec les colonnes B à D complétées en par défaut
- les colonnes E à J seront vierges

Sauf que cela ne fonctionne pas :(

Pourriez-vous m'aider à corriger mes macros ?

Bonne journée
 

Pièces jointes

  • Doc test.xlsm
    40 KB · Affichages: 11

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le Crabe, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :

VB:
Option Explicit 'oblige à déclarer toutes les variables
Private OS As Worksheet 'déclare la variable OS (Onglet Source)
Private TS As ListObject 'déclare la variable TS (Tableau Source)
Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
Private TD As ListObject 'déclare la variable TD (Tableau Destination)

Sub Actualiser()
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim I As Integer 'déclare la variable I (Incrément)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Call Effacer 'lance la procédure [Effacer]
Set OS = Worksheets("Audit") 'définit l'onglet OS
Set TS = OS.ListObjects("Tableau") 'définit la tableau stucturé TS
Set OD = Worksheets("Rapport") 'définit l'onglet OD
Set TD = OD.ListObjects("Tableau3") 'définit la tableau stucturé TD
For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du TS
    'condition "si la cellule ligne I plus ligne des en-têtes de TS, colonne A de l'onglet OS est égale à 1
    If OS.Cells(I + TS.HeaderRowRange.Row, "A") = 1 Then
        Set R = TD.ListColumns(4).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 4 de TD)
        If R Is Nothing Or TD.ListRows.Count = 0 Then 'si aucune occurrence n'est trouvée ou si TD ne contient pas encore de ligne
            TD.ListRows.Add 'ajoute une ligne à TD
            LI = TD.ListRows.Count 'définit la ligne LI (dernière ligne de TD)
        Else 'sinon (au moins une occurrence est trouvé)
            LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée mois la ligne des en-têtes de TD)
        End If 'fin de la condition
        'récupères dans la ligne LI colonnes 4 à 9 de TD, les données lignes 7 à 12 de TS
        TD.DataBodyRange(LI, 4).Resize(1, 6).Value = TS.DataBodyRange(I, 7).Resize(1, 6).Value
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Sub Effacer()
Dim I As Byte 'déclare la variable I (Incrément)

Set OD = Worksheets("Rapport") 'définit l'onglet OD
Set TD = OD.ListObjects("Tableau3") 'définit la tableau stucturé TD
For I = 4 To 9 'boucle sur les colonne 4 à 9
    TD.DataBodyRange.Columns(I).ClearContents 'efface dans TD les données de la colonne de la boucle
Next I 'prochaine colonne de la boucle
End Sub
Le fichier :
 

Pièces jointes

  • TheCrabe_ED_v01.xlsm
    39.1 KB · Affichages: 8

thecrabe7887

XLDnaute Nouveau
Bonjour,
Merci beaucoup pour cette aide et désolée j'étais persuadée d'avoir répondu :(
Je remarque une coquille que je n'arrive pas à résoudre. Si la colonne A du tableau source =0, la ligne devrait pouvoir être masquée dans le tableau destination.
Ainsi, si par exemple la ligne 8 du TS a sa colonne A = 0 et la ligne 9 du TS a sa colonne A = 1, alors :
- la ligne 8 totale du TD sera masquée
- les éléments des colonnes 4 à 9 de la ligne 9 du TS seront remontées sur la ligne 9 du TD (actuellement remontent en ligne 8)
 

Discussions similaires