Como fazer cálculos recursivos no Excel?

4

Eu tenho um documento grande de planilha e quero ter uma planilha mestre que calcule os campos de todas as planilhas. Eu sei que posso selecionar uma célula de uma planilha nomeando explicitamente a planilha e a linha em que estou interessado. No entanto, existe uma maneira de selecionar recursivamente uma célula para que, à medida que adiciono mais planilhas, elas sejam automaticamente incluído no campo calculado na planilha mestre?

Walter Cecil Worsley IV
fonte
Você está bem em usar o VBA?
precisa saber é o seguinte
Você pode especificar um pouco mais o que precisa? O que você quer dizer com "calcula campos de todas as planilhas"? Deseja somar células em todas as planilhas? Que cálculo você quer dizer?
Peter Albert
2
Você provavelmente quer dizer loop e não recursão. Abordagens bastante diferentes.
Lee Taylor

Respostas:

2

Uma maneira seria usar uma função VBA que você pode chamar em uma fórmula. A função abaixo retornará o conteúdo de um endereço de célula (isso não funcionará para intervalos em seu formulário atual) em todas as planilhas que não sejam a planilha ativa.

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

Para usar esse código, pressione Alt+ F11no Excel, insira um novo módulo e cole o código.

Portanto, se, por exemplo, você quiser somar os valores de B2cada planilha que não seja a planilha ativa, você usaria a seguinte fórmula de matriz (inserida pressionando Ctrl+ Shift+ Enter):

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

Para incluir o valor de B2na planilha ativa, use a fórmula da matriz:

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

Para somar apenas os valores das B2planilhas que incluem "Mensal" no nome da planilha (não incluindo a planilha ativa), use a fórmula da matriz:

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

Observe duas coisas:

  1. AcrossSheetsretorna uma matriz de valores. Por isso, ele deve ser usado apenas em fórmulas de matriz.
  2. A matriz retornada por AcrossSheetscontém valores como seqüências de caracteres (texto). Se você espera de dados numéricos a ser retornado pela função (como nos exemplos acima), você deve envolver a chamada de função no VALUE(). Isso converterá os dados da string em dados numéricos.
Excellll
fonte