XL 2016 Vba liste de données

ZZ59264

XLDnaute Occasionnel
Bonjour à tous,

Alors je vais d'être le plus clair possible, enfin essayer de l'être lol

Sur le fichier joint, il y a un onglet "ET", sur celui il y des sources de liste de données réparties sur tout le fichier, (une liste de données correspond à un et un seul onglet),

Il y a que deux choix possible sur ces listes de données, soit une référence, soit le libelle "A Faire",

Les autres feuilles qui n'ont pas de liste de données ont une référence notée Réf:XX (en dur) alors que les feuilles qui ont une liste on dans une cellule le libelle Réf et la cellule d'à coté la liste de données,

Ma question est de savoir s'il est possible par un code VBA (que je mettrai via un bouton macro sur l'onglet "ET") de passer toutes les feuilles ayant une liste de données au statut "A Faire"?

Je n'ai aucune idée de la façon de procéder, (peut être une boucle qui parcourrait toutes les feuilles du fichier, et de lui indiquer que s'il trouve "Réf:" de mettre "A Faire" dans la cellule à coté), merci donc à tous ceux qui contribueront à la résolution de ce post,

Cordialement,
 

Pièces jointes

  • Forum liste de données.xlsm
    333.1 KB · Affichages: 1
Dernière édition:
Solution
Bonjour Cp4, merci beaucoup pour ton code,

N'ayant qu'une seule ligne de validation de données par feuille, j'ai lu qu'on pouvait utilisé :

VB:
c.Validation.Type

au lieu de

Code:
c.SpecialCells(xlCellTypeSameValidation).Count

ce qui permettrai la macro de s’exécutait plus rapidement, j'ai donc modifier ta proposition comme ceci :

Code:
VB:

Option Explicit
Sub test()
    Dim Sh As Worksheet, c As Range, lngValidation As Long

    For Each Sh In Worksheets
        If Sh.Name <> "ET" Then
            With Sh
                For Each c In .UsedRange
                    lngValidation = 0
                    On Error Resume Next
                    lngValidation = c.Validation.Type
                    On Error GoTo 0...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour ZZ,
Pas sur d'avoir tout compris; En PJ un essai.
la liste des feuilles en lignes 1 et 2 est réinitialisée, puis reconstruite avec tous les onglets où "A faire" est présent. Avec :
VB:
Sub Afaire()
    Dim Colonne%, F
    [AU1:CZ2].ClearContents
    Colonne = 47
    For Each F In Worksheets
        If F.Name <> "ET" And Application.CountIf(Sheets(F.Name).Range("A1:BB1000"), "A faire") > 0 Then
            Cells(1, Colonne) = F.Name
            Cells(2, Colonne) = "A faire"
            Colonne = Colonne + 1
        End If
    Next F
End Sub
 

Pièces jointes

  • Forum liste de données.xlsm
    339.5 KB · Affichages: 6

ZZ59264

XLDnaute Occasionnel
Bonjour ZZ,
Pas sur d'avoir tout compris; En PJ un essai.
la liste des feuilles en lignes 1 et 2 est réinitialisée, puis reconstruite avec tous les onglets où "A faire" est présent. Avec :
VB:
Sub Afaire()
    Dim Colonne%, F
    [AU1:CZ2].ClearContents
    Colonne = 47
    For Each F In Worksheets
        If F.Name <> "ET" And Application.CountIf(Sheets(F.Name).Range("A1:BB1000"), "A faire") > 0 Then
            Cells(1, Colonne) = F.Name
            Cells(2, Colonne) = "A faire"
            Colonne = Colonne + 1
        End If
    Next F
End Sub
Bonjour Sylvanu,

Tout d'abord merci pour votre retour,

Et oui effectivement mes explications n'ont pas été comprises,

La macro doit passer chaque feuille possédant une liste de données en statut "A Faire" lors de l'exécution de celle-ci, d’où mon approche par une macro qui détecterait le mot "Réf:" sur chaque onglet du fichier, et indiquerait le statut " A Faire" sur la cellule d'a coté,

En résumé, je souhaiterai via une macro remettre le statut à faire sur toutes les feuilles ou il y a une liste de données (car ce sont celle que je dois travaillées),

Je ne souhaite pas modifier l'onglet "ET", celui ci sert a définir les listes de données présentes sur les autres onglets (ou pas car il y a des onglets ou il n'y a pas de liste de données),

En espérant vous avoir éclairé sur l'objectif à atteindre,

Cordialement,
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Désolé, toujours pas saisi. Ce que j'ai compris :

On parcourt toutes les feuilles à la recherche de "Ref:".
Si trouvé alors on regarde si la cellule à droite comporte une Ref présente en ET ligne1. Si oui, on recopie l'état de ET ligne 2 dans cette cellule ?

Vous aurez un souci avec votre fichier, certaines feuilles ont Ref: et à coté une référence, d'autres feuilles ont dans une cellule Ref : A4, la recherche aura du mal à suivre.
Dans la feuille Suspens, vous avez Ref: mais avec des cellules fusionnées. Comment le gérer, puisu'à droite de Ref c'est encore fusionnées.
 

ZZ59264

XLDnaute Occasionnel
Désolé, toujours pas saisi. Ce que j'ai compris :

On parcourt toutes les feuilles à la recherche de "Ref:".
Si trouvé alors on regarde si la cellule à droite comporte une Ref présente en ET ligne1. Si oui, on recopie l'état de ET ligne 2 dans cette cellule ?

Vous aurez un souci avec votre fichier, certaines feuilles ont Ref: et à coté une référence, d'autres feuilles ont dans une cellule Ref : A4, la recherche aura du mal à suivre.
Dans la feuille Suspens, vous avez Ref: mais avec des cellules fusionnées. Comment le gérer, puisu'à droite de Ref c'est encore fusionnées.
Bonsoir,

Désolé, alors oui on parcourt toutes les feuilles à la recherche de "Réf:" car ce sont celles qui ont une liste de données à la droite de la cellule "Réf:"

La cellule de droite par la validation des données ne permet que deux choix : soit A1.... ou "A Faire"

Désolé pour la feuille Suspens, je l'ai modifié et rejointe, elle recevra la mention "Ref:pT"

Oui il y a donc en résumé deux types de feuilles :

-celles qui ont "Réf:"&un statut déjà inscrit en dur comme par exemple "Réf:A3", celles ci n'ont pas de liste de données et il n'y aura rien a faire,

- et celles qui ont Réf: dans une cellule et dans la cellule à coté deux choix possibles : A1 par exemple, mais le second choix sera "A Faire"

Je souhaite donc par une macro qui permet donc d'identifier ces feuilles qui ont "Réf:" dans une cellule et indiquer dans la cellule d'a coté (donc celle qui reçoit une liste de données) le statut "A Faire",

J'espère avoir été plus clair sur ma demande, en fait chaque année, je voudrais remettre le statut "A Faire" sur les feuilles que je dois travaillées, au lieu de le faire manuellement (ayant plusieurs fichiers de ce type),

Merci d'avance pour votre aide,

Cordialement,
 

Pièces jointes

  • Forum liste de données.xlsm
    333.1 KB · Affichages: 3

cp4

XLDnaute Barbatruc
Bonsoir,

Désolé, alors oui on parcourt toutes les feuilles à la recherche de "Réf:" car ce sont celles qui ont une liste de données à la droite de la cellule "Réf:"

La cellule de droite par la validation des données ne permet que deux choix : soit A1.... ou "A Faire"

Désolé pour la feuille Suspens, je l'ai modifié et rejointe, elle recevra la mention "Ref:pT"

Oui il y a donc en résumé deux types de feuilles :

-celles qui ont "Réf:"&un statut déjà inscrit en dur comme par exemple "Réf:A3", celles ci n'ont pas de liste de données et il n'y aura rien a faire,

- et celles qui ont Réf: dans une cellule et dans la cellule à coté deux choix possibles : A1 par exemple, mais le second choix sera "A Faire"

Je souhaite donc par une macro qui permet donc d'identifier ces feuilles qui ont "Réf:" dans une cellule et indiquer dans la cellule d'a coté (donc celle qui reçoit une liste de données) le statut "A Faire",

J'espère avoir été plus clair sur ma demande, en fait chaque année, je voudrais remettre le statut "A Faire" sur les feuilles que je dois travaillées, au lieu de le faire manuellement (ayant plusieurs fichiers de ce type),

Merci d'avance pour votre aide,

Cordialement,
Bonjour,

En résumé, on modifie les cellules qui ont une liste de validation, sur toutes les feuilles à l'exception de la feuille "ET". Code à tester.
VB:
Option Explicit
Sub test()
    Dim Sh As Worksheet, c As Range, lngValidation As Long

    For Each Sh In Worksheets
        If Sh.Name <> "ET" Then
            With Sh
                For Each c In .UsedRange
                    lngValidation = 0
                    On Error Resume Next
                    lngValidation = c.SpecialCells(xlCellTypeSameValidation).Count
                    On Error GoTo 0

                    If lngValidation <> 0 Then
                        c.Value = "A Faire"
                    End If
                Next
            End With
        End If
    Next
MsgBox "Action terminée!"
End Sub
 

ZZ59264

XLDnaute Occasionnel
Bonjour Cp4, merci beaucoup pour ton code,

N'ayant qu'une seule ligne de validation de données par feuille, j'ai lu qu'on pouvait utilisé :

VB:
c.Validation.Type

au lieu de

Code:
c.SpecialCells(xlCellTypeSameValidation).Count

ce qui permettrai la macro de s’exécutait plus rapidement, j'ai donc modifier ta proposition comme ceci :

Code:
VB:

Option Explicit
Sub test()
    Dim Sh As Worksheet, c As Range, lngValidation As Long

    For Each Sh In Worksheets
        If Sh.Name <> "ET" Then
            With Sh
                For Each c In .UsedRange
                    lngValidation = 0
                    On Error Resume Next
                    lngValidation = c.Validation.Type
                    On Error GoTo 0

                    If lngValidation <> 0 Then
                        c.Value = "A Faire"
                    End If
                Next
            End With
        End If
    Next
MsgBox "Action terminée!"
End Sub

Qu'en penses tu?,

Cordialement,
 

cp4

XLDnaute Barbatruc
Bonjour Cp4, merci beaucoup pour ton code,

N'ayant qu'une seule ligne de validation de données par feuille, j'ai lu qu'on pouvait utilisé :

VB:
c.Validation.Type

au lieu de

Code:
c.SpecialCells(xlCellTypeSameValidation).Count

ce qui permettrai la macro de s’exécutait plus rapidement, j'ai donc modifier ta proposition comme ceci :

Code:
VB:

Option Explicit
Sub test()
    Dim Sh As Worksheet, c As Range, lngValidation As Long

    For Each Sh In Worksheets
        If Sh.Name <> "ET" Then
            With Sh
                For Each c In .UsedRange
                    lngValidation = 0
                    On Error Resume Next
                    lngValidation = c.Validation.Type
                    On Error GoTo 0

                    If lngValidation <> 0 Then
                        c.Value = "A Faire"
                    End If
                Next
            End With
        End If
    Next
MsgBox "Action terminée!"
End Sub

Qu'en penses tu?,

Cordialement,
Ce que j'en pense:rolleyes:. En fait, pas grand chose. Je t'ai proposé un code tu en fais ce que tu veux pourvu que ça réponde à tes attentes.

Tu devrais prendre en considération les remarques de @BrunoM45 ;). Tu risques d'être ignoré. Du coup, tout ceux et celles qui t'auront ajouté sur leur liste respective des ignorés, ne verront plus tes discussions. Te privant ainsi de potentielles participations.

à bon entendeur . . .
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou