Bonjour,

J'ai écris une petite formule VBA dont l'objectif est de sommer des valeurs distribuées sur plusieurs feuilles. Les feuilles à prendre en compte sont identifiées dans une cellule via leur nom ex "Sheet1;Sheet2;Sheet3".


J'écris dans
SheetSummary!A1: "Sheet1;Sheet2;Sheet3", et dans
SheetSummary!B10: "=ComputeSummary(SheetSummary!$A$1;0;0)
Ce qui équivaut à
SheetSummary!B10 "=Sheet1!B10+Sheet2!B10+Sheet3!B10"

Mais quand je modifie une des cellules à sommer (ex Sheet1!B10) la formule n'est pas recalculée. Même si je force le calcule (que ce soit en VBA ou manuellement dans la feuille).

Le seul moyen de reforcer le calcul est de rentrer manuellement dans la cellule SheetSummary!B10, de l'éditer (F2) et de taper Enter. Là, la cellule est recalculée.


Ma question est:
comment faire pour que ce recalcule se fasse automatiquement ou, au maximum, sur base d'un SheetSummary.Calculate ?

Merci,

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
Public Function ComputeSummary(SheetNames As String, Optional rowOffset As Integer = 0 _
        , Optional colOffset As Integer = 0) As Double
 
    Dim arrSheetNames
    arrSheetNames = Split(SheetNames, ";")
 
 
    Dim sheetName As Variant
    Dim rge As Range
    Dim res As Double
    Dim sht As Worksheet
    Dim nme As Name
    Dim isError As Boolean: isError = False
 
    res = 0
    For Each sheetName In arrSheetNames
        Debug.Print sheetName
        On Error Resume Next
        Set sht = ThisWorkbook.Worksheets(sheetName)
        If (Err <> 0) Then
            isError = True
            End If
        On Error GoTo 0
        If (isError) Then
            Err.Raise 1, "ComputeSummary", "Unknown sheet """ + sheetName + """"
            End If
        On Error Resume Next
        Set nme = sht.Names("SUMMARY")
        If (Err <> 0) Then
            isError = True
            End If
        On Error GoTo 0
        If (isError) Then
            Err.Raise 2, "ComputeSummary", "Name ""SUMMARY"" not found in """ + sheetName + """"
            'Set nme = ThisWorkbook.Names("SUMMARY")
            'If (Err <> 0) Then GoTo unknownName
            End If
        On Error GoTo 0
        Set rge = nme.RefersToRange.Cells(1, 1).Offset(2 + rowOffset, 2 + colOffset)
        res = res + rge.Value
        Next
 
    ComputeSummary = res
 
End Function