컴퓨터/엑셀

vba 합계 application.function.sum vs 배열 합계

풍경소리^^ 2021. 2. 20. 09:02
Option Explicit
Sub sumif하기()
Dim str As Variant
Dim cot As Integer
    str = "가"
    cot = Application.WorksheetFunction.SumIf(Range("B2:B12"), str, Range("C2:C12"))
    MsgBox cot
End Sub
Sub f_randbetween()
    Dim i As Long
    Dim start_time As Date
    Dim end_time As Date
    Dim running_time As Date
    start_time = Timer
    For i = 2 To 65000
        Sheets("Sheet1").Range("a" & i) = Application.WorksheetFunction.RandBetween(60, 99)
    Next i
    end_time = Timer
    running_time = end_time - start_time
    MsgBox Format(running_time, "0.000000초")
End Sub
Sub f_sum()
    Dim start_time As Date
    Dim end_time As Date
    Dim running_time As Date
    start_time = Timer
    Sheets("Sheet1").Range("F" & 1) = Application.WorksheetFunction.Sum(Range("A2", "A65000"))
    end_time = Timer
    running_time = end_time - start_time
'    MsgBox start_time & vbCrLf & end_time & vbCrLf & Format(running_time, "0.000000초")
    Sheets("Sheet1").Range("E" & 1) = "함수"
    Sheets("Sheet1").Range("G" & 1) = Format(running_time, "0.000000초")
End Sub
Sub f_sum_arr()
    Dim start_time As Date
    Dim end_time As Date
    Dim running_time As Date
    Dim a(64998)
    Dim i As Long
    Dim sum_i As Long
    Dim s As Long
    start_time = Timer
    s = 0
    For i = 0 To 65000 - 2
        s = s + Sheets("Sheet1").Range("A" & i + 2)
    Next i
    end_time = Timer
    running_time = end_time - start_time
'    MsgBox "합계는 " & s & "입니다." & vbCrLf & Format(running_time, "0.0000초")
    Sheets("Sheet1").Range("E" & 2) = "배열"
    Sheets("Sheet1").Range("F" & 2) = s
    Sheets("Sheet1").Range("G" & 2) = Format(running_time, "0.000000초")
End Sub
Sub con()
    Call f_sum
    Call f_sum_arr
    Call f_sum_Evaluate
    MsgBox "계산완료"
End Sub
Sub f_sum_Evaluate()
    Dim wbTemp As Workbook
    Dim strSum As String
    Dim start_time As Date
    Dim end_time As Date
    Dim running_time As Date
'    For Each wbTemp In Workbooks
'      If wbTemp.Name Like "파트#*" Then
'        strSum = strSum & "+'[" & wbTemp.Name & "]Sheet1'!A2:C2"
'      End If
'    Next wbTemp
    start_time = Timer
'    strSum = ThisWorkbook.Path + "Sheet1!A2:A65000"
    strSum = "sum(A2:A65000)"
    Range("F3").Value = Application.Evaluate(strSum)
    end_time = Timer
    running_time = end_time - start_time
'    MsgBox "합계는 " & s & "입니다." & vbCrLf & Format(running_time, "0.0000초")
    Sheets("Sheet1").Range("E" & 3) = "Evaluate"
    Sheets("Sheet1").Range("G" & 3) = Format(running_time, "0.000000초")
End Sub
Sub workbook_sum2()
Dim wbTemp As Workbook
Dim varSum As Variant
Dim i As Long
'    For Each wbTemp In Workbooks
'      If wbTemp.Name Like "파트#*" Then
'        varTemp = wbTemp.Sheets(1).Range("A2:C2").Value
'        varSum = arr_sum(varSum, varTemp)
'      End If
'    Next wbTemp
    Range("A2:C2").Value = varSum
End Sub
Function arr_sum(arr1 As Variant, arr2 As Variant) As Variant
'2차원 배열간의 합계
Dim lngi As Long, lngj As Long
Dim lngk As Long, lngl As Long
Dim arrTemp() As Variant
    lngi = UBound(arr2, 1)
    lngj = UBound(arr2, 2)
    If IsArray(arr1) Then
      ReDim arrTemp(1 To lngi, 1 To lngj)
      For lngk = 1 To lngi
        For lngl = 1 To lngj
          arrTemp(lngk, lngl) = arr1(lngk, lngl) _
            + arr2(lngk, lngl)
        Next lngl
      Next lngk
      arr_sum = arrTemp
    Else
      arr_sum = arr2
    End If
End Function