プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております
下記のコードが動きません。

B列に数字が入力されています。
F列には添付ファイルのように
1000刻みで入力されています。
個数を調べたいのですが、
わかる方おしえてくれませんでしょうか


Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim st As String

Dim wf As Object
Dim r As Range
Dim a As Long, b As Long, c As Long

Set wf = WorksheetFunction

With Target
st = .Address(False, False)
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))

Select Case st

Case "B"

For Each r In Range("B2", Cells(Rows.Count, 2).End(xlUp))

If r.Value <> "" Then

a = wf.CountIfs(r, "<=1000")
b = wf.CountIfs(r, ">1000", r, "<=2000")
c = wf.CountIfs(r, ">2000", r, "<=3000")
End If
Next

Range("G3").Value = a
Range("G4").Value = b
Range("G5").Value = c


Set wf = Nothing


End Select
End With

End Sub

「countifsについての質問」の質問画像

A 回答 (3件)

こんにちは


処理ロジックを考え直す

For Each r In Range("B2", Cells(Rows.Count, 2).End(xlUp))
ループする必要はないように思います

ループで最後に条件 If r.Value <> "" Then に合致し、処理された結果のみが出力されています
Next
Range("G3").Value = a
Range("G4").Value = b
Range("G5").Value = c

rはループの要素なので範囲のセル要素ですね
COUNTIF(S)関数は範囲に対して条件でカウントします

= COUNTIFS(条件範囲1,"条件1",条件範囲2,"条件2",条件範囲3,"条件3"…)

ご質問の場合、条件範囲1・条件範囲2・・・は同じ範囲
これを踏まえて 簡単な添削をすると(ご質問の部分だけ)

Select Case st
Case "B"
Set r = Range("B2", Cells(Rows.Count, 2).End(xlUp))
If .Value <> "" Then
a = wf.CountIf(r, "<=1000") 'COUNTIF
b = wf.CountIfs(r, ">1000", r, "<=2000") 'COUNTIFS
c = wf.CountIfs(r, ">2000", r, "<=3000")
End If
Range("G3").Value = a
Range("G4").Value = b
Range("G5").Value = c
Set wf = Nothing
End Select
End With
    • good
    • 0
この回答へのお礼

いつもお世話になっております

a = wf.CountIf(r, "<=1000") 'COUNTIF
b = wf.CountIfs(r, ">1000", r, "<=2000") 'COUNTIFS
の使い分けが必要なのですね
ありがとうございました。

お礼日時:2023/03/08 18:11

>下記のコードが動きません。


動かないを 正しく解が得られないと解釈した回答ですが
他の意味なら Changeイベントを使用するためのエラー回避策がコードにないので色々と問題があります
「動きません」の意味・事象を提示してください
    • good
    • 0

単に、関数COUNTIFを利用すればよいと思います。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!