Bonjour,

Je commence mon apprentissage dans la programmation de macros sous Excel 2010.
Mais je me heurte à quelques soucis sur une macro que je souhaiterais mettre en place sur un fichier excel.

Le fichier excel en question contient un certain nombre de feuilles, dont une appelée "== RECAP ==". Des feuilles sont rajoutées au fur et à mesure dans le classeur.
Sur toutes les feuilles hors "== RECAP ==", la structure du tableau est la même : 4 Colonnes A,B,C,D au format texte (intitulées 'Collection','Titre','Date','Commentaires'). La ligne 1 correspond aux intitulés. La ligne 2 marque le début des données
Les colonnes sont au même endroit, d'une feuille à l'autre. La seule différence est la longueur du tableau qui varie d'une feuille à l'autre.
Sur chaque page, hors "== RECAP ==", une valeur texte "Liste Complète" est positionnée sur la cellule F2

Ce qui donne une feuille type qui ressemble à ça :
Nom : Capture.JPG
Affichages : 539
Taille : 127,8 Ko

Sur la page '== RECAP ==', actuellement vide, je souhaiterais effectuer les choses suivantes :

Au changement d'une feuille hors "== RECAP ==" ayant la valeur "Liste Complète" en F2 :

1). Sur la colonne A de la page "== RECAP ==", afficher à partir cellule A2 (1 colonne, xx lignes), par ordre alphabétique, la liste des valeurs uniques de la colonne "Collection" des autres feuilles. L'intitulé de colonne (ligne 1) ne doit pas faire partie des valeurs.
2). Sur la colonne B de la page "== RECAP ==", afficher à partir cellule B2, le nombre d'occurrences de chaque valeur listée en colonne A, sur toutes les feuilles du classeur (hormis "== RECAP ==").

Pour arriver à mes fins, j'ai commencé à pondre la macro suivante :

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 
'Suspensions temporaires pour la macro
Application.ScreenUpdating = False
 
'Déclaration des variables
Dim TempColl() As String
 
Dim ChekCell As String
Dim Cellule As Range
Dim CollNames() As String
Dim a, b, c, d, e As Integer
 
 
' ****** Programme Principal ******
a = 0
ChekCell = ""
Oldchek = ""
 
' ==== Etape 1 : Récupérer valeurs uniques
 
If (Sh.Name <> "== RECAP ==") Then
 
 For Each Sh In ThisWorkbook.Worksheets
  If (Sh.Name <> "== RECAP ==") Then
   For Each Cellule In Sh.Range("A2:A50")
    If Not (IsError(Cellule.Value)) And (Oldchek <> Cellule.Value) Then
     If (InStr(1, ChekCell, Cellule.Value) = 0) Then
      If (a > 0) Then ChekCell = ChekCell + "-"
      'TempColl(a, 1) = Cellule.Value
      ChekCell = ChekCell + Cellule.Value
      Oldchek = Cellule.Value
      a = a + 1
     End If
    End If
   Next Cellule
  End If
 Next Sh
 
CollNames = Split(ChekCell, "-")
 
' ==== Etape 2 : Tri ordre alphabétique
' ==== Etape 3 : Affichage liste (1 colonne, xx lignes)
' ==== Etape 4 : Affichage des occurrence
 
End If
'Reactivations pour la macro
 
Application.ScreenUpdating = True
 
End Sub
Pour la recherche multifeuilles, j'ai créé une fonction qui hélas ne s'actualise pas automatiquement, quand je l'insère en tant que formule dans la cellule :

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
Public Function MultiSheets_Find(A_Chercher As String)
 
Dim Sh As Worksheet
Dim Cellule As Range
Dim occurrence As Integer
 
occurrence = 0
 
For Each Sh In ThisWorkbook.Worksheets
 If (Sh.Name <> "== RECAP ==") Then
  For Each Cellule In Sh.Range("A2:A40")
    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

Plusieurs questions me viennent alors :

- Comment restreindre Workbook_SheetChange aux feuilles hors "== RECAP ==" ayant la valeur texte "Liste Complète" en F2 ?

- Sur la Private Sub, j'ai du mettre en commentaire la ligne TempColl(a, 1) = Cellule.Value. Cette ligne me renvoie l'erreur "L'indice n'appartient pas à la sélection".
Je n'ai pas réussi à déterminer l'origine du problème. Du coup, je l'ai contourné en utilisant la commande Split.

- Comment classer par ordre alphabétique la variable tableau CollNames avant de l'afficher ?

- Comment afficher le contenu de la variable CollName sur la feuille "== RECAP ==" à partir de la cellule A22 (1 colonne, xx lignes) ?

Si vous pouviez m'aider à résoudre ces divers points, cela serait génial.
De plus, si vous voyez des optimisations à effectuer sur mon code, je serai ravi de les connaitre.

D'avance merci