3

3列の非常に単純なExcel2007ワークシートがあります。名前(列A)、Value1(列B)、およびValue2(列C)。このシートは、多くの場合、[名前]列によって自動フィルタリングされます。

2番目の列の下部で、次のルールを使用して、任意のフィルターを尊重し、列Bの条件付きSUBTOTALを実行します。特定の行の列Bが0の場合は、列Cのその行の値を使用します。それ以外の場合は、列Cは無視する必要があります。

      A         B         C       
1   Name     Value1    Value2
2  Bob         100         6   <-- use 100, ignore 6 in Col C because B is non-zero
3  Bob         200             <-- use 200
4  Bob           0        50   <-- Col B=0, use C, thus 50 (and so on)
5  Bob         300
6  Ralph        10
7  Ralph        20         1   <-- use 20 from col B, ignore col 6.
8  Ralph         0        60
9  Ralph        50
10 Mary       1000
11 Mary       1200
12 Mary          0       250
13 Mary       1040       
14 Subtotal   4280

これで、次の式を使用して、必要な合計値を取得できます。

= SUMPRODUCT(-(B2:B13 = 0)、C2:C13)+ SUBTOTAL(9、B2:B13)

ただし、SUMPRODUCTを使用すると、非表示/フィルター処理されたセルの要件を満たせなくなります。たとえば、Maryをフィルターで除外しても、合計が3690減少することはありません。また、SUBTOTALは(B2:B13 = 0)配列参照を使用できません。ですから、私の脳の大部分は、私がとんでもなく近づくことができると私に伝えようとしていますが、実際にはそこに到達することはできません。しかし、私は(あまりにも?)頑固でそれをすぐに諦めません:)

私の一部は、VBAを掘り下げずにこれを直接行うことはできないと言いたいのですが、このソリューションでは可能であれば避けたいと思います。私は、私が見たことがない(おそらく非常に単純な)解決策を指摘するために、問題について他の人の目を引くことは価値があると思いました。

編集1:私が指摘すべき明らかな解決策の1つは、単純なIF式を使用して4番目の列を追加し、それをSUBTOTALすることでした。それは確かに機能しますが、私はそれをこの状況に適応させることはできません。ここに示されている表は、任意の列の追加がオプションではないように、はるかに大きく、高度に構造化されたワークシートからの代表的な抜粋にすぎません。

編集2:私が提供したサンプルデータは、すべての列のまっすぐなSUBTOTALが問題を解決するという単純な推論を可能にしましたが、このデータが抽出された実際のデータには、列Bが非である場合でも列Cの値が含まれる場合があります零。その場合、列Cは無視する必要があります。列Bが存在する場合は、常に優先されます。それに応じて元のデータテーブルを修正しました。

4

2 に答える 2

3

私はあきらめて、VBAベースのUDFに辞任しました。

Function DifColSubTotal(Range1 As Range, Range2 As Range) As Single

  Dim c As Range
  Dim sum As Single
  Dim col_offset As Long

  col_offset = Range2.Column - Range1.Column

  For Each c In Range1
     If c.Height > 0 Then
       If ((c.Value = 0) Or (c.Value = "")) Then
           sum = sum + c.Offset(0, col_offset)
       Else
           sum = sum + c.Value
       End If
     End If
  Next
  DifColSubTotal = sum
End Function

結果はここにあります:

ここに画像の説明を入力してください

于 2013-01-28T18:21:02.353 に答える
3

数式でこれを行うには、OFFSETを使用して「範囲の配列」を返し、それぞれが単一のセルになるようにします。次に、SUBTOTALを使用して各セルを個別にクエリできます。つまり、この「配列数式」を使用します。

編集-Daniel Otykierのコメントによると-最初はそれを見ませんでした.....

=SUM(IF(SUBTOTAL(2,OFFSET(B2,ROW(B2:B13)-ROW(B2),0)),IF(B2:B13=0,C2:C13,B2:B13)))

で確認CTRL+SHIFT+ENTER

B2:B13与えられた例に従って完全に入力されていると仮定します

編集:「配列エントリ」を必要としないこのバージョンを使用することもできます

=SUMPRODUCT(SUBTOTAL(9,OFFSET(C2,ROW(C2:C13)-ROW(C2),0)),(B2:B13=0)+0)+SUBTOTAL(9,B2:B13)

この の使用法はSUBTOTAL/OFFSETLaurent Longre によって開発されました -こちらを参照してください

于 2013-01-28T21:15:36.387 に答える