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 :

[Excel] Problème d'activation de Workbook


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut [Excel] Problème d'activation de Workbook
    Bonjour,

    J'ai eu une désagréable surprise. J'explique la situation :
    1) J'ai géré l'événement d'activation d'une des feuilles de mon classeur actif (la n°5) :
    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 Worksheet_Activate()
        Dim Current_File As String
        Current_File = ActiveWorkbook.Name
     
        Dim file As String
        file = ThisWorkbook.GetStatusFile()
        If ThisWorkbook.IsFileOpen(file) Then
        Else
            Workbooks.Open (file)
            Workbooks(Current_File).Activate
        End If
    End Sub
    Où IsFileOpen() retourne vrai si le fichier passé en paramètre est déjà ouvert.
    Indépendamment ça marche très bien : ouverture du fichier s'il n'est pas déjà ouvert puis retour sur le classeur initial.

    2) J'ai créé une macro qui insère une ligne dans plusieurs feuilles de mon classeur actif :
    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
     
    Sub InsererLigne()
     
        Dim NumRow As Long, LastNumRow As Long
        Dim InitSheet As String
     
        NumRow = ActiveCell.Row         ' line number
        InitSheet = ActiveSheet.Name    ' Name of sheet were we are on beginning
     
     
     
        '***** Feuille 1
        Sheets("Feuil1").Activate
        'On insère la ligne sélectionnée
        Rows(NumRow).Select
        Selection.Insert Shift:=xlDown
     
     
    [...]        
     
     
        '***** Feuille 5
        Sheets("Feuil5").Activate
        'On insère la ligne sélectionnée
        Rows(NumRow).Select
        Selection.Copy
        Selection.Insert Shift:=xlDown
     
     
     
        '***** On revient sur la feuille initiale
        Sheets(InitSheet).Activate
     
    End Sub
    Le problème intervient quand on arrive sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil5").Activate
    et que le fichier n'est pas déjà ouvert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.IsFileOpen(file) = false
    On rentre alors dans le code de la méthode Worksheet_Activate placée plus haut et en fait, celle-ci s'arrête au niveau du Quelqu'un peut-il me dire pourquoi et comment contourner ce problème, s'il vous plaît? Je ne comprends pas ce qui bloque...

    Merci d'avance.

  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
    Oui, tu utilises un mot clé comme variable (file). VBA n'aime pas du tout. Remplace File par "NomFich" ou ce que tu veux. FileName est aussi un mot clé
    Tu dis
    A+

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Euh ben non, c'est pas ça. J'ai quand même fait la modif, mais ça exécutait la ligne mais ça ne faisait pas la suite.
    Je me suis dit que ça venait de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(Current_File).Activate
    , mais je l'ai remplacée par et la boîte de dialogue n'apparaît pas.

    Bon comme je suis le roi de l'esquive, j'ai contourné le problème en faisant mes insertions sans sélectionner les différentes feuilles.

    Mais je serai quand même curieux de savoir pourquoi la version initiale ne fonctionnait pas... (et c'est pour ça que je ne mets pas le tag "Résolu" )

  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
    Tu emploies Thisworkbook or, regarde l'aide :
    Cette propriété renvoie un objet Workbook qui représente le classeur dans lequel s'exécute le code de la macro en cours. En lecture seule.
    Le résultat, ton test te renseigne sur le fichier contenant les macro, pas sur le fichier que tu souhaites ouvrir. Jète un oeil dans l'aide, un exemple t'éclairera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.DialogSheets(1).Show
    Cette propriété ne peut être utilisée qu'à partir de Microsoft Excel. Il est impossible de l'utiliser pour accéder à un classeur à partir d'une autre application.
    Remplace Thisworkbook par WorkBooks(NomFich)
    Et NomFich, récupère-le ailleurs que dans ta ligne
    file = ThisWorkbook.GetStatusFile()
    A+

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je ne vois pas trop en quoi l'utilisation de ThisWorkbook pose problème ici...
    Voici le code de ma méthode IsFileOpen :
    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
     
    ' Méthode permettant de savoir si un fichier est déjà ouvert
    Public Function IsFileOpen(filename As String)
        Dim filenum As Integer, errnum As Integer
     
        On Error Resume Next
        filenum = FreeFile()
        Open filename For Input Lock Read As #filenum
        Close filenum
        errnum = Err
        On Error GoTo 0
        Select Case errnum
            Case 0
            IsFileOpen = False
            Case 70
            IsFileOpen = True
            Case Else
            Error errnum
        End Select
    End Function
    qui est définie dans ThisWorkbook.

    Mon test passe bien, c'est ensuite que ça ne fonctionne plus correctement, lorsque j'utilise justement les Workbooks (et que l'évènement d'activation de feuille dans lequel se situe mon code est lancé depuis une macro) .

Discussions similaires

  1. [VBA pour Excel] Différence entre activate et select
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/10/2008, 17h20
  2. Réponses: 1
    Dernier message: 01/11/2005, 12h04
  3. ORA-01190 Problème après Activation BDD Standby
    Par Sergio_free dans le forum Oracle
    Réponses: 2
    Dernier message: 23/10/2005, 00h38
  4. [Excel] Problème avec l'accès aux feuilles et aux cellules
    Par bl00df0x dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 30/09/2005, 14h21
  5. [C#] Excel : problème de référencement
    Par cdurand dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/03/2005, 11h28

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