1

以前によく似た質問と回答をたくさん読みましたが、コードを機能させることができません。

他のセルの背景色に応じて、いくつかのセルの合計を計算したいと思います。特に、セル(x、z)の色が選択されたもの(RGB(0、176、80))である場合にのみ、合計にセル(x、y)を含めます。

FIRSTの合計は正しく計算されますが、F1:G100の範囲のセルを変更すると、通知( "pd")が届きますが、宛先セルで変更は行われません。

このコードは、変更を加えたいシートにあります。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("F1:G100")) Is Nothing Then
    Cells(11, 14).Value = Sum1()
    Cells(12, 14).Value = Sum2()
    MsgBox "pd"
End If
End Sub
'-----------------------------------------------------------------------
Public Function Sum1() As Double
Dim N As Long
Sum1 = 0

For N = 4 To 100
    colorBackground = Cells(N, 2).Interior.Color
    If colorBackground = RGB(0, 176, 80) Then
        Sum1= Sum1+ Cells(N, 6).Value
    End If
Next N      
End Function
'-----------------------------------------------------------------------
Public Function Sum2() As Double
Dim N As Long
Sum2 = 0

For N = 4 To 100
    colorBackground = Cells(N, 2).Interior.Color
    If colorBackground = RGB(0, 176, 80) Then
        Sum2= Sum2+ Cells(N, 7).Value
    End If
Next N 
End Function
4

1 に答える 1

1

これは問題とは何の関係もないかもしれませんが、上記のコードで気に入らないことは、Cells の裸の (または修飾されていない) 使用です。Excel オブジェクト モデルの定義により、次のようになります。

Cells:アクティブ ワークシートのすべてのセルを表す Range オブジェクトを返します 。(アクティブなドキュメントがワークシートでない場合、このプロパティは失敗します。)

そのため、シートがアクティブなシートではないときに変更が発生し、イベント ハンドラーが意図したシートではない可能性のあるものを参照して「セル」を実行することがあります。

ワークシートがアクティブでない状態でユーザーが直接変更を行う方法を想像するのは難しいですが、確かに VBA コードは非アクティブ シートで変更を引き起こす可能性があり、これはその (非アクティブ シートの) Worksheet_Change イベントをトリガーします。アクティブなシートが何であるかの現在の概念を変更することなく、ハンドラ。

これらを Cells (または Application.Cells、このコンテキストでは同様に悪い) から Target.Parent.Cells に変更することを検討することもできます (Sum1 と Sum2 でも、Target.Parent (または Target) を渡す必要があります)。

(Sum1 と Sum2 は公開されているため、わかりません。したがって、Sum1 または Sum2 を UDF として使用し、ここで呼び出される場合は、UDF を Application.ThisCell または何かを実行してから、その作業を行う別の関数を呼び出します (プライベートであるため、UDF として呼び出すことはできません)。

于 2012-12-10T23:06:21.107 に答える