2

私は次のものを持っています:

日付 ------- 費用

Jan      £500
Jan      £600
Feb      £300
Feb      £600
March    £1000
March    £500

コスト セルは、現在のステータス (確認済みの緑、未確認の白、半確認済みの黄色) に応じて異なる色で表示されます。たとえば、緑と 2 月のすべてのコストを合計する数式が必要です。

この種の色関数には VBA が必要であることを認識しており、次の式を使用して色のセルを合計/カウントできる colorfunction() という便利な関数を見つけました。

colorfunction(A1, B1:B5, FALSE)

A1 は範囲を比較する色で、FALSE / TRUE は合計またはカウント結果を返します。

ただし、このカスタム関数を MONTH() 式または SUMIF に組み込むことはできません。私はこれを完全に複雑にしすぎている可能性があるので、これを理解しようとする際に私が犯しているばかげた間違いを指摘してください.

4

2 に答える 2

1

セルの内部カラー インデックスを返すために、この関数を VBA モジュールに追加します。

    Function ColorIndex(rng As Range, _
                    Optional text As Boolean = False) As Variant
    Dim cell As Range, row As Range
    Dim i As Long, j As Long
    Dim iWhite As Long, iBlack As Long
    Dim aryColours As Variant

    If rng.Areas.Count > 1 Then
        ColorIndex = CVErr(xlErrValue)
        Exit Function
    End If

    iWhite = WhiteColorindex(rng.Worksheet.Parent)
    iBlack = BlackColorindex(rng.Worksheet.Parent)

    If rng.Cells.Count = 1 Then
        If text Then
            aryColours = DecodeColorIndex(rng, True, iBlack)
        Else
            aryColours = DecodeColorIndex(rng, False, iWhite)
        End If

    Else
        aryColours = rng.Value
        i = 0

        For Each row In rng.Rows
            i = i + 1
            j = 0

            For Each cell In row.Cells
                j = j + 1

                If text Then
                    aryColours(i, j) = _
                      DecodeColorIndex(cell, True, iBlack)
                Else
                    aryColours(i, j) = _
                      DecodeColorIndex(cell, False, iWhite)
                End If

            Next cell

        Next row

    End If

    ColorIndex = aryColours

End Function


Private Function WhiteColorindex(oWB As Workbook)

Dim iPalette As Long
    WhiteColorindex = 0
    For iPalette = 1 To 56
        If oWB.Colors(iPalette) = &HFFFFFF Then
            WhiteColorindex = iPalette
            Exit Function
        End If
    Next iPalette
End Function

Private Function BlackColorindex(oWB As Workbook)
Dim iPalette As Long
    BlackColorindex = 0
    For iPalette = 1 To 56
        If oWB.Colors(iPalette) = &H0 Then
            BlackColorindex = iPalette
            Exit Function
        End If
    Next iPalette
End Function

Private Function DecodeColorIndex(rng As Range, _
                                  text As Boolean, _
                                  idx As Long)
Dim iColor As Long
    If text Then
        iColor = rng.Font.ColorIndex
    Else
        iColor = rng.Interior.ColorIndex
    End If
    If iColor < 0 Then
        iColor = idx
    End If
    DecodeColorIndex = iColor
End Function

次に、カラー インデックスが 14 (緑) のすべてのセルの数を取得するには、sumproduct を次のように使用します。

=SUMPRODUCT(--(ColorIndex(B1:B100000)=14),B1:B100000)

これにより、範囲 B1:B100000 のすべてのセルの合計が返され、色は 14 (緑) になります。

最終的な例は次のようになります。

カラーインデックス

さらに、Sumproduct よりも Sumifs を好む場合は、ヘルパー列を使用するオプションがあります。コストの横の列に入力=ColorIndex(B1)し、下にドラッグします

ここに画像の説明を入力

次に、別のセルに数式を入力します

=SUM(SUMIFS(B1:B10,C1:C10,14,A1:A10,{"FEB","MARCH"}))

Months を合計したい Months に置き換えます (タイトルは、これが最終目標であることを示しています)。

これは、ヘルパー行がインデックスが 14(緑) であり、かつ月が 2 月または 3 月のいずれかである場合のコスト値を合計します。

ここに画像の説明を入力

于 2013-05-09T16:11:37.347 に答える