Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Erreur VBA lorsqu'un membre n'appartient pas à la collection

bond

XLDnaute Occasionnel
Dans une macro complémentaire, j'alimente une collection choisie des fichiers qui sont en ouverture (ici dummy.xls et tresorerie.xls) :
Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
If InStr(1, LCase(Wb.Name), "dummy") + _
InStr(1, LCase(Wb.Name), "tresorerie") >= 1 Then
WbNames.Add Item:=Wb.Name, Key:=Wb.Name
For WbName = 1 To WbNames.Count
MsgBox "Ouverture détectée du fichier : " & WbNames(WbName)
Next WbName
End If
End Sub
Jusque là pas de problème. Toujours dans cette macro complémentaire, un autre sub doit faire une action lorsque sur les fichiers de cette collection, toujours pas de pb :
Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim W As Workbook
For Each W In Workbooks
If W.Name = WbNames.Item(W.Name) Then
MsgBox "Action"
End If
Next W
End Sub
Le problème : Comment éviter l'arrêt sur erreur vba pour les fichiers en dehors de cette collection ?

Merci d'avance.

Pour compléter ce post avec ma doc complète voici le sub complémentaire et préalable au fonctionnement général :
Option Explicit
Public WithEvents App As Application
Public WbName, WbNames As New Collection
Private Sub Workbook_Open()
' Activation de la macro complémentaire '
MsgBox "Hello ! Macro complémentaire ouverte et en arrière plan"
Set App = Application
End Sub
 

James007

XLDnaute Barbatruc
Re : Erreur VBA lorsqu'un membre n'appartient pas à la collection

Re, Salut Pierrot

Bien vu ... ton astuce est une solution qui va fonctionner ...
Mais moi aussi je suis super surpris par ce code sans module de classe ...

A+
 

bond

XLDnaute Occasionnel
Re : Erreur VBA lorsqu'un membre n'appartient pas à la collection

Je confirme, ça tourne !
Je ne suis pas familier avec les modules de classe, sans y passer 1 milliard d'heures, si t'as une suggestion par ce biais...

En tout cas, merci à vous, James et Pierrot de vous être pencher sur ce cas.
 

bond

XLDnaute Occasionnel
Re : Erreur VBA lorsqu'un membre n'appartient pas à la collection

Alors si je m'inspire du fil, je réorganise le code comme ça :
Dans ThisWorkbook
Code:
Option Explicit
Private Sub Workbook_Open()
    Set z.App = Application
End Sub
Dans Module1
Code:
Option Explicit
Public z As New Classe1
Public WbName, WbNames As New Collection
Dans Classe1
Code:
Option Explicit
Public WithEvents App As Application
Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
    If InStr(1, LCase(Wb.Name), "dummy") + _
        InStr(1, LCase(Wb.Name), "tresorerie") >= 1 Then
            WbNames.Add Item:=Wb.Name, Key:=Wb.Name
            For WbName = 1 To WbNames.Count
                MsgBox "Ouverture détectée du fichier : " & WbNames(WbName)
            Next WbName
    End If
End Sub
Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim W
If WbNames.Count > 0 Then
    For Each W In WbNames
        If Sh.Parent.Name = W Then
            MsgBox "Action"
        End If
    Next W
End If
End Sub

Mais je ne comprends pas ce que ça change...
et je ne sais pas ce que ça permet de faire en plus ou en mieux (?)
 

Pierrot93

XLDnaute Barbatruc
Re : Erreur VBA lorsqu'un membre n'appartient pas à la collection

Re,

perso verrais cela ainsi :
dans thisworkbook :
Code:
Option Explicit
Private Sub Workbook_Open()
    Set z.App = Application
End Sub
dans un module standard :
Code:
Option Explicit
Public z As New Classe1
dans le module de classe :
Code:
Option Explicit
Public WithEvents App As Application
Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Parent.Name Like "dummy*" Or Sh.Parent.Name Like "tresorerie*" Then MsgBox "Action"
End Sub

Maintenant, à voir la finalité de tout ceci...
 

bond

XLDnaute Occasionnel
Re : Erreur VBA lorsqu'un membre n'appartient pas à la collection

Même conclusion de MJ13 :

Pierrot, tu es un génie !

Voilà, maintenant je peux identifier l'ouverture de certains fichiers (utilisés sur un réseau), déceler l'activité -voire l'inactivité- sur ceux ci et informer l'utilisateur afin qu'il ne bloque pas le fichiers pour d'autres personnes ; mais ça c'est la suite du code que je vais poser.

Mille Mercissss, encore.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…