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 :

Aide avec Intersect [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut Aide avec Intersect
    Bonjour,

    Je n'arrive pas bien à gérer la fonction Intersect et j'aurais bien besoin de votre aide.
    Actuellement j'ai cette fonction :

    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
    Const PremiereLigneTableau As Integer = 11
    Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long
    'Récupération nom de session Windows
    'extrait d'un code trouvé sur : http://forum.rue-montgallet.com/ruemontgallet/Programmation/vb-vba/resolu-recuperation-windows-sujet_22341_1.htm
    Function OSUserName() As String
     
    Dim Buffer As String * 256
    Dim BuffLen As Long
    BuffLen = 256
        If GetUserName(Buffer, BuffLen) Then _
            OSUserName = Left(Buffer, BuffLen - 1)
    End Function
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
     
    'Si utilisateur est STAG3 il ne doit pas accéder au groupe de cellules Labo ...
    If OSUserName = "STAG3" Then
        If Not Intersect(Target, Range("Labo")) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellules labo on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    'Sinon si autre utilisateur il n'a accès qu'aux cellules de Prod
    Else
        If Not Intersect(Target, Range("Prod")) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellule prod on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    End If
    End Sub
    Elle me permet en fonction de l'utilisateur (login windows) qui ouvre le fichier excel de lui autoriser ou non l'accès à un groupe de cellules.

    Cependant j'aimerai rajouter un groupe de cellules en plus mais je ne sais pas comment le gérer avec intersect ... j'ai essayé de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Range("Prod"), range(Prod_2) Is Nothing Then
    et autres diverses formes mais sans résultats et voici mon dernier test :

    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
    Const PremiereLigneTableau As Integer = 11
    Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long
     
    'Récupération nom de session Windows
    'extrait d'un code trouvé sur : http://forum.rue-montgallet.com/ruemontgallet/Programmation/vb-vba/resolu-recuperation-windows-sujet_22341_1.htm
    Function OSUserName() As String
     
    Dim Buffer As String * 256
    Dim BuffLen As Long
     
     
     
    BuffLen = 256
        If GetUserName(Buffer, BuffLen) Then _
            OSUserName = Left(Buffer, BuffLen - 1)
    End Function
     
    Private Sub Workbook_Open()
    Dim wbkSuiviRege As Workbook
    Dim shRege As Worksheet
    Dim shSechage As Worksheet
     
    shRege = wbkSuiviRege.Sheets(" régé")
    shSechage = wbkSuiviRege.Sheets("séchage")
    End Sub
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim zonedegroupeLabo As String
    Dim zonedegroupeProd As String
    zonedegroupeLabo = ""
    zonedegroupeProd = ""
     
    If ActiveSheet.Name = " régé" Then
        zonedegroupeLabo = Range("Labo_Rege")
        zonedegroupeProd = Range("Prod_Rege")
    Else
        zonedegroupeLabo = Range("Labo_Sechage")
        zonedegroupeProd = Range("Prod_Sechage")
    End If
     
     
    'Si utilisateur est de la prod (ici STAG3) il ne doit pas accéder au groupe de cellules Labo ...
    If OSUserName = "STAG3" Then
        If Not Intersect(Target, zonedegroupeLabo) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellules labo on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    'Sinon si autre utilisateur il n'a accès qu'aux cellules de Prod
    Else
        If Not Intersect(Target, zonedegroupeProd) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellule prod on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    End If
    End Sub
    Mais là cela me fait une erreur de bloc with (??) au niveau des Set et je ne pense pas que ça fonctionne au niveau des Intersect...

    Voilà j'espère que j'ai été assez claire j'ai besoin de votre aide pour y voir plus clair justement... merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour juju1988,

    Avec l'union de zones :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not Intersect(Target, Union(Range("Prod"), Range("Prod_2"))) Is Nothing Then
    Hervé.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Merci pour ta réponse j'ai donc testé :

    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
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
     
     
    'Si utilisateur est de la prod (ici STAG3) il ne doit pas accéder au groupe de cellules Labo ...
    If OSUserName = "STAG3" Then
        If Not Intersect(Target, Union(Range("Labo_Rege"), Range("Labo_Sechage"))) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellules labo on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    'Sinon si autre utilisateur il n'a accès qu'aux cellules de Prod
    Else
        If Not Intersect(Target, Union(Range("Prod_Rege"), Range("Prod_Sechage"))) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellule prod on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    End If
    End Sub
    malheureusement cela me fait l'erreur : La mathode Union de l'objet Global a échoué ...

    Qu'est ce que j'ai oublié ?

  4. #4
    Membre éprouvé
    Inscrit en
    Janvier 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Janvier 2011
    Messages : 106
    Par défaut
    Bonjour,

    Tu veux vérifier si l'utilisateur clique dans une plage ou dans une autre? Et que donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Range("Prod")) Is Nothing Or Not Intersect(Target, Range("Prod_2")) Is Nothing Then ...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Citation Envoyé par U. Milité Voir le message
    Bonjour,

    Tu veux vérifier si l'utilisateur clique dans une plage ou dans une autre? Et que donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Range("Prod")) Is Nothing Or Not Intersect(Target, Range("Prod_2")) Is Nothing Then ...
    J'ai déjà testé et cela me fait l'erreur :

    La méthode Intersect de l'objet Global a échoué ...

    Et Qwazerty il vaut mieux que j'utilise Union que tout ce que tu m'as indiqué ?? Si c'est le cas malheureusement comme dit plus haut cela me fait l'erreur :

    La méthode Intersect de l'objet Global a échoué ... je ne sais pas pourquoi ... et oui sinon je veux pas que tel utilisateur est accès à tel groupe de cellules en fait ...

  6. #6
    Membre éprouvé
    Inscrit en
    Janvier 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Janvier 2011
    Messages : 106
    Par défaut
    Bonjour,

    Pas d'erreur chez moi, avec le code proposé.
    Question: à quoi font référence les plages "prod" et "prod_2"?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Ah ouais flûte alors !!
    Et bien cela fait référence à des groupes de cellules que j'ai défini dans Formules Gestionnaire de nom (outlook 2007).
    Si l'utilisateur c'est STAG3 (mon login windows) il a accès qu'au groupe de cellule appelé Prod_Sechage (onglet Séchage) ou Prod_rege (onglet régé) donc s'il clique dans les groupes de cellules Labo_Sechage ou Labo_Rege on décale sa sélection ...


  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re

    Si un nom de zone n'existe pas, une erreur est générée donc, contrôle si toutes tes zones existent ou alors, pour tester crée sur un classeur vierge deux zones nommées et teste avec Union (défois, avec beaucoup de code on ne sait plus trop où on en est ! et tester avec une classeur vierge ça permet de mieux déboger)

    Hervé.

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 120
    Par défaut
    Salut
    Si j'ai bien compris tu as 2 onglets?
    Donc le problème vient surement de la, tu demandes à excel de rechercher une intersection entre Target (qui se trouve sur Sh, on va dire qu'ici Sh c'est la feuil1) et la plage de cellule ProdSechage qui se trouve sur Feuil2 ... donc forcement Excel il sait pas faire ça

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 120
    Par défaut
    Salut
    [Edit]Grillé ... je suis trop bavard
    @Theze : En effet c'est plus propre avec Union, j'y penserais le prochain coup
    [/Edit]
    Alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_Open()
    Dim wbkSuiviRege As Workbook
    Dim shRege As Worksheet
    Dim shSechage As Worksheet
     
    shRege = wbkSuiviRege.Sheets(" régé")
    shSechage = wbkSuiviRege.Sheets("séchage")
    End Sub
    Ici ça ne va pas, tu définis des objet, il te faut donc utiliser le mot reservé Set

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set shRege = wbkSuiviRege.Sheets(" régé")
    Set shSechage = wbkSuiviRege.Sheets("séchage")

    Esuite, ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim zonedegroupeLabo As String
    Dim zonedegroupeProd As String
    zonedegroupeLabo = ""
    zonedegroupeProd = ""
     
    If ActiveSheet.Name = " régé" Then
        zonedegroupeLabo = Range("Labo_Rege")
        zonedegroupeProd = Range("Prod_Rege")
    Else
        zonedegroupeLabo = Range("Labo_Sechage")
        zonedegroupeProd = Range("Prod_Sechage")
    End If
    L’évènement SheetSelectionChange te fourni des paramètres, autant les utiliser. Tu as donc Sh qui représente la feuille qui vient d’être sélectionnée, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Sh.Name = " régé" Then
        zonedegroupeLabo = Sh.Range("Labo_Rege")
        zonedegroupeProd = Sh.Range("Prod_Rege")
    Else
        zonedegroupeLabo = Sh.Range("Labo_Sechage")
        zonedegroupeProd = Sh.Range("Prod_Sechage")
    End If

    Et donc pour les intersect, plusieurs choses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    If OSUserName = "STAG3" Then
        If Not Intersect(Target, zonedegroupeLabo) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellules labo on décale la sélection en dehors du groupe de cellules
            Selection
        End If
    'Sinon si autre utilisateur il n'a accès qu'aux cellules de Prod
    Else
        If Not Intersect(Target, zonedegroupeProd) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellule prod on décale la sélection en dehors du groupe de cellules
            Selection.Offset(0, 1).Select
        End If
    End If
    Premièrement les Selection. doivent disparaître, tu as le paramètre Target qui t'es fourni pour cela.
    deuxièmement, attention .Offset(0, 1).Select te décalera uniquement d'une colonne, ce qui rappellera le code jusqu’à sortir de la zone, à mon avis autant directement définir une cellule
    Et sinon pour le intersect, si tu lui donnes 3 arguments, il te renverra la ou les cellules qui sont communes aux 3 arguments, si tu veux testé plusieurs zones pour une même cellule target, il te faut utiliser autant de fois Intersect que tu as de zone

    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
    If OSUserName = "STAG3" Then
        If Not Intersect(Target, zonedegroupeLabo) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellules labo on décale la sélection en dehors du groupe de cellules
            'Selection.Offset(0, 1).Select
            Sh.Range("A1").Select
        End If
    'Sinon si autre utilisateur il n'a accès qu'aux cellules de Prod
    Else
        If Not Intersect(Target, zonedegroupeProd) Is Nothing Or _
           Not Intersect(Target, zonedegroupeProd2) Is Nothing Then
            'Si l'utilisateur veut accéder au groupe de cellule prod on décale la sélection en dehors du groupe de cellules
            'Selection.Offset(0, 1).Select
            zonedegroupeProd.Cells(1, 1).Select 'Selectionne la 1ere cellule de la ZoneDeGroupeProd
        End If
    End If
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 10h09
  3. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 18h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 17h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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