IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Tableaux structurés: supprimer les données mais garder toutes les formules et mises en formes conditionnelles [XL-2016]


Sujet :

Excel

  1. #1
    Membre confirmé
    Profil pro
    Eleveur caprin
    Inscrit en
    Juillet 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Eleveur caprin

    Informations forums :
    Inscription : Juillet 2007
    Messages : 146
    Par défaut Tableaux structurés: supprimer les données mais garder toutes les formules et mises en formes conditionnelles
    Bonjour,

    D'abord je tenais à vous dire merci pour tout ce que vous faites pour nous, "petit novice"

    J'ai un tableau structuré de la colonne A à CB sur environ 300 à plus en fonction des années. Chaque année, je suis obligé d'effacer manuellement toutes les données du tableaux pour repartir à zéro mais malgré cela , plusieurs problèmes se posent:

    1- quand je supprime manuellement toutes les données de mon tableau de l'onglet VE, lorsque j'enregistre ma facture (onglet FACTURE) via un bouton avec le code suivant, ma facture s'enregistre bien mais pas dans la première ligne de mon tableau structuré mais en dessous, du coup ma ligne ne fait pas parti de mon tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Sub VALIDER()
     
        Dim Titres(), Dic As New Dictionary, c As Long, TFact(), L As Long, TRés(), item
        Titres = Feuil4.[A2:BJ2].Value    'fait correspondre entêtes de VE avec produits Feuil2
        TFact = Feuil1.[A12:J44].Value
     
        ReDim TRés(1 To 1, 1 To UBound(Titres, 2))
        TRés(1, 1) = TFact(1, 4)    'n° de facture
        TRés(1, 2) = TFact(1, 1)    'date
        TRés(1, 3) = TFact(1, 5)    ' N° client
        TRés(1, 4) = NomClient(TFact(1, 5))    ' Nom client
        TRés(1, 5) = TFact(31, 10)    ' TTC
        TRés(1, 6) = TFact(29, 10)    'HT
        TRés(1, 7) = TFact(30, 5)    'TVA 5.5%
        TRés(1, 8) = TFact(31, 5)    'TVA 7%
        TRés(1, 9) = TFact(32, 5)    'TVA 10%
        TRés(1, 10) = TFact(33, 5)    'TVA 20%
     
        For c = 11 To 61   'produits ligne 2 VE
            For L = 4 To 27    'lignes 15 to 38 de factures
                If TFact(L, 2) = Titres(1, c) Then
                    TRés(1, c) = TRés(1, c) + TFact(L, 10)
                End If
            Next
        Next c
     
        Feuil4.Cells(&H100000, 1).End(xlUp).Offset(1).Resize(, 61).Value = TRés
     
     
        'Déclaration des variables
        Dim NomDossier As String
        Dim CheminDossier As String
     
        On Error GoTo 1
     
        'Nom de dossier
         NomDossier = Application.InputBox("Dossier Enregistrement :", "Dossier")
        CheminDossier = "H:\COMPTABILITE\Factures VE\" & NomDossier & "\"
     
        If NomDossier = "" Then Exit Sub
     
        'Enregistrement au format PDF
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        CheminDossier & "Facture_" & Range("J1").Value & ".pdf", quality:= _
        xlQualityStandard, includedocproperties:=True, ignoreprintareas:=False, _
        from:=1, To:=1, openafterpublish:=False
     
    1
     
        MsgBox "Facture " & Range("J1").Value & " archivée avec succès."
     
     
        Dim N
     
        N = Right(Range("J1").Value, 5)
     
        'On incrémente le numéro de la facture
        Range("J1").Value = Range("J1").Value + 1
     
        Range("J43").Select
        Selection.ClearContents
     
        Range("H6").Select
     
     
    End Sub
    2- Lors du premier enregistrement de la facture , si je crée une ligne vide avec une facture 0 au préalable ( pour paré à mon problème 1), l'enregistrement de ma facture 1 se fait bien dans le tableau mais une de mes formules change et fausse toute la colonne sauf si je la corrige manuellement.

    La formule de basse, présente dans la ligne facture 0 :
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(SOMME($G3:$J3)=0;"";INDEX(ListeDesTaux;1;EQUIV(GRANDE.VALEUR($G3:$J3;1);$G3:$J3;0)))
    Mais lors de l'enregistrement de la facture suivante, elle passe à :
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(SOMME($G4:$J5)=0;"";INDEX(ListeDesTaux;1;EQUIV(GRANDE.VALEUR($G4:$J5;1);$G4:$J5;0)))
    Je ne comprends pas pourquoi "ligne 5" alors que c'est la ligne 4 qui est concernée.

    Si je corrige manuellement, plus aucun problème pour les lignes suivantes, mais rebelotte l'année suivante.

    J'ai beau chercher mais je ne trouve pas de solution définitive à l'un ou l'autre de mes problèmes. Auriez vous une idée? Où est ce que je me suis trompée?

    Merci par avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    1- quand je supprime manuellement toutes les données de mon tableau de l'onglet VE, lorsque j'enregistre ma facture (onglet FACTURE) via un bouton avec le code suivant, ma facture s'enregistre bien mais pas dans la première ligne de mon tableau structuré mais en dessous, du coup ma ligne ne fait pas parti de mon tableau.
    Un exemple de la suppression de toutes les lignes de données du tableau nommé t_Article. Il y a d'autres méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub ClearTable()
     With Range("t_Article")
      If .ListObject.ListRows.Count Then .Delete
     End With
    End Sub
    [EDIT]
    Pour lire la valeur contenue dans la cellule de la première ligne de la colonne nommée Ref de la table nommée t_Article. Il y a d'autres méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Range("t_Article")
       MsgBox .Cells(1, .ListObject.ListColumns("Ref").Index).Value
    End With
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Profil pro
    Eleveur caprin
    Inscrit en
    Juillet 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Eleveur caprin

    Informations forums :
    Inscription : Juillet 2007
    Messages : 146
    Par défaut
    Merci Phillipe pour votre réponse rapide.

    Pour ce qui est du premier code, il marche nickel, mais il me supprime la première ligne de données que je veux garder (pour éviter que ma facture ne s'enregistre en dehors du tableau lors du clic bouton "Valider". Comment la garder?

    Pour le deuxième code, j'avouerai que je n'ai pas saisie sa fonction. Désolée.

    Merci par avance.

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 562
    Par défaut
    Bonjour à tous

    Il ya une règle dans EXcel (pas seulement) : ne pas utiliser un tableau, puis le vider pour une nouvelle utilisation.

    Créer un modèle xltx ou xltm prêt à l'emploi, et l’utiliser pour créer un document qui, une fois rempli,sera jeté ou archivé et repartir du modèle pour une nouvelle utilisation

    A noter que dans les tableaux structurés la 1ère ligne, même pas encore remplie, conserve les formats, MFC et Validation de données définis

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Salut sweetty,
    Pour le deuxième code, j'avouerai que je n'ai pas saisie sa fonction. Désolée.
    C'est juste un exemple pour te montrer comment récupérer la valeur d'une cellule dans un tableau structuré. .ListObject.ListColumns("Ref").Index renvoie l'indice numérique de la colonne dont le titre est "Ref".
    Les tableaux structurés te permettent aussi de rajouter des lignes sans te préoccuper ni de l'emplacement , ni du nombre de ligne que contient le dis tableau. Si l'on prends pour exemple un tableau "Tableau1" tu peux ajouter une ligne simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        Sub TestAddRow(TS As String, Values)
        Dim lstO As ListObject
        Dim lstR As ListRow
        ' // Values peut être un Objet Plage, ou un Tableau
        ' Values = Worksheets("feuil6").Range("H7:L7").Value
        ' Values(1, 1) = "..."
        ' Values(1, 2) = "..."
        ' etc..
        ' Values = VBA.Array(15, "Français", "Jean", "Dupont", "8 Rue des Lilas")
     
        Set lstO = Range(TS).ListObject
        If Not lstO Is Nothing Then ' // Si le tableau existe bien alors on ajoute une ligne
            Set lstR = lstO.ListRows.Add ' // On peut spécifier la position de la ligne par défaut en bas du tableau
            'Si tu configures bien le tableau (Value) tu peux écrire directement toute la ligne
            lstR.Range = Values
            ' // Ou bien seulement sur une colonnes
            'lstR.Range(lstO.ListColumns("Ref").Index).Value = Values
        End If
     End Sub
    Tu as aussi la possibilité de faire une boucle pour charger le tableau, voici une sub de Pierre Fauconnier que je trouve très pratique (je l'ai modifiée pour mes besoins personnels) pour faire la liaison entre le tableau et les contrôles d'un formulaire
    La description est ici : AJouter une ligne dans un tableau structuré et y placer des valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    ' // AddRow By Pierre Fauconnier le : 23/02/2022
    ' // Ajoute une ligne dans un tableau structuré et la remplie avec les valeurs passées en Array
    Function AddRow(TS As Range, Values, Optional Position As Long)
        Dim lobjListRow As ListRow
        Dim lobjTable As ListObject
        Dim lCounter As Long
     
        On Error GoTo AddRow_Error
     
        Set lobjTable = TS.ListObject
        If Not lobjTable Is Nothing Then
     
            If Position = 0 Or Position > lobjTable.ListRows.Count Then Position = lobjTable.ListRows.Count + 1
            Set lobjListRow = lobjTable.ListRows.Add(Position)
            For lCounter = LBound(Values) To UBound(Values) Step 2
                lobjListRow.Range(lobjTable.ListColumns(Values(lCounter)).Index).Value = Values(lCounter + 1)
            Next
     
            AddRow = -1                                                                   ' // Si tout va bien...
        Else
     
            AddRow = -2                                                                   ' // Erreur tableau non défini
        End If
     
    AddRow_Exit:
        If Not lobjListRow Is Nothing Then Set lobjListRow = Nothing
        If Not lobjTable Is Nothing Then Set lobjTable = Nothing
        Exit Function
     
    AddRow_Error:
         AddRow = Err.Number                                                               ' // Si erreur on renvoie le numéro de l'erreur
        Resume AddRow_Exit
     
    End Function
    Et pour l'appel tu peux soit passer les infos en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddRow Range("Tableau3"), VBA.Array("ID", 21, "Origine", "Français", "Prénom", "Yves","Nom", "Lafayette", "Adresse", "11 Impasse Gustave Lambert")
    Soit par les valeurs des contrôles du UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddRow Range("Tableau3"), VBA.Array("ID", txtId, "Origine", txtOrigine, "Prénom", txtPrenom, "Nom", txtNom, "Adresse", txtAdresse)
    Voilà bonne prog.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.


    Merci @Valtrase de m'avoir cité dans ta réponse ( ), mais je veux préciser ici que je n'ai jamais mis un Exit Sub dans ma fonction. Donc, OK pour l'idée, mais NOK pour la mise en place avec un EXIT SUB...


    Comme 78Chris le précise, un tableau structuré garde les formules et les MFC lorsqu'on le vide.


    Il faut bien entendu apprécier mes propos en fonction de l'utilisation de ton classeur, mais je pense aussi qui ton tableau ne devrait pas être vidé chaque année. Il devrait contenir les données de toutes tes années d'exploitation.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Salut à tous
    Merci @Valtrase de m'avoir cité dans ta réponse ( ), mais je veux préciser ici que je n'ai jamais mis un Exit Sub dans ma fonction. Donc, OK pour l'idée, mais NOK pour la mise en place avec un EXIT SUB...
    Bonjour Pierre,
    Oui je sais que vous n'êtes pas fan du tout, des Exit Sub ou Fonction. C'est pour cela que j'ai spécifié l'avoir modifiée pour mes besoins personnels et que j'ai mis le lien de l'original en dessous. En fait c'est la proposition de gestion d'erreur de MZ-Tools que j'ai juste adapté. Dans ma version j'ai en plus une écriture sur une Feuille ou dans un fichier, du suivis des erreurs.

    Je profite de l'occasion pour vous remercier de vos cours et tutos qui sont pout des débutants comme moi une source d'inspiration.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Comment gérer les priorités de mise en forme conditionnelle dans un programme VBA
    Par Alain777 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/04/2015, 22h26
  2. Réponses: 16
    Dernier message: 11/12/2013, 11h20
  3. Insérer une ligne en recopiant les formules et mise en forme
    Par mogo107 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2013, 22h05
  4. Réponses: 2
    Dernier message: 28/02/2010, 18h34
  5. Supprimer les résidus de mises à jour ?
    Par byloute dans le forum Windows Vista
    Réponses: 0
    Dernier message: 06/04/2009, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo