VBA mot de passe

Qu'est ce tu entends par "le code ci-dessous fonctionne uniquement que pour les cas où un seul siège est attribué", parce qu'un siège peut être attribué à plusieurs membres (même si ce n'est pas le cas dans mon fichier exemple) donc ça ne marchera pas ?,

Merci beaucoup pour ton aide,

Cordialement,

Finalement je prend le temps de faire quelque chose qui fonctionne :

Voilà le nouveau code que tu retrouveras intégré dans le fichier joint

With Feuil9

    Tableau = Split(Seg, ";")

For j = 17 To 40
.Cells(j, 3).Clear

    For i = 0 To UBound(Tableau)
        If .Cells(j, 1) = Tableau(i) Then .Cells(j, 3) = 1
    Next i
        If .Cells(j, 3) = "" Then .Cells(j, 3) = 0
Next j

    .ListObjects("ETAB_FILTRE").Range.AutoFilter Field:=3, Criteria1:="1"

End With

Merci beaucoup, c'est vraiment top, je n'ai plus qu'à mettre en place tout cela sur le fichier de travail original,

Peux tu m'expliquer le code :

With Feuil9

    Tableau = Split(Seg, ";")

For j = 17 To 40
.Cells(j, 3).Clear

    For i = 0 To UBound(Tableau)
        If .Cells(j, 1) = Tableau(i) Then .Cells(j, 3) = 1
    Next i
        If .Cells(j, 3) = "" Then .Cells(j, 3) = 0
Next j

Il y avait deux macro enregistrés sur le fichier je les ai supprimée et je ne pense pas qu'elles intervenaient dans le déroulement de ton code, peux tu me le confirmer?,

Merci pour le temps consacré et la résolution de ma problématique

Oui effectivement j'ai oublié de les retirés, c’était pour faire des tests

With Feuil9 'Les taches suivantes fonctionnent sur la feuil9 (ou feuille SEGMENT)

    Tableau = Split(Seg, ";") 'Seg fait référence à la cellule contenant les sièges attribué en fonction du LogIn
                            'Split va nous permettre de récupérer les lettres contenues entre les ";"
                            'Les lettres en question sont misent dans un tableau "virtuel" où une colonne = une lettre
                            'Exemple : Seg="A;C;X" alors Tableau = A|C|X
For j = 17 To 40 'Ici se sont les lignes sur lesquelles la liste des sièges
.Cells(j, 3).Clear 'Ici on vides les cellules de la colonne 3 (ou C)

    For i = 0 To UBound(Tableau) 'Ici on dit qu'on travail de la colonne 0 à la colonne max du tableau virtuel précédemment créé
        If .Cells(j, 1) = Tableau(i) Then .Cells(j, 3) = 1 'Ici on compare la première ligne de la liste des sièges avec la première colonne du tableau virtuel, si elle sont égales alors la cellule de cette ligne sur la colonne 3 prend pour valeur 1 sinon la cellule reste vide
    Next i 'On fait cette boucle jusqu'à avoir testé toutes les valeurs du tableau virtuel sur la première ligne
        If .Cells(j, 3) = "" Then .Cells(j, 3) = 0 'Si la cellule est resté vide alors elle prend pour valeur 0
Next j 'On passe à la deuxième ligne du tableau des attribution des sièges, puis on re-test les différentes valeur du tableau virtuel
    'une vois toutes les cellues testées on trie le tableau sur la colonne FiltreETAT pour les cellules = 1
    .ListObjects("ETAB_FILTRE").Range.AutoFilter Field:=3, Criteria1:="1"

End With 'On finit la procédure s’exécutant sur la feuil9

Merci beaucoup pour les commentaires apportés,

C'est top top

Merci pour ton aide,

Cordialement,

J'espère que les commentaires sont clairs

Ya pas de quoi, c'est un plaisir de rendre service

Oui les commentaires sont très bien détaillés, et j'essaye toujours de comprendre les codes VBA (même si je ne sais pas les écrire, je peux parfois apportées des modifications grâce aux commentaires),

J'évite au max d'utiliser le VBA, (avec Query et pivot, mettre mes données sous forme de table ...)

Seulement pour cette mise en place de nom utilisateur et mot de passe, ainsi que la partie de sélection des sièges en fonction de l'utilisateur saisi, je ne vois sur Excel que VBA me permettant de faire cela,

Un grand merci pour ton aide !

Je reposte car j'aimerai obtenir une chose de plus assez simple je pense mais pour ne pas faire d'impair, je repasse sur le forum;

Merci d'avance à GGauthier si tu poux accéder à ma demande, donc j'aimerai qu'à la fermeture du fichier en plus du code suivant qui permet de revenir à la feuille 1 et masquer les autres feuilles :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Feuil1.Visible = True

For i = 2 To Worksheets.Count
Worksheets(i).Visible = 2
Next

End Sub

je puisse supprimer toutes les feuils qui auraient pu être créer, donc comme le fichier est structuré de façon à ce que la feuille qui sera crée sera supérieur ou égale à Feuil10, comment peut on l'écrire ?,

J'ai testé ce code trouvé sur le web mais il ne fonctionne pas sur mon fichier :

Dim Feuille As Worksheet
'Pour toutes les feuilles dans CE classeur
    For Each Feuille In ThisWorkbook.Worksheets
'si son nom est supérieur à "Feuil10" (à adapter bien sur) alors.....
        If Feuille.Name > "Feuil10" Then
'on empêche le message d'alerte à l'utilisateur
        Application.DisplayAlerts = False
'on supprime la feuille
            Feuille.Delete
'on remets le message d'alerte excel !!! très important !!!
        Application.DisplayAlerts = True
'fin du test
        End If
'feuille suivante
    Next Feuille

Merci pour votre aide

Je reposte car j'aimerai obtenir une chose de plus assez simple je pense mais pour ne pas faire d'impair, je repasse sur le forum;

Merci d'avance à GGauthier si tu poux accéder à ma demande, donc j'aimerai qu'à la fermeture du fichier en plus du code suivant qui permet de revenir à la feuille 1 et masquer les autres feuilles :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Feuil1.Visible = True

For i = 2 To Worksheets.Count
Worksheets(i).Visible = 2
Next

End Sub

je puisse supprimer toutes les feuils qui auraient pu être créer, donc comme le fichier est structuré de façon à ce que la feuille qui sera crée sera supérieur ou égale à Feuil10, comment peut on l'écrire ?,

J'ai testé ce code trouvé sur le web mais il ne fonctionne pas sur mon fichier :

Dim Feuille As Worksheet
'Pour toutes les feuilles dans CE classeur
    For Each Feuille In ThisWorkbook.Worksheets
'si son nom est supérieur à "Feuil10" (à adapter bien sur) alors.....
        If Feuille.Name > "Feuil10" Then
'on empêche le message d'alerte à l'utilisateur
        Application.DisplayAlerts = False
'on supprime la feuille
            Feuille.Delete
'on remets le message d'alerte excel !!! très important !!!
        Application.DisplayAlerts = True
'fin du test
        End If
'feuille suivante
    Next Feuille

Merci pour votre aide

Je pose une autre question mais cette fois en lien avec le code VBA permettant de distinguer les sièges , peut on ajouter que si pour l'user daniel il doit voir tous les sièges, mettre 1 sur la colonne 3 du tableau filtre (ca m'éviterai de saisir le nom de tous les sièges) ?

J'ai mis ce code :

If Seg = "TOUS" Then .Cells(j, 3) = 1

Mais il y a deux problèmes , à l’ouverture il ne met pas 1 sur la première ligne cellule C17 de l'onglet segment,

De plus, bizarrement quand je refais logout, l'utilisateur et le mot de passe sont toujours présent, or ça devrait être vide ?,

Merci pour l'aide car je suis un peu perdu

Je commence par répondre à la question pour mettre Daniel à "TOUS" :

With Feuil9

If Seg = "TOUS" Then
    For i = 17 To 40
        .Cells(i, 3) = 1
    Next i
Else
    Tableau = Split(Seg, ";")

    For j = 17 To 40
        .Cells(j, 3).Clear

            For i = 0 To UBound(Tableau)
                If .Cells(j, 2) = Tableau(i) Then .Cells(j, 3) = 1
            Next i
        If .Cells(j, 3) = "" Then .Cells(j, 3) = 0
    Next j

    .ListObjects("ETAB_FILTRE").Range.AutoFilter Field:=3, Criteria1:="1"
End If
End With

Bonjour GGauthier,

Merci pour ton retour, j'ai testé et le code fonctionne à une chose prés, c'est lorsque je mets lol et MDP 456 puis que je revienne avec logout à la page d'accueil, je mets daniel et MDP 123, il met bien 1 à tous les établissements mais le filtre 1 ne fait apparaitre que l'établissement A,

La solution que je vois c'est que dans le code login avant le code sous WithFeuil9 lui préciser de défiltrer le tableau Etab_filtre, est ce que le code suivant est le bon :

    .ListObjects("ETAB_FILTRE").Range.AutoFilter Field:=3, Criteria1:="*"

Merci d'avance,

Cordialement,

Décale la ligne permettant le filtre entre le End If et le End With comme ceci :

'le reste du code juste au dessus
End If
    .ListObjects("ETAB_FILTRE").Range.AutoFilter Field:=3, Criteria1:="1"
End With

Merci pour cette précision et effectivement tout se passe correctement

Je reviendrais vers toi pour la suppression des onglet rajoutés

Pas de soucis Merci beaucoup pour ton aide,

Par contre je trouve qu'il rame un peu le fichier, tu penses que c'est du a quoi?

Cordialement,

Me revoilà avec une solution (Grace à Eric, l'un des membre du forum qui a un niveau de dingue)

Je t'explique la démarche :

Le plus sur est de remplacer tous les CodeName des feuilles (un CodeName est le nom en dure de la feuille, par exemple Feuil1 est le CodeName de la feuille nommée Login) en gardant toujours le même nom. Prenons alors comme CodeName "Origine".

Maintenant toutes les feuilles que je veux garder je vais leur mettre le CodeName Origine1, Origine2, etc...Origine9

Après, avec un code VBA on compare le nom de toutes les feuilles du classeur. Toutes les feuilles qui ne possède pas le CodeName "Origine" seront alors supprimées !

Je te me le code VBA juste en dessous avec le fichier modifié :

Dim sh As Worksheet 'Déclaration de la variable sh qui est définit comme une feuille

Application.DisplayAlerts = False 'Désactivation des alertes
For Each sh In ThisWorkbook.Worksheets 'Annalyse sur toutes les feuilles du classeur
    If Left(sh.CodeName, 7) <> "Origine" Then sh.Delete
    'En traduction litérale il faut comprendre la ligne ci-dessus comme :
    'Si, en partant de la gauche, les 7 premier caractères du CodeName sont différents de "Origine" alors la feuille est supprimée
Next sh 'Test sur la feuille suivante
Application.DisplayAlerts = True 'Réactivation des alertes
'Note : Dans notre cas, les alertes sont les messages de confirmation de suppression de feuilles, ça évite comme ça de devoir cliquer sur "Oui" _
à chaque suppression de feuille

J'ai donc mis le code dans le Workbook_BeforeClose et à l'action du clique sur LogOut

Bonjour GGauthier,

Le code est vraiment astucieux MERCI à toi et donc à Eric pour la solution et le temps que tu as passé sur mon projet,

Il ne me reste qu'a refaire sur mon fichier de travail (ce sera assez facile avec tes commentaires, j'y avais déjà passé pas mal de temps avec la vidéo pour la mise en place initiale), mais c'est vraiment top le résultat final !

Pour information, l'idée de mettre 1 ou 0 sur l'établissement filtre (qui est sous forme de table) permet d’utiliser cette information de filtre dans des requêtes extérieures, qui elles mêmes permettent l'analyse via Query et pivot.

Ainsi avec son identifiant et son mot de passe paramétré, chacun auras accès à tout ou partie en fonction de son profil,

Je clôture donc ce post, merci pour tout

A bientôt sur le forum

Bonne continuation

Rechercher des sujets similaires à "vba mot passe"