Comment faire des calculs récursifs dans Excel?

4

J'ai un grand classeur et je veux une feuille de calcul principale qui calcule les champs de toutes les feuilles de calcul. Je sais que je peux simplement sélectionner une cellule dans une feuille de calcul en nommant explicitement la feuille de calcul, puis la ligne qui m'intéresse. Cependant, existe-t-il un moyen de sélectionner récursivement une cellule afin que, lorsque j'ajoute plusieurs feuilles de calcul, elles soient automatiquement inclus dans le champ calculé dans la feuille de calcul principale?

Walter Cecil Worsley IV
la source
Êtes-vous d'accord avec l'utilisation de VBA?
Excellll
Pouvez-vous préciser un peu plus ce dont vous avez besoin? Que voulez-vous dire par "calcule les champs de toutes les feuilles de calcul"? Voulez-vous additionner les cellules de toutes les feuilles de calcul? De quel calcul parlez-vous?
Peter Albert
2
Vous voulez probablement dire boucle et non récursivité. Des approches assez différentes.
Lee Taylor

Réponses:

2

Une solution consiste à utiliser une fonction VBA que vous pouvez appeler dans une formule. La fonction ci-dessous renvoie le contenu d'une adresse de cellule (cela ne fonctionnera pas pour les plages dans sa forme actuelle) dans toutes les feuilles de calcul autres que la feuille active.

Public Function AcrossSheets(rngAddress As String, Optional includeThisSheet As Boolean = False, Optional wText As String) As Variant
Application.Volatile
Dim tmpResults As String, ws As Worksheet
If includeThisSheet Then
    For Each ws In Worksheets
        If wText <> "" Then
            If InStr(ws.Name, wText) <> 0 Then
                tmpResults = tmpResults & ws.Range(rngAddress).Value & ", "
            End If
        Else
            tmpResults = tmpResults & ws.Range(rngAddress).Value & ", "
        End If
    Next ws
Else
    For Each ws In Worksheets
        If ws.Name <> ActiveSheet.Name Then
            If wText <> "" Then
                If InStr(ws.Name, wText) <> 0 Then
                    tmpResults = tmpResults & ws.Range(rngAddress).Value & ", "
                End If
            Else
                tmpResults = tmpResults & ws.Range(rngAddress).Value & ", "
            End If
        End If
    Next ws
End If
tmpResults = Left(tmpResults, Len(tmpResults) - 2)
AcrossSheets = Split(tmpResults, ", ")
End Function

Pour utiliser ce code, appuyez sur Alt + F11 Dans Excel, insérez un nouveau module et collez le code.

Donc, si, par exemple, vous voulez additionner les valeurs de B2 de chaque feuille autre que la feuille active, vous utiliseriez la formule matricielle suivante (entrée en appuyant sur Ctrl + Décalage + Entrer ):

=SUM(VALUE(AcrossSheets("B2")))

Pour inclure la valeur de B2 sur la feuille active, utilisez la formule suivante:

=SUM(VALUE(AcrossSheets("B2",TRUE)))

Pour ne résumer que les valeurs de B2 sur les feuilles qui incluent "Mensuel" dans le nom de la feuille (sans inclure la feuille active), utilisez la formule suivante:

=SUM(VALUE(AcrossSheets("B2",FALSE,"Monthly")))

Notez deux choses:

  1. AcrossSheets retourne un tableau de valeurs. Pour cette raison, il ne devrait être utilisé que dans les formules matricielles.
  2. Le tableau retourné par AcrossSheets contient des valeurs sous forme de chaînes (texte). Si vous vous attendez à ce que la fonction retourne des données numériques (comme dans les exemples ci-dessus), vous devez envelopper l'appel de fonction VALUE(). Cela convertira les données de chaîne en données numériques.
Excellll
la source