No MS Excel podemos usar matrizes (array) para calcular e manipular dados. Também podemos usar um código para armazenar os valores de um Range de células numa matriz. Este código adiciona uma coluna e linha a um Range retangular de células que terá os totais de cada linha e coluna da região.
Este código lerá os dados do Range na planilha ativa, armazenará os dados na matriz, somando cada linha e coluna, e depois colocará a saída na planilha. O tamanho da matriz será determinado pelo número de células do Range selecionado.
Nota: Este código não adicionar quaisquer fórmulas à sua planilha, por isso, se os números do intervalo sofrerem mudança, o código deve ser executado novamente.
Sub TotalRowsAndColumns() ' This macro assumes that you have selected any cell or group of ' cells within a rectangular region of cells that you would ' like to have totaled. The totals will appear in the row ' below and the column to the right of the current region. Dim r As Integer Dim c As Integer Dim i As Integer Dim j As Integer Dim myArray As Variant ' Declaring myArray as a Variant prepares it to receive a ' range of cells. At that point it is transformed automatically ' into an array with beginning subscript myArray(1,1). 'Refer to the region surrounding the current selection. With Selection.CurrentRegion Let r = .Rows.Count Let c = .Columns.Count'Resize for totals row and column and place into array. Let myArray = .Resize(r + 1, c + 1)' In the following nested loop, the variable i keeps ' track of the row number, while j keeps track of the ' column number. Every time j cycles through the ' available columns, i gets incremented by one and j ' starts the cycle from one to c all over again. For i = 1 To r For j = 1 To c 'total for row i Let myArray(i, c + 1) = myArray(i, c + 1) + myArray(i, j)'total for column j Let myArray(r + 1, j) = myArray(r + 1, j) + myArray(i, j)'grand total Let myArray(r + 1, c + 1) = myArray(r + 1, c + 1) + myArray(i, j)Next j Next i ' Return the array, which now contains an extra row ' and column for the totals, to the worksheet. Let .Resize(r + 1, c + 1) = myArrayEnd With End Sub