OVH Cloud OVH Cloud

Restreinte Workbook_SheetChange

2 réponses
Avatar
Fonzzie31
Bonjour,

Je souhaiterais créer une macro qui se déclenche lors du changement de données sur les feuilles, sauf que :

Le déclenchement n'opérerait pas s'il y a un changement sur la feuille appellée "== RECAP ==", quelque soit la colonne.
Le déclenchement s'opèrerait sur les autres feuille du classeur, particulièrement sur la colonne A.

Mon objectif est d'arriver à ceci.

Hormis la feuille "== RECAP ==", les autres feuilles sont sur le même modèle : Un tableau 3 colonnes nommées "Collection", "Date", "Remarque".
La feuille "== RECAP ==" va faire une synthèse des autres feuilles. La macro va faire la liste des Collections dans les autres feuilles et me donner pour le nombre d'occurrences sur l'ensemble des autres feuilles pour chaque collection.

J'ai déjà créé une fonction publique de ce type pour avoir le nombre d'occurrence :

Public Function MultiSheets_Find(A_Chercher As String)

Dim Sh As Worksheet
Dim cellule As Range
Dim t As Integer
Dim Csheet As Integer
Dim occurrence As Integer

occurrence = 0
Csheet = 0

For Each Sh In ThisWorkbook.Worksheets
Csheet = Csheet + 1
If (Csheet > 1) Then
For Each cellule In Sh.UsedRange
If Not (IsError(cellule.Value)) Then
If (cellule.Value = A_Chercher) Then
occurrence = occurrence + 1
End If
End If
Next cellule
End If
Next Sh

MultiSheets_Find = occurrence

End Function

Mais cela reste manuel, car je dois entrer manuellement la formule dans la cellule pour avoir le résultat. De plus le résultat ne s'actualise pas s'il y a un changement dans les feuilles.

Je voudrais donc automatiser la chose.
Le problème que j'ai là, c que je n'arrive pas à resteindre le scope de Workbook_SheetChange comme évoqué ci-dessus.

Merci d'avance de votre aide :)

2 réponses

Avatar
MichD
Bonjour,
Je n'ai pas tout compris, mais voilà un petit exemple de ce que tu peux
faire. J'ai modifié la fonction, elle sera beaucoup plus rapide qu'une
boucle sur chaque cellule. Cependant, cette ligne de code s'applique au
contenu d'une cellule étant du TEXTE . Si tu fais une recherche sur des
dates, cela peut-être problématique. Ta question ne spécifie pas ce que
tu dois rechercher, est-ce une partie du contenu d'une cellule ou le
contenu d'une cellule?
Set Trouve = .Find(What:=A_Chercher, LookIn:=xlValues,
LookAt:=xlWhole)
Place ce code dans le ThisWorkbook du projet...
'-------------------------------------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
If UCase(Sh.Name) <> "== RECAP ==" Then
'la procédure va s'exécuter sauf si la feuille active est : "== RECAP
=="
'Dès qu'une cellule dans les autres feuilles passera en mode édition
'par un double-clic dans la cellule ou en tapant une nouvelle donnée
ou en
'supprimant une donnée existante, la fonction va s'effectuer
MsgBox MultiSheets_Find("toto")
End If
End Sub
'-------------------------------------------------------
Tu mets cette fonction dans un module standard.
'-------------------------------------------------------
Function MultiSheets_Find(A_Chercher As String)
Dim Rg As Range, Trouve As Range
Dim Sh As Worksheet, Occurrence As Long
For Each Sh In Worksheets
If Sh.Name <> "== RECAP ==" Then
Set Rg = Sh.UsedRange
End If
With Rg
Set Trouve = .Find(What:=A_Chercher, LookIn:=xlValues,
LookAt:=xlWhole)
If Not Trouve Is Nothing Then
adr = Trouve.Address
Do
Occurrence = Occurrence + 1
Set Trouve = .FindNext(Trouve)
Loop Until Trouve.Address = adr
End If
End With
Next
MultiSheets_Find = Occurrence
End Function
'-------------------------------------------------------
Avatar
fonzzie31
Le samedi 13 Août 2016 à 16:49 par Fonzzie31 :
Bonjour,
Je souhaiterais créer une macro qui se déclenche lors du
changement de données sur les feuilles, sauf que :
Le déclenchement n'opérerait pas s'il y a un changement sur la
feuille appellée "== RECAP ==", quelque soit la colonne.
Le déclenchement s'opèrerait sur les autres feuille du classeur,
particulièrement sur la colonne A.
Mon objectif est d'arriver à ceci.
Hormis la feuille "== RECAP ==", les autres feuilles sont sur le
même modèle : Un tableau 3 colonnes nommées
"Collection", "Date", "Remarque".
La feuille "== RECAP ==" va faire une synthèse des autres
feuilles. La macro va faire la liste des Collections dans les autres feuilles
et me donner pour le nombre d'occurrences sur l'ensemble des autres feuilles
pour chaque collection.
J'ai déjà créé une fonction publique de ce type
pour avoir le nombre d'occurrence :
Public Function MultiSheets_Find(A_Chercher As String)
Dim Sh As Worksheet
Dim cellule As Range
Dim t As Integer
Dim Csheet As Integer
Dim occurrence As Integer
occurrence = 0
Csheet = 0
For Each Sh In ThisWorkbook.Worksheets
Csheet = Csheet + 1
If (Csheet > 1) Then
For Each cellule In Sh.UsedRange
If Not (IsError(cellule.Value)) Then
If (cellule.Value = A_Chercher) Then
occurrence = occurrence + 1
End If
End If
Next cellule
End If
Next Sh
MultiSheets_Find = occurrence
End Function
Mais cela reste manuel, car je dois entrer manuellement la formule dans la
cellule pour avoir le résultat. De plus le résultat ne
s'actualise pas s'il y a un changement dans les feuilles.
Je voudrais donc automatiser la chose.
Le problème que j'ai là, c que je n'arrive pas à
resteindre le scope de Workbook_SheetChange comme évoqué
ci-dessus.
Merci d'avance de votre aide :)