web-dev-qa-db-ja.com

VBAでSUM()を使用する

ワークシートに追加するセルのセットがある場合、次の式を使用できます。

_=SUM(Sheet1!A1:A10)
_

サブでこれを行うには、次を使用します:

_Sub example1()
    Dim r As Range, v As Variant

    Set r = Sheets("Sheet1").Range("A1:A10")
    v = Application.WorksheetFunction.Sum(r)
End Sub
_

ただし、多くのワークシートに単一のセルを追加する場合は、次の式を使用します。

_=SUM(Sheet1:Sheet38!B2)
_

VBAのシート全体でExcelの範囲を指定

_Sub dural()
    v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
End Sub
_

2つの回避策があります。ループをプログラムすることで合計を計算できます。

_Sub example2()
    Dim i As Long
    Dim v As Variant

    v = 0
    For i = 1 To 38
        v = v + Sheets(i).Range("B2")
    Next i
End Sub
_

またはEvaluate()を使用して:

_v = Evaluate("Sum(Sheet1:Sheet3!B2)")
_

この計算にApplication.WorksheetFunction.Sum()を使用することは可能ですか、それともループを固定する必要がありますか?

11
Gary's Student

Worksheetfunction.sumの問題は、文字列ではなく評価するために引数が必要だと思います。 WorksheetFunction.Sum( "Sheet1!A1:A3")も失敗します。ただし、これは成功します

Application.WorksheetFunction.Sum(Sheet1.Range("A1"), Sheet2.Range("A1"))

範囲は好きなものにできます。

4
mongoose36

私はちょうどラインでそれを動作させることができました:

Cells(x,y) = WorksheetFunction.sum(range(a,b:a,d))
1
L DeFramce

ループを使用して、すべてのシートで計算を実行する必要があります。これは、物の見た目で最も効率的な方法です。上記のように、代わりに各範囲を個別に入力できます。

VBAは数値をテキストとして読み取ることがあるため、加算する範囲をdouble(またはsingle、integerなど)に変換する価値がある場合があります。

v = v + Cdbl(Sheets(i).Range("B2"))

Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")で問題が発生する理由は、その数式をExcelに入力すると、「Sheet1:Sheet3!B2」の範囲がExcelで認識されないためです。

enter image description here

Application.WorksheetFunctionを使用するには、VBA外のExcelで動作する必要があります。

お役に立てば幸いです。

1
Tabias
 Sub SumWorksheets()
    Dim ws As Worksheet
    Dim v As Variant
    For Each ws In ThisWorkbook.Worksheets
'    If ws.Name <> ThisWorkbook.ActiveSheet.Name Then ' (Sum other sheets only)
    If ws.Name <> "" Then
    Application.DisplayAlerts = False
    v = v + ws.Range("B2")
    Application.DisplayAlerts = True
    End If
    Next ws
    MsgBox v
    End Sub
1
Ganesh Karra