Macro vs classeur de macros personnelles

Bonjour à toutes et tous,

Encore une fois grace à des recherches sur ce forum, j'ai pu récupérer et tenter d'adapter un code pour un de mes projets.

Je cherche a signaler à l'utilisateur qu'il ne peut y avoir qu'un seul classeur ouvert sur sa session Excel, celui qui contient la macro et qu'il donc fermer tous les autres pour lancer la procédure. (cf msgbox)

Ainsi un msgbox lui indique que au moins autre fichier que celui qui doit lancer la macro finale est ouvert et lui demande de fermer tous les autres documents. Ou si Ok, je laisse la procédure s'exécuter (dans le fichier exemple un msgbox "ok").

Or avec le code dont je me suis inspiré, même si seul mon classeur portant la macro est ouvert le msgbox indique quand même qu'il y a un classeur ouvert.

Comme si l'instruction : If Wbk.Name <> ThisWorkbook.Name renvoyait toujours systématiquement oui.

Est ce que cela peut être lié à mon classeur de macros personnelles (présent dans editeur vb à chaque ouverture Excel) ?

Comment faire en sorte que mon code soit quasi universel et fonctionne sur toutes les configurations utilisateurs ?

En attente de vos conseils

Merci

Cordialement

Hugues

Sub classeur()
Dim Wbk As Workbook

  For Each Wbk In Workbooks

    If Wbk.Name <> ThisWorkbook.Name Then
     MsgBox ("Il y'a au moins un autre classeur ouvert en plus du classeur ou la macro est lancée." & Chr(10) & Chr(10) & "Tous les classeurs doivent être fermés sauf celui qui lance la macro !" & Chr(10) & Chr(10) & "Merci de corriger et de relancer procedure !")

         Else
         MsgBox ("ok")

    End If

  Next

End Sub
13test-classeur.xlsm (32.75 Ko)

Bonsoir,

Il faut que tu exclues également ton classeur perso du test !

Cordialement.

Bonjour,

Essaie ainsi :

Public Sub DEMO()
Dim wb As Workbook, i As Long, sText As String
    For Each wb In Workbooks
        If Windows(wb.Name).Visible Then i = i + 1
    Next
    If i = 1 Then
        MsgBox ("OK")
    Else
        sText = "Il y a " & i & " classeurs ouverts." & Chr(10)
        sText = sText & "Tous les classeurs doivent être fermés sauf celui qui lance la macro !" & Chr(10)
        sText = sText & "Merci de corriger et de relancer procedure !"
        MsgBox sText, vbOKOnly + vbExclamation, "Alerte"
    End If
End Sub

Bonjour Jean Eric et MFerrand,

Merci pour la rapidité de vos réponses

Jean Eric :

If Windows(wb.Name).Visible Then i = i + 1 me renvois erreur d'exécution 9, l'indice n'appartient pas à la selection.

Peut être est ce lié à ma version Excel MAC 2016. Je vais tester demain sur une machine windows.

MFerrand :

Donc tu semble confirmer que mon classeur de macros personnelles peut avoir une incidence. Aurait tu une piste pour tester présence de ce classeur ?

Je continue à chercher.

Bien à vous

Merci

Cordialement

Hugues

Re,

j'ai testé sous Windows, et la procédure est fonctionnelle.

Pour Mac, je ne sais pas...

Cdlt.

Il a un nom...

Utilise Select Case :

    Select Case wbk.Name
        Case ThisWorkbook.Name, "Perso.xlsb"
        Case Else
            'là c'est qu'un autre classeur est ouvert
    End Select

Cordialement.

Bonjour à toutes et tous,

Jean Eric, MFerrand encore merci pour votre contribution.

MFerrand, je n'ai pas réussi a adapter correctement Select Case (mais je vais continuer mes recherches sur cette instruction que je ne connaissais pas). Sachant que je n'ai pas approfondi outre mesure car finalement (grâce à tes conseils) je ne veux pas faire référence au nom du classeur des macros personnelles qui peut être différents en fonction de l'utilisateur et du système Mac ou Windows.

Même si je me doute bien qu'un code universel compatible toutes machines, toutes configurations, tout utilisateurs, etc... est un GRAAL inaccessible en VBA Excel j'ai retenu la solution de Jean Eric adaptée comme ci après qui fonctionne aussi bien sur mon Excel Mac que sur Excel Windows.

Merci à vous 2, sans oublier l'aide en ligne de Google.

En attendant 2017 pour laquelle je vous souhaite le meilleur.

Cordialement

Hugues

Public Sub JeanEric()
Dim wb As Workbook, i As Long, sText As String
Dim VisibleOnly As Boolean

    For Each wb In Workbooks
    If VisibleOnly = True Or (VisibleOnly = False And wb.Windows(1).Visible = True) Then i = i + 1
    Next
    If i = 1 Then
        MsgBox ("OK")
    Else
        sText = "Il y a " & i & " classeurs ouverts." & Chr(10)
        sText = sText & "Tous les classeurs doivent être fermés sauf celui qui lance la macro !" & Chr(10)
        sText = sText & "Merci de corriger et de relancer procedure !"
        MsgBox sText, vbOKOnly + vbExclamation, "Alerte"
    End If
End Sub

Bonjour,

Tu pourrais certainement réduire à :

Public Sub JeanEric()
Dim wb As Workbook, i As Long, sText As String
    For Each wb In Workbooks
        If wb.Windows(1).Visible Then i = i + 1
    Next
    If i = 1 Then
        MsgBox ("OK")
    Else
        sText = "Il y a " & i & " classeurs ouverts." & Chr(10)
        sText = sText & "Tous les classeurs doivent être fermés sauf celui qui lance la macro !" & Chr(10)
        sText = sText & "Merci de corriger et de relancer la procédure !"
        MsgBox sText, vbOKOnly + vbExclamation, "Alerte"
    End If
End Sub

Bonjour Jean Eric,

J'ai effectivement retenu ta dernière proposition qui réduit encore le code

Merci

Cordialement

Hugues

Rechercher des sujets similaires à "macro classeur macros personnelles"