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 :

Interférence entre deux classeurs - problème sur Function


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 660
    Par défaut Interférence entre deux classeurs - problème sur Function
    Bonjour,

    J'ai deux applications : TOTO ; TITI

    Dans l'application TOTO, module standard, j'ai une 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
    30
    31
    Function SheetName()
    Dim Mois As String, Dat As Date
    Dim AnnéeEnCours As Integer
     
    '    If ShuntFct = 1 Then Exit Function
     
        AnnéeEnCours = Sheets("Janvier").[a6]
     
        Application.Volatile
        Mois = ActiveSheet.Name
     
        Dat = CDate("01/" & "" & Mois & "" & "/" & AnnéeEnCours)
     
        Select Case Application.Weekday(Dat)
            Case 1
                SheetName = Dat + 3
            Case 2
                SheetName = Dat + 2
            Case 3
                SheetName = Dat + 1
            Case 4
                SheetName = Dat
            Case 5
                SheetName = Dat + 1
            Case 6
                SheetName = Dat
            Case 7
                SheetName = Dat + 4
        End Select
     
    End Function
    Dans cette même application, j'ai des onglets nommés "Janvier ; Février ; Mars ; etc.)

    Dans chaque feuille, j'ai des cellules qui me renvoient une date en fonction du mois qui figure dans le nom de la feuille : =SheetName()

    A noter (et j'ignore si c'est important dans le cas présent) que le classeur est protégé avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Protect()
    Dim i As Integer
     
        For i = 1 To Worksheets.Count
            With Worksheets(i)
                .Protect _
                    DrawingObjects:=True, _
                    Contents:=True, _
                    Scenarios:=True
                .EnableSelection = xlUnlockedCells
            End With
        Next i
    End Sub
    Tout fonctionnait parfaitement depuis des mois, voire plus.

    Depuis peu, si on ouvre le classeur "TITI", toutes les cellules du classeur "TOTO" qui contiennent la formule =SheetName() renvoient des erreurs "#".

    Si je ferme "TITI", l'erreur persiste dans "TOTO".
    Si je ferme "TOTO" et que je le rouvre très rapidement, j'ai le message "TOTO.xlsm est verrouillé pour modification par Utilsateur...". Après deux ou trois essais, le classeur "TOTO" se rouvre mais l'erreur sur les cellules persiste.

    J'ai vérifié (sans grande conviction) qu'il n'y avait pas un "Application.EnableEvents = False" sur l'appli "TITI" qui pourrait shunter la Function de "TOTO" ; en vain !

    Je ne sais plus par quel bout prendre le problème.

    En résumé : Qu'est-ce qui peut bien shunter une Function ? Et dans le cas présent, comment peut-il y avoir une interaction avec un autre classeur (sachant évidemment que ces deux classeurs ne sont (a priori !!) pas liés ?

    Un grand merci pour votre aide éventuelle !
    Cordialement,
    jpma75

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Peut-être à cause de Application.Volatile, essayer d'ajouter Option Private Module en début du module contenant la fonction.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 660
    Par défaut
    Bonjour et merci pour cette proposition !

    Cette Option y figure déjà. J'espère qu'elle est à la bonne place ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
    Public printclick
    Option Private Module
    Function SheetName()
    Dim Mois As String, Dat As Date
    Dim AnnéeEnCours As Integer
    Cordialement,

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Re,

    Elle est à sa place, essaies d'enlever Application.volatile

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 660
    Par défaut
    Bonjour Patrice,

    Merci !!!!!!

    J'avais hâte de faire l'essai ce week-end, mais chez moi je n'ai que la version Excel 2003 ; le convertisseur me permet de lire les fichiers post-2007 mais j'ai fait le constat que tout ne fonctionne pas bien avec les extensions "xlsm" ;-(
    Il faudrait que j'investisse dans une version 2010 même si je crois savoir qu'elle ne sera plus suivi pas MS dès 2020 ?! J'ai trouvé un site marchand mais je n'ose pas te demander ton avis...

    Par curiosité, quelle utilité avait pu (car manifestement, ce problème n'est pas apparu plus tôt) avoir l' "Option.Volatile" ??

    Par ailleurs, si je ferme le classeur et que je le rouvre immédiatement, j'ai toujours le message : "le fichier est verrouillé pour modification par "un autre utilisateur" " - Au bout de 3 essais, il se rouvre ! Mystère.

    Merci encore pour ton aide précieuse,
    Cdt

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Pour qu'elle soit recalculée, telle qu'elle est (mal) écrite, cette fonction doit rester Volatile.
    Le problème qui se pose c'est que lorsqu'un autre classeur est ouvert, elle est recalculée à chaque modification de cet autre classeur, hors tu ne précises pas le classeur dans la fonction.
    Il faudrait écrire :
    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
    Function SheetName()
    Dim Mois As String, Dat As Date
    Dim AnnéeEnCours As Integer
     
        AnnéeEnCours = ThisWorkbook.Sheets("Janvier").[a6]
     
        Application.Volatile
        Mois = ThisWorkbook.ActiveSheet.Name
     
        Dat = CDate("01/" & "" & Mois & "" & "/" & AnnéeEnCours)
     
        Select Case Application.Weekday(Dat)
            Case 1
                SheetName = Dat + 3
            Case 2
                SheetName = Dat + 2
            Case 3
                SheetName = Dat + 1
            Case 4
                SheetName = Dat
            Case 5
                SheetName = Dat + 1
            Case 6
                SheetName = Dat
            Case 7
                SheetName = Dat + 4
        End Select
     
    End Function
    Je ne sais pas quel usage tu fais de cette fonction, mais je la trouve bizarre :
    Elle écrit sur toutes les pages où elle est utilisée la même valeur quel que soit le mois : celle du mois dont la feuille est active

    EDIT : Il me semble préférable d'utiliser :
    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
    Option Private Module
    Option Explicit
    Function SheetName()
    Dim Mois As String, Dat As Date
    Dim AnnéeEnCours As Integer
        Application.Volatile
        AnnéeEnCours = ThisWorkbook.Sheets("Janvier").[a6]
        Mois = Application.Caller.Parent.Name
        Dat = CDate("01/" & "" & Mois & "" & "/" & AnnéeEnCours)
        Select Case Application.Weekday(Dat)
            Case 1
                SheetName = Dat + 3
            Case 2
                SheetName = Dat + 2
            Case 3
                SheetName = Dat + 1
            Case 4
                SheetName = Dat
            Case 5
                SheetName = Dat + 1
            Case 6
                SheetName = Dat
            Case 7
                SheetName = Dat + 4
        End Select
    End Function

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

Discussions similaires

  1. [XL-2007] Problème d'affectation de macro entre deux classeurs
    Par BlackMountain dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/08/2016, 17h28
  2. [XL-2007] Problème actualisation automatique entre deux classeurs liés
    Par edouard47 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/05/2016, 16h14
  3. Données externes entre deux classeurs
    Par hkpsyco dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/10/2007, 13h17
  4. Réponses: 2
    Dernier message: 17/01/2007, 09h22
  5. Réponses: 5
    Dernier message: 16/08/2006, 20h09

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