アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております
先ほど質問した内容とおなじなのでずが、
IFを使用しないでSELECT CASE
の入れ子をためしまたが、 
なにも結果が出ませんでした。

どこがまちがえているのか、
わかる方おしえてくれませんでしょうか


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"

Case Is <= 1000
Range("G3").Value = wf.CountIf(r, "<=1000")

Case Is <= 2000
Range("G4") = wf.CountIfs(r, ">1000", r, "<=2000")

Case Is <= 3000

Range("G5") = wf.CountIfs(r, ">2000", r, "<=3000")

End Select


Set wf = Nothing




End With

End Sub

質問者からの補足コメント

  • うーん・・・

    申し訳ございません
    コピペで使用しましたが、
    表示されないです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/03/08 19:10

A 回答 (3件)

こんばんは


>IFを使用しないでSELECT CASE の入れ子をためしまたが
分岐条件を確認して整理してみましょう

Dim st As String
 
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
変数stはセルの値ではありませんよ

IF文で異なる条件で分岐する場合(書き方は色々ありますが)
If 条件1 Then
条件1の場合の処理
If 条件2 Then
条件1and条件2の場合の処理
End If
End If
ですよね
SELECT CASEでも同様ですね

ご質問のコードについての回答ですが #2様のご意見に賛成です
整理もし易くなると思います(stが要らないので)
"B"の視認性は コメントなどで追記すれば済みますからね

Set r = Range("B2", Cells(Rows.Count, 2).End(xlUp))
With Target
Select Case .Column '条件 列
Case 2 'B
Select Case .Value '条件 値
Case Is <= 1000
Range("G3").Value = wf.CountIf(r, "<=1000")
Case Is <= 2000
Range("G4") = wf.CountIfs(r, ">1000", r, "<=2000")
Case Is <= 3000
Range("G5") = wf.CountIfs(r, ">2000", r, "<=3000")
End Select
Case 3 'C
'C列処理
Case Else
'B列C列 以外の時の処理
End Select
    • good
    • 0
この回答へのお礼

いつもお世話になっております
わかりやすいコードです。
ありがとうございました。

お礼日時:2023/03/08 20:42

>With Target



ターゲットのアドレスから列を調べるより、Columns で列番号を取得し利用した方が良いのでは?
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2023/03/08 20:42

このコードの問題は、使用する変数 "r" が設定されていないことです。

CountIfs関数で使用される範囲が定義されていないため、エラーが発生します。

この問題を修正するには、次の手順を実行する必要があります。

変数 "r" を定義し、使用する範囲を設定します。

CountIf関数を使用する場合は、条件を指定する必要があります。現在のコードでは、条件が指定されていません。

また、Case "B" の場合、何も処理されていないため、必要に応じて追加のコードを記述する必要があります。

以下は、修正されたコードの例です。

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

' 変数 "r" に使用する範囲を設定する
Set r = Range("B:B")

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"
' Case "B" の場合に必要な処理を記述する
' 例:Range("G1").Value = "Bが変更されました"

Case Else
' CountIfs関数で使用する条件を指定する
Dim criteria1 As String
Dim criteria2 As String

Select Case st
Case Is <= 1000
criteria1 = "<=1000"
criteria2 = ""

Case Is <= 2000
criteria1 = ">1000"
criteria2 = "<=2000"

Case Is <= 3000
criteria1 = ">2000"
criteria2 = "<=3000"

Case Else
criteria1 = ""
criteria2 = ""
End Select

' CountIfs関数を使用して値を設定する
If criteria1 <> "" And criteria2 <> "" Then
Range("G5").Value = wf.CountIfs(r, criteria1, r, criteria2)
ElseIf criteria1 <> "" Then
Range("G4").Value = wf.CountIf(r, criteria1)
End If
End Select
End With

Set wf = Nothing
End Sub

この修正後、入力範囲でB列のセルが変更されるたびに、条件に基づいてG3、G4、またはG5に値が設定されます。また、Case "B" の場合は、必要に応じて処理を追加できます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/03/08 20:42

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