Continuando com a resolução dos meus primeiros exercícios em Vba aqui fica mais um:

Elabore um algoritmo que permita Calcular a Média das Linhas e das Colunas a Partir  da Célula Activa.

Aqui fica o código que resolve o exercício:

Sub MatrixAverageRC()

    Dim InitialCell As Range

    Dim c() As Double
    Dim AverageColumn() As Double, AverageRow() As Double

    Dim s As Double
    Dim nColumns As Integer, nRows As Integer
    Dim i As Integer, j As Integer

    Set InitialCell = ActiveCell

    ' Calcular o número de linhas
    nRows = 0
    Do
        nRows = nRows + 1
    Loop Until IsEmpty(InitialCell.Offset(nRows, 0))

    ' Calcular o número de colunas
    nColumns = 0
    Do
        nColumns = nColumns + 1
    Loop Until IsEmpty(InitialCell.Offset(0, nColumns))

    ' redimensionar os vectores e as matrizes
    ReDim c(1 To nRows, 1 To nColumns)
    ReDim AverageColumn(1 To nColumns)
    ReDim AverageRow(1 To nRows)

    ' guardar valores das células na matriz c()
    For j = 1 To nRows ' linha
        For i = 1 To nColumns ' coluna
            c(j, i) = InitialCell.Offset(j - 1, i - 1).Value
        Next i
    Next j

    ' calcula a média das linhas
    For j = 1 To nRows ' linhas
        s = 0
        For i = 1 To nColumns ' colunas
           s = s + c(j, i)
        Next i
        AverageRow(j) = s / nColumns ' calcula a média e guarda

        ' Apresenta a média numa célula
        ActiveCell.Offset(j - 1, nColumns).Value = AverageRow(j)
        ActiveCell.Offset(j - 1, nColumns).Font.Bold = True
    Next j

    ' calcula a média das colunas
    For i = 1 To nColumns ' colunas
        s = 0
        For j = 1 To nRows ' linhas
           s = s + c(j, i)
        Next j
        AverageColumn(i) = s / nRows ' calcula a média e guarda

        ' Apresenta a média numa célula abaixo
        ActiveCell.Offset(nRows, i - 1).Value = AverageColumn(i)
        ActiveCell.Offset(nRows, i - 1).Font.Bold = True
    Next i
End Sub

Não sei se a forma como implementei a resolução do exercício é a mais correcta, e por isso fico à espera de comentários, ou mesmo de correcções e dicas de melhoramento do código que apresento.

Share

Leave a Reply