VB(A)

배열의 합, 최대치 구하기

당근쨈 2015. 7. 28. 06:48
스샷에 있는 숫자들은 한줄로 보면 되는 숫자들.
이 숫자들의 최대값
연속된 2개의 셀의 합의 최대값
연속된 3개의 셀의 합의 최대값
.
.
.
연속된 n개의 셀의 합의 최대값을 구하는 매크로

배열을 이용해 1열로 세우고
합과 최대치를 구하였다.

Option Base 1
Option Explicit
Sub Macro()
 
    Dim rng As Range, rngA As Range
    Dim var1D() As Double, varMax() As Double
    Dim i As Integer, j As Integer, intV As Integer
    Dim cntC As Integer
    Dim rngTemp As Range
 
    '시트2의 기존값 삭제 및 영역 설정
    Sheets(2).Range("A1").CurrentRegion.ClearContents
    Set rngA = Range("A1").CurrentRegion
    cntC = rngA.Columns.Count + 2
 
    '값을 1차원 배열에 삽입
    For Each rng In rngA
        intV = intV + 1
        ReDim Preserve var1D(intV)
        var1D(intV) = rng
    Next rng
 
    '배열을 셀에 재입력(합을 쉽게 하기 위해)
    Set rngTemp = Cells(1, cntC)
    rngTemp.Resize(intV) = Application.Transpose(var1D)
 
    '1~n개씩 더하며 최대값을 시트2에 입력
    Do Until j = intV + 1
        Erase var1D
        j = j + 1
 
        For i = 1 To intV
            ReDim Preserve var1D(i)
            var1D(i) = WorksheetFunction.Sum(Cells(i, cntC).Resize(j))
 
            If i = intV Then
                ReDim Preserve varMax(j)
                varMax(j) = WorksheetFunction.Max(var1D) '연속된 n개의 셀의 합이 가장 큰 값을 배열에 삽입
            End If
        Next i
    Loop
 
    '시트2에 각 최대값을 입력
    Sheets(2).Range("A1").Resize(intV) = Application.Transpose(varMax)
 
    '임시로 입력한 숫자 삭제
    rngTemp.CurrentRegion.Delete
End Sub
cs