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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 '-------------------------------------------------------
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
'-------------------------------------------------------
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 '-------------------------------------------------------
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 :)
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 :)
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 :)