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 :

Configurer des options de VBE par macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Points : 55
    Points
    55
    Par défaut Configurer des options de VBE par macro
    Bonjour,

    J'ai une macro qui fonctionne sur mon pc, tout va bien. Mais elle ne marche pas toujours sur les autres pcs (toujours même version d'Excel et de VBE, 2003).
    Les problèmes arrivent à cause des réglages de d'Excel et de VBE.

    - Pour les réglages macros sur Excel, j'ai réussi à les gèrer avec Workbook_Open et une fenêtre qui explique comme aller cocher "Faire confiance au projet Visual Basic".

    - Par contre je bug sur les réglages VBE :
    • Comment faire pour connaître ces réglages VBE par macro
    • Comment les modifier

    Les réglages sont :
    • Déclarations des variables obligatoire : cocher
    • Avertir avant perte d'état : décocher


    Est ce quelqu'un sais comment faire?

    Ps : - j'espère pouvoir modifier les réglages par macro car les utilisateurs arriveront trés difficilement à faire les réglages eux même.
    - La macro crée des feuilles, boutons et macro dynamiquement

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Déjà, pour "Déclarations des variables obligatoire : cocher", tu peux remplacer ça par Option Explicit placé en tête de module.
    Pour la perte d'état, je ne sais pas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Déjà, pour "Déclarations des variables obligatoire : cocher", tu peux remplacer ça par Option Explicit placé en tête de module.
    Pour la perte d'état, je ne sais pas.

    Salut, merci pour ta réponse rapide.


    Mais hélas , j'y avait pensé et ca marche pas.

    Si on est sur un pc qui a l'option de cocher, le fait de mettre "Option Explicit" va doubler la déclaration et VBE va faire une erreur et mes utilisateurs vont avoir peur
    Et si on est sur un pc qui a l'option de décocher, le fait de mettre "Option Explicit" en haut du nouveau module ne va pas poser de problème au début mais à l'écriture dynamique du code si, du coup erreur ... utilisateur ... peur .

    Ps : Mon code est fait pour fonctionner quand "Déclarations des variables obligatoire" est coché.
    Déroulement du code :
    - créer une nouvelle feuille (le module à "Option Explicit" en haut)
    - j'efface Option Explicit
    - je copie le module modèle dans le nouveau module (Avec Option Explicit, variables globales, méthodes, ...)

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Alors écris ton code avec "On error resume next"... Mais je ne pense pas que ça servira en cas d'erreur de syntaxe. As-tu testé Application.EnableEvents = false en début de macro, que tu passes à true à la fin ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    Je viens d'essayer et ca ne fonctionne pas, avec ou sans Application.EnableEvents = True à la fin de mon code, la fenêtre d'erreur d'une "Instruction d'option dupliqué" va apparaître dès l'arrêt de la macro.

    Dans mon code j'ai "Application.OnTime Now(), "'Nommer_Feuille ""1'"", le message d'erreur apparaît entre la méthode précédente et Nommer_Feuille alors que c'est Nommer_Feuille qui devrait prendre la main.

    Ce qu'il me faut (si ca existe) c'est :
    ActiveWorkbook.VBProject.VBE.XX.XX.XX
    pour chaque option que je voudrais tester.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Et si tu nous mettais ton code, même simplifié, pour qu'on puisse connaître le contexte et tenter de comprendre le problème ?
    Pour écrire une macro par macro, ce n'est pas sorcier. Je ne comprends pas du tout ce pb de
    Déclarations des variables obligatoire : cocher
    Avertir avant perte d'état : décocher
    Ces deux options ne sont là qu'en mode d'édition de la macro et ne devrait pas interférer dans l'exécution d'un macro existante, pour peu qu'elle soit correctement rédigée.
    Tu nous fais ça court
    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    Je vais essayer

    Module copié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'Début Code
    Option Explicit
     
    Dim Ligne As Integer
    Dim Date_Réalisée As String
    Dim Action As Boolean
     
    'Les Méthodes pour les boutons
     
    End Sub
    'Fin code
    ThisWorkbook:
    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
    57
    58
    59
    60
    61
    62
    Private Sub Mettre_Code_Dans_Nouveau_Module(Source As Object, Destination As Object)
     
        Destination.CodeModule.DeleteLines 1, 2 'effacement du Option Implicit pour pas faire doublon
        Destination.CodeModule.AddFromString Source.CodeModule.Lines(1, Source.CodeModule.CountOfLines)
    End Sub
     
    Private Sub Créer_Bouton()
     
        Dim Obj As OLEObject
    'ajoute un CommandButton dans la feuille index
        Set Obj = ActiveWorkbook.ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=5.25, Top:=57, Width:=71.25, Height:=24.75)
        With Obj
            .Name = "Tout_Afficher" 'renomme le bouton
            .Object.Caption = "Tout afficher"
            .Object.Font.Name = "Times New Roman"
            .Object.Font.Size = 12
            .PrintObject = False 'pour ne pas l'imprimer
        End With
        Set Obj = Nothing
     
    End Sub
     
    Private Sub Mep_Feuille()
        'Mise En Page de la nouvelle feuille
    End Sub
     
    Private Sub Workbook_NewSheet(ByVal Sh As Object)
     
        Dim Réponse As String
        Dim Nom_Feuille As Variant
        Dim Renommer As Boolean
        Dim Fa As Integer
        Dim Source As Object, Destination As Object
     
        Réponse = MsgBox("Cette nouvelle feuille contiendra un tableau des actions?", vbYesNo, "Ajout de feuille :")
     
        If Réponse = vbYes Then 'si oui
     
            Set Destination = ActiveWorkbook.VBProject.VBComponents(Sh.CodeName)
     
            Application.OnTime Now(), "'Nommer_Feuille ""1'" 'Now() + TimeValue("00:00:01")
                        'Appel de la méthode qui sera lancée quand Workbook_NewSheet et Workbook_SheetActivate
     
            Mep_Feuille
     
            Créer_Bouton
     
            For Fa = 1 To ActiveWorkbook.Worksheets.Count 'boucle sur le nombre de feuille
                Set Source = ActiveWorkbook.VBProject.VBComponents.Item(ActiveWorkbook.Worksheets(Fa).CodeName)
                If Source.CodeModule.CountOfLines > 200 Then 'c'est un bon module source
                    Mettre_Code_Dans_Nouveau_Module Source, Destination
                    Exit For
                End If
            Next Fa
     
        End If
     
        Set Source = Nothing
        Set Destination = Nothing
        Set Sh = Nothing
     
    End Sub
    Pour "Avertir avant perte d'état : décocher ", si l'option est coché la macro marchera bien mais si l'utilisateur veut effacer la feuille sans avoir fermer Excel entre temps, VBE va être ouvert et un message "Cette action va réinitialiser votre projet, voulez-vous continuer?" si il met oui la feuille est supprimer et ca peut aller, si il met annuler, Excel plante, et la fenêtre d'envoie d'erreur windows apparaît (récupe fichier, envoyer, par envoyer) et c'est pas top top ca :p

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Cela provient sûrement de ta macro lancée avec Tempo.
    As-tu essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.displayAlerts = False
    à placer dans la macro "Nommer_Feuille"
    Regarde également Shedule dans l'aide, à OnTime
    Citation Envoyé par l'aide en ligne (F1)
    Schedule Argument de type Variant facultatif. Cet argument a la valeur True pour programmer une nouvelle procédure OnTime. Il a la valeur False pour effacer une procédure précédemment définie. La valeur par défaut est True.
    A tout hasard et si j'ai bien compris ton pb.
    Ceci dit, comme l'événement Workbook_Sheet_Delete n'existe pas...
    En fouillant un peu j'ai néanmoins trouvé ça qui pourrait t'intéresser. Je te le mets car je ne me souviens plus comment je suis tombé dessus
    Utilisation d'événements avec l'objet Application
    Voir aussi Spécificités
    Avant de pouvoir utiliser des événements avec l'objet Application, vous devez créer un nouveau module de classe et déclarer un objet de type Application avec des événements. Par exemple, supposons qu'un nouveau module de classe est créé et appelé EventClassModule. Le nouveau module de classe contient le code suivant :

    Public WithEvents App As Application
    Une fois que le nouvel objet a été déclaré avec des événements, il apparaît dans la liste déroulante Objet du module de classe et vous pouvez écrire des procédures d'événements pour le nouvel objet. (Lorsque vous sélectionnez le nouvel objet dans la zone Objet, les événements autorisés pour cet objet sont répertoriés dans la liste déroulante Procédure.)

    Avant l'exécution des procédures, vous devez toutefois connecter l'objet déclaré dans le module de classe avec l'objet Application. Pour ce faire, utilisez le code suivant à partir d'un module quelconque.

    Dim X As New EventClassModule

    Sub InitializeApp()
    Set X.App = Application
    End Sub
    Après l'exécution de la procédure InitializeApp, l'objet App du module de classe pointe sur l'objet Application de Microsoft Excel et les procédures d'événements du module de classe s'exécutent lorsque les événements se produisent.
    Bon courage

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    Salut,

    J'ai essayé tes propositions et ca ne marche pas (le message continue à apparaître et dès fois le bouton "oui" fait la même chose que le bouton "non" ). A coup de commentaire, j'ai fini par découvrir que le problème viens de la méthode "Créer_Bouton" (création d'OLEObject) et de l'utilisation d'ActiveSheet ensuite.

    Par contre, j'ai trouvé une solution (ce weekend, mon boulot me hante ) pour "Option Explicit". Je fait tout simplement un test pour voir s'il a été ajouté automatiquement à la création de la page et je l'efface si c'est le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Destination.CodeModule.Lines(1, 2) = "Option Explicit" Then
        Destination.CodeModule.DeleteLines 1, 2 'effacement du Option Implicit pour pas faire de doublon
    End If
    Pour l'autre problème, je vais plus pouvoir chercher une soluce à cause de la deadline, je vais donc faire une doc et une semaine de sav :p

    Je ne met pas en résolu, au cas où quelqu'un connait / trouve une solution.

    Merci pour l'aide ++

Discussions similaires

  1. [XL-2007] Refaire des fonctions d'Excel par macro
    Par npo25 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/11/2010, 14h31
  2. Configuration des message bundles utilisés par struts
    Par tomcruz dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/02/2010, 12h33
  3. Réponses: 0
    Dernier message: 24/02/2009, 22h01
  4. Configuration des options Web Part
    Par edophie dans le forum SharePoint
    Réponses: 10
    Dernier message: 11/12/2008, 17h53
  5. Réponses: 3
    Dernier message: 14/04/2006, 10h43

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