0

以下のように、4 つの列 (AD) を持つ Excel シートがあります。

1 XYZ 100 800
2 XYZ 250 820
3 XYZ 500 1100
4 XYZ 4,000 1200

以下のように列Eの値を計算したい:

E1 = (D1-D1)*C1
E2 = (D2-D1)*C1
E3 = (D3-D1)*C1+(D3-D2)*C2
E4 = (D4-D1)*C1+(D4-D2)*C2+ (D4-D3)*C3

など、追加の行がある場合

期待される結果: E1=0、E2=2000、E3=100000、E4=185000

この式を一般化できますか?どんな助けでも大歓迎です。

4

2 に答える 2

2

式は大きくなる必要があるため、セル内でこの式を一般化することはできません。また、Excel セルの数式には文字数制限があります (以下の @pnuts コメントを参照)。そのため、VBA を使用して数式を確実に "構築" することはできません。あなたのユースケースはこの制限に当てはまらないかもしれませんが、このようなケースでは、長い式の文字列を「構築」する VBA サブルーチンよりも UDF の単純さを好みます。

範囲を反復して値を計算するカスタム関数を作成できます。これは、サンプルデータで機能します。コードを標準コード モジュールに配置します。

Public Function GetValue(ByVal clStart As Range, ByVal clEnd As Range) As Variant
'Pass only the cell address for the first cell ("D1") and the last cell ("D4")
    Dim rng As Range
    Dim r As Range
    Dim i As Long
    Dim myVal As Double

    Application.Volatile

    If Not clStart.Column = clEnd.Column Then
        'These cells should be in the same column, if not
        ' display an error
        myVal = CVErr(2023)
        GoTo EarlyExit
    End If

    Set rng = Range(clStart.Address, clEnd.Address)

    For i = 1 To rng.Rows.Count - 1
        Set r = rng.Cells(i)
        myVal = myVal + _
            ((clEnd.Value - r.Value) * r.Offset(0, -1).Value)
    Next

EarlyExit:
    GetValue = myVal
End Function
于 2013-09-22T18:35:57.763 に答える
0

かなり遅いですが、なぜ E4 = D4*SUM(C$1:C3)-SUMPRODUCT(C$1:C3,D$1:D3) .. E4 = (D4-D1)*C1+ の代わりに使用できなかったのでしょうか。 (D4-D2)*C2+(D4-D3)*C3

パフォーマンスの低下を防ぐために、一時列を使用できる場合は、C と C*D の部分的な合計を格納する列を作成できます。

于 2015-10-27T19:04:17.123 に答える