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

Macros et VBA Excel Discussion :

Union(range(Tb1),range(Tb2)).find => la méthode 'Union' a échoué


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Bonjour,
    Je mets en place une sécurité assez complexe, basée sur 3 tables Id et un Id connecté.
    Je voudrais autoriser un accès à tous les Id des table 2 et 3 et à l'Id connecté (s'il fait parti de la table 1).
    Voici mon code (qui fonctionne pour autorisé un Id d'une seule table)
    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
    Dim NomChoisi As String
        Application.DisplayAlerts = False
    NomChoisi = "Car Cae"
    UsAbg = Sheets("Données").[B2]    'Id connecté
    With Sheets("Données")
    'Si NomChoisi appartient aux tables 2 ou 3 ou est égal à UsAbg --- la table 2 est en P5:P46, la table 3 est en V5:V22
    Set Cel = Union(Range("TbAT[At Abg]"), Range("TbAll[All Abg]"), UsAbg).Find(NomChoisi, Union(Range("B2"), Range("P5"), Range("V5")))
        If Not Cel Is Nothing Then
    '----------
    Procédure si Ok
            Set Cel = Nothing
    '------------Suite Sécurité si Ko
        Else
            Call MsgBox("SECURITE" ...)
    End With
        Application.DisplayAlerts = True
    Je dois avoir un pb avec find, mais je maitrise pas bien
    Est-ce que qq'1 peut m'aider svp.

    J'ai déjà trouvé une explication / erreur, car j'ai utilisé une variable (UsAbg) dans mon Union. Donc j'ai corrigé mon code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel= Union(Range("TbAT[At Abg]"), Range("TbAll[All Abg]"), Range("B2"))
    si je m'arrête là et que je fais Cel.Select, mes 3 zones sont bien sélectionnées, mais dès que j'ajoute le find, j'ai, le motif d'erreur est : "Incompatibilité de type".
    J'ai essayé avec Dim Cel as Variant, mais cela ne change rien.
    Merci de votre aide

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    C'est quoi ce 2nd paramètre de find passé en range ?
    Fais F1 sur find pour voir sa syntaxe et les paramètres attendus.
    .Find n'a rien à voir avec les fonctions feuille

    eric

  3. #3
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Bonjour Eric,
    Merci de me répondre
    Le 2nd paramètre est le "After"
    Mais je viens de voir qu'il ne peut y avoir qu'une cellule unique, donc j'ai tout enlevé.
    J'en suis à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel = Union(Range("TbAT[At Abg]"), Range("TbAll[All Abg]"), Range("B2")).Find(NomChoisi)
    J'ai testé avec un NomChoisi en B2, en Table 2 (TbAT), c'est Ok, mais en Table 3 (TbAll) ça ne trouve pas mon Id, je reçois le message "Vous n'êtes pas autorisé".
    J'ai remplacé
    Range("TbAll[All Abg]") par Range("V5:V10"), c'est pareil, et comme je l'ai dit tout à l'heure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Cel = Union(Range("TbAT[At Abg]"), Range("TbAll[All Abg]"), Range("B2"))
    Cel.Select
    sélectionne bien mes 3 zones.

    Je ne vois pas le nouveau pb

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Sans doute qu'avec un fichier on pourra avancer.
    eric

  5. #5
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Eric,
    Comme demandé, voici un exemple de mon fichier.
    Merci
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je comprend bien pour l'ID connecté : cet identifiant est dans une cellule et on doit chercher si cet identifiant est dans ton ListObject1

    mais pour les deux autres tableaux, où est stocké l'ID à tester ??


    EDIT : voici une proposition, avec l'ID secondaire codé en dur dans la macro, comme ton exemple

    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
    Sub Acces()
    Dim Autorisation As Boolean
    Dim NomChoisi As String
    Dim Plage As Range
    Dim Cel As Range
     
    NomChoisi = "Séb TAN"
     
    With Sheets("Données")
        ' recherche de l'ID connecté
        Set Cel = .ListObjects("TbStg").DataBodyRange.Find(.Range("B2").Value, , xlValues, xlWhole)
     
        If Not Cel Is Nothing Then
            Autorisation = True
        Else
            ' recherche de l'ID dans le tableau 2 et 3
            Set Plage = Union(.ListObjects("TbAT").DataBodyRange, .ListObjects("TbAll").DataBodyRange)
            Set Cel = Plage.Find(NomChoisi, , xlValues, xlWhole)
     
            If Not Cel Is Nothing Then
                Autorisation = True
            Else
                Call MsgBox("SECURITE")
            End If
        End If
    End With
     
    End Sub

  7. #7
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Bonsoir,
    l'id a tester vient d'une variable que j'ai appelé NomChoisi.
    Cette variable est alimentée par une listeBox qui reprend l'union des listes des 3 tableaux (Colones G + P + V)
    Pour donner l'autorisation, il faut que NomChoisi se trouve :
    • Soit en B2 (Id Connecté)
    • Soit dans le Tableau 2 colonne P ou TbAT[At Abg]
    • Soit dans le tableau 3 colonne V ou TbAll[All Abg]


    Autre formulation possible : tous ceux du tableau 1 n'ont pas d'autorisation sauf s'il est connecté
    Désolée de n'être pas plus clair ;>

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    ma proposition regarde si la valeur en B2 existe dans le tableau 1, ça fonctionne aussi comme ça ou pas ?

    au pire, t'as le squelette fonctionnel, tu peux adapter tu penses ?

  9. #9
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Bonsoir Joe,
    Je suis désolée, je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set Cel = .ListObjects("TbStg").DataBodyRange.Find(.Range("B2").Value, , xlValues, xlWhole)
    Quelque soit la valeur que je donne à NomChoisi la routine s'arrête toujours sur la 1ère proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        If Not Cel Is Nothing Then
            Autorisation = True
    Je n'arrive pas à l'adapter
    A la place de .Range("B2").Value j'ai mis NomChoisi...

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    si tu n'utilises que NomChoisi, ça revient à dire :

    "si dans l'un des trois tableaux je trouve NomChoisi ... alors mon utilisateur a l'autorisation", non ?

    dans ce cas, simplifie ainsi :

    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
    Sub Acces()
    Dim Autorisation As Boolean
    Dim NomChoisi As String
    Dim Plage As Range
    Dim Cel As Range
     
    NomChoisi = "Kar SIA"
     
    With Sheets("Données")
        Set Plage = Union(.ListObjects("TbStg").DataBodyRange, .ListObjects("TbAT").DataBodyRange, .ListObjects("TbAll").DataBodyRange)
        Set Cel = Plage.Find(NomChoisi, , xlValues, xlWhole)
     
        If Not Cel Is Nothing Then
            Autorisation = True
        Else
            Call MsgBox("SECURITE")
        End If
    End With
     
    End Sub

  11. #11
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Joe,
    C'est pas tout à fait ça, il ne faut pas intégrer le TbStg, ceux-là ne sont pas autorisés, mais ajouter celui qui est en B2.
    J'ai donc remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .ListObjects("TbStg").DataBodyRange
    par et ça semble fonctionner;
    Je vérifie demain avec le vrai fichier et je confirme.
    Merci Joe, bonne soirée.

  12. #12
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Ok tiens nous au courant

    j'ai du mal ce soir

    VBA Outlook m'a tuer (copyright judiciaire...)

Discussions similaires

  1. [XL-2000] Union de plage Range renvoie un Range à moitié vide ou #N/A
    Par aurelien.g dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 21/04/2011, 13h51
  2. Rang Conditionnel (Rang.si)
    Par berapard dans le forum Contribuez
    Réponses: 0
    Dernier message: 07/04/2010, 19h26
  3. Range de Range, pour un tableau [Facile]
    Par Tomme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2007, 15h33
  4. [VBA][Excel] Range & Union
    Par sat478 dans le forum Access
    Réponses: 4
    Dernier message: 16/12/2005, 09h59
  5. [VBA Excel] problème de range avec find
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/11/2005, 13h56

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