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 :

Fichier en lecture seule avec condition


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Fichier en lecture seule avec condition
    Bonjour le Forum,
    J'ai créé une application sous Excel. Je souhaite que le fichier s'ouvre en lecture seule, si ce n'est pas mon identifiant qui l'ouvre. (fichier sur réseau).
    Mon but est d'éviter la boîte de dialogue habituelle à l'ouverture d'un classeur dont l'écriture est protégée par mot de passe.
    Autre précision, je pense d'importance : le fichier doit s'ouvrir par raccourci sur le bureau, donc sans utilisation d'un classeur annexe.
    Voici le code auquel j'ai pensé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub Workbook_Open()
        Dim CHEMIN As String
        CHEMIN = ActiveWorkbook.FullName
        If Application.UserName = "MarcelG" Then
            SetAttr CHEMIN, vbNormal
        Else
            SetAttr CHEMIN, vbReadOnly
        End If
     End Sub
    1er essai de sauvegarde sur mon poste : sauvegarde sans problème
    Je ferme le classeur.
    2ème essai de sauvegarde sur le poste d'un collègue : message bloquant (normal)
    Je ferme le classeur.
    3ème essai de sauvegarde sur mon poste (MarcelG) : là refus car fichier en lecture seule. ???!!!! Je ne comprends pas.
    J'ai dû faire une erreur dans mon code VBA.
    Peut-on me dire comment y pallier, ou me proposer un autre code.
    D'avance Merci.
    Cordialement. Marcel.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut 'MarcelG',

    Je trouve que c'est normal :
    - la première fois le fichier était en lecture/écriture, et tu l'as enregistré en lecture/écriture, ensuite
    - tu l'as ouvert en lecture/écriture puis enregistré en lecture seule, ensuite
    - maintenant qu'il est en lecture seule tu peux pas l'enregistrer en lecture/écriture, tu ne peux pas le modifier (LA MAcro ne peut pas le modifier)...



    A+

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour à tous,

    Je viens un peu (beaucoup) en pique assiette, mais l'idée de marcelG me plait beaucoup, et si il accepte j'aimerai utiliser son code lorsqu'il sera opérationnel.
    Je l'en remercie par avance

  4. #4
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut,

    Voilà ce qu'on peut lire dans l'aide d'Excel à propos de l'instruction "SetAttr" :
    Remarques

    Une erreur d'exécution se produit si vous tentez de définir les attributs d'un fichier ouvert.
    et c'est plutôt logique...

    Je propose ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Workbook_Open()
     
        Dim CHEMIN As String
     
        CHEMIN = ActiveWorkbook.FullName
     
        If Range("a1").Value = "moi" Then
            Application.Workbooks.Open Filename:=CHEMIN, ReadOnly:=False
            Else
                Application.Workbooks.Open Filename:=CHEMIN, ReadOnly:=True
        End If
    End Sub
    Comme ça, ça marche. Maintenant essayez en remplaçant Range("a1").Value (moi j'peux pas l'faire), et on verra bien...


    a+

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut autres macros dans Workbook_Open
    Merci pour cette réponse.
    Il me semble qu'avec cette méthode, le fichier se réouvre d'où le message "Le fichier est déjà ouvert. Si vous l'ouvrez à nouveau, toutes...." que l'on peut éviter par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = False
    Néammoins, si d'autres macros ou lignes de code viennent compléter ces instructions décrites plus haut, celles-ci ne sont pas prises en compte.

    Voici mon code :

    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
    Private Sub Workbook_Open()
     
    Dim CHEMIN As String
    CHEMIN = ActiveWorkbook.FullName
     
    Application.DisplayAlerts = False
    Application.EnableEvents = True
    If Application.UserName = "MarcelG" Then
            Application.Workbooks.Open filename:=CHEMIN, ReadOnly:=False
    Else
            Application.Workbooks.Open filename:=CHEMIN, ReadOnly:=True
    End If
     
    Application.Run ("TOTO")
     
    End Sub
    Ici, la macro TOTO ne s'éxécute pas.
    Y a-t-il une solution pour forcer cette exécution ?
    Merci.
    Marcel.

  6. #6
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut 'MarcelG',

    Il me semble qu'avec cette méthode, le fichier se réouvre d'où le message "Le fichier est déjà ouvert. Si vous l'ouvrez à nouveau, toutes...."...
    Il te semble ?!!!
    Toi tu y vas à 100 à l'heure et c'est pas efficace à tout les coups. As tu essayé avant d'écrire ça ? Essaye d'être sûr avant de poster quoi que ce soit, je t'en pris, ça nous fera gagner beaucoup de temps

    Sinon pour répondre, non en fait puisque le fichier est ouvert et réouvert tout de suite après sans être modifié, Excel n'affiche pas ce message.


    Ici, la macro TOTO ne s'éxécute pas.
    C'est vrai... Cherchons une solution !



    à+

  7. #7
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Bonjour,


    T'inquiète j'suis pas plus avancé que toi

    Voilà mon idée :
    A l'ouverture de ton Classeur "x.xls", et par VBA :
    1. Créer un nouveau Classeur "temp.xls"
    2. Ajouter un module "module_temp" dans "temp.xls"
    3. Ecrire dans "module_temp" une procédure "ouvrir" qui va :
      1. Fermer "x.xls"
      2. Tester si c'est toi au pas
      3. Changer les attribus de "x.xls" en fonction du résultat du test
      4. Ouvrir "x.xls"
    4. Exécuter "ouvrir"
    5. Fermer "temp.xls"

    Essaie de développer ça. Moi de mon coté je vais essayer aussi parce que ça m'intéresse pas mal !



    Bon courage...

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Code dans nouveau classeur
    Tout d'abord, j'ai essayé de compléter ton code par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'Marcel
         Application.Workbooks(Workbooks.Count).SaveAs filename:="temp.xls"
    PAR CODE VBA, depuis un classeur A, je ne sais pas :
    - renommer un module d'un classeur B
    - créer une procédure en la nommant dans ce module
    - écrire cette procédure
    - l'activer depuis le classeur A

    J'ai donc développé directement dans temp.xls, en codant


    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
    Public Sub ouvrir()
     
        Dim user As String
        Dim CHEMIN As String
     
        user = Application.UserName
        CHEMIN = Workbooks("x").FullName
     
        Workbooks("x").Close (False)
     
        If user = "MarcelG" Then
            SetAttr CHEMIN, vbNormal
        Else
            SetAttr CHEMIN, vbReadOnly
        End If
     
        Workbooks.Open Filename:=CHEMIN
        Workbooks("temp.xls").Close (False)
     
    End Sub
    Voici ma - modeste - contribution.

    Merci pour ton aide. Cela devient passionnant.

    Marcel.

  9. #9
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut 'MarcelG',


    Moi j'arrive pas à exécuter la procédure créée.


    Voilà où j'en suis :
    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
     
    Private Sub Workbook_Open()
     
        Dim clTemp As Workbook ' classeur temporaire
        Dim modClTemp As Object ' le module ThisWorkbook du classeur temporaire
     
        Application.Workbooks.Add ' creer un classeur
        Set clTemp = Application.Workbooks(Workbooks.Count) ' definir clTemp
        Set modClTemp = clTemp.VBProject.VBComponents("ThisWorkbook") ' definir modClTemp
        ' ------------------------- Ecrire dans modClTemp ----------------------
        With modClTemp.CodeModule
            .InsertLines Line:=1, _
                String:="Sub Workbook_Open()"
            ' cl: notre classeur initial
            .InsertLines Line:=2, _
                String:="set cl = Application.Workbooks(Workbooks.Count - 1)"
            .InsertLines Line:=3, _
                String:="nomCl = cl.FullName"
            .InsertLines Line:=4, _
                String:="cl.Close"
            .InsertLines Line:=5, _
                String:="If ThisWorkbook.Sheets(1).Cells(1, 1).Value = ""moi"" Then"
            .InsertLines Line:=6, _
                String:="Application.Workbooks.Open Filename:=nomCl, ReadOnly:=False"
            .InsertLines Line:=7, _
                String:="Else"
            .InsertLines Line:=8, _
                String:="Application.Workbooks.Open Filename:=nomCl, ReadOnly:=True"
            .InsertLines Line:=9, _
                String:="End If"
            .InsertLines Line:=10, _
                String:="end sub"
        End With
        ' ----------------------------------------------------------
    Donc je n'arrive pas à exécuter "Workbook_Open" de l'autre classeur "temporaire".



    A toi...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je prends le sujet en cours et je n'ai regardé que les dernières réponses, alors à toutes fins utiles, vous avez regardé dans l'aide, exemple :

    Cet exemple montre comment ouvrir le classeur Analysis.xls puis comment exécuter sa macro Auto_Open.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks.Open "ANALYSIS.XLS"
    ActiveWorkbook.RunAutoMacros xlAutoOpen

  11. #11
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut La macro RunAutomacro ne s'éxécute pas
    Merci Jacques Jean

    J'ai codé ainsi, après la macro d'écriture proposée par mondev

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clTemp.RunAutoMacros xlAutoOpen
    Remarque : Si l'on code "clTemp." , VBA propose bien l'action RunAutoMacros

    Mais cette instruction reste sans effet, alors qu'aucun message d'erreur ne s'affiche.

    Je n'en vois pas la raison.

    Cordialement.

    Marcel

  12. #12
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut,


    Bien vu 'MarcelG'...

    La raison : c'est que, "ThisWorkbook_Open" est exécutée, mais c'est comme si on ne basculait pas vers elle, comme si elle était exécutée en arrière plan.
    C'est pas clair je sais mais si tu l'exécute en pas à pas détaillé tu comprendra mieux.
    Et donc, puisqu'on "ne donne pas la main" à "ThisWorkbook_Open", quand on arrive à la ligne "cl.Close", notre classeur (qui exécute "ThisWorkbook_Open") se ferme et les lignes après le "cl.Close" ne sont pas exécutées.

    Ceci dit, je ne vois pas du tout comment on pourrait régler ça puisque l'idée principale (mon idée ) était de fermer le classeur puis de le rouvrir (il faut bien le fermer à un moment donné !)...




    Voilà, j'attends une réponse ou une confirmation avant d'abandonner cette idée et essayer d'en trouver une autre...

    @+

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/03/2011, 13h50
  2. Réponses: 0
    Dernier message: 30/08/2007, 16h46
  3. Réponses: 8
    Dernier message: 09/08/2005, 11h44
  4. Réponses: 7
    Dernier message: 05/08/2005, 16h32
  5. [PDE] Editeur de fichiers en lecture seule
    Par simsky dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 13/07/2005, 12h18

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