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,
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 |
Partager