Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1663 / 13646 ツリー ←次へ | 前へ→

【72773】複数条件のif構文がうまく機能しない トウジ 12/9/18(火) 19:33 質問[未読]
【72774】Re:複数条件のif構文がうまく機能しない kanabun 12/9/18(火) 21:23 発言[未読]
【72779】Re:複数条件のif構文がうまく機能しない トウジ 12/9/18(火) 22:35 質問[未読]
【72781】Re:複数条件のif構文がうまく機能しない kanabun 12/9/18(火) 22:45 発言[未読]
【72778】Re:複数条件のif構文がうまく機能しない ドカ 12/9/18(火) 22:16 発言[未読]
【72780】Re:複数条件のif構文がうまく機能しない トウジ 12/9/18(火) 22:42 お礼[未読]

【72773】複数条件のif構文がうまく機能しない
質問  トウジ  - 12/9/18(火) 19:33 -

引用なし
パスワード
   Sub 指数別傾向()

Application.ScreenUpdating = False

Dim i As Long 

Dim h1 As Long
Dim h2 As Long
Dim j1 As Long
Dim j2 As Long
Dim k1 As Long
Dim k2 As Long
Dim l1 As Long
Dim l2 As Long
Dim m1 As Long
Dim m2 As Long
Dim n1 As Long
Dim n2 As Long
Dim o1 As Long
Dim o2 As Long 

Dim x As Long
Dim y As Long 

i = 3

h1 = InputBox("項目1は何以上ですか?", Title:="項目1の数(下限)")
h2 = InputBox("項目1は何以下ですか?", Title:="項目1の数(上限)")
j1 = InputBox("項目2は何以上ですか?", Title:="項目2の数(下限)")
j2 = InputBox("項目2は何以下ですか?", Title:="項目2の数(上限)")
k1 = InputBox("項目3は何以上ですか?", Title:="項目3の数(下限)")
k2 = InputBox("項目3は何以下ですか?", Title:="項目3の数(上限)")
l1 = InputBox("項目4は何以上ですか?", Title:="項目4の数(下限)")
l2 = InputBox("項目4は何以下ですか?", Title:="項目4の数(上限)")
m1 = InputBox("項目5は何以上ですか?", Title:="項目5の数(下限)")
m2 = InputBox("項目5は何以下ですか?", Title:="項目5の数(上限)")
n1 = InputBox("項目6は何以上ですか?", Title:="項目6の数(下限)")
n2 = InputBox("項目6は何以下ですか?", Title:="項目6の数(上限)")
o1 = InputBox("項目7は何以上ですか?", Title:="項目7の数(下限)")
o2 = InputBox("項目7は何以下ですか?", Title:="項目7の数(上限)")
p1 = InputBox("項目8は何以上ですか?", Title:="項目8の数(下限)")
p2 = InputBox("項目8は何以下ですか?", Title:="項目8の数(上限)")
q1 = InputBox("項目9は何以上ですか?", Title:="項目9の数(下限)")
q2 = InputBox("項目9は何以下ですか?", Title:="項目9の数(上限)")

MsgBox "項目1は" & h1 & "〜" & h2 & "です"
& vbCrLf & "項目2は" & j1 & "〜" & j2 & "です"
& vbCrLf & "項目3は" & k1 & "〜" & k2 & "です"
& vbCrLf & "項目4は" & l1 & "〜" & l2 & "です"
& vbCrLf & "項目5は" & m1 & "〜" & m2 & "です"
& vbCrLf & "項目6は" & n1 & "〜" & n2 & "です"
& vbCrLf & "項目7は" & o1 & "〜" & o2 & "です"
& vbCrLf & "項目8は" & p1 & "〜" & p2 & "です"
& vbCrLf & "項目9は" & q1 & "〜" & q2 & "です"
& vbCrLf & "これでよろしいですか?", vbYesNo


Do
 
x = i - 1
y = x + 5
    
If (h1 <= Sheets(1).Cells(i, "W") And Sheets(1).Cells(i, "W") <= h2) And
(j1 <= Sheets(1).Cells(i, "X") And Sheets(1).Cells(i, "X") <= j2) And
(k1 <= Sheets(1).Cells(i, "Y") And Sheets(1).Cells(i, "Y") <= k2) And
(l1 <= Sheets(1).Cells(i, "Z") And Sheets(1).Cells(i, "Z") <= l2) And
(m1 <= Sheets(1).Cells(i, "AA") And Sheets(1).Cells(i, "AA") <= m2) And
(n1 <= Sheets(1).Cells(i, "AB") And Sheets(1).Cells(i, "AB") <= n2) And
(o1 <= Sheets(1).Cells(i, "AC") And Sheets(1).Cells(i, "AC") <= o2) And
(p1 <= Sheets(1).Cells(i, "AD") And Sheets(1).Cells(i, "AD") <= p2) And
(q1 <= Sheets(1).Cells(i, "AE") And Sheets(1).Cells(i, "AE") <= q2) Then

Else
Sheets(1).Rows(x & ":" & y).Hidden = True '表示しない 行(i-x)から行((i+5)-x)"
End If
i = i + 6
Loop Until Sheets(1).Cells(i, "D").Value = ""

Application.ScreenUpdating = True


End Sub

----------------------------------------------------------------
上記のようなコードをつくったところ、自分で入力した条件に当てはまっていても、Sheets(1).Rows(x & ":" & y).Hidden = True となり行が非表示となってしまいます。なぜでしょうか?アドバイスをいただければと思います。よろしくお願い致します。

【72774】Re:複数条件のif構文がうまく機能しない
発言  kanabun  - 12/9/18(火) 21:23 -

引用なし
パスワード
   ▼トウジ さん:

>Do
> 
>x = i - 1
>y = x + 5
>    
>If (h1 <= Sheets(1).Cells(i, "W") And Sheets(1).Cells(i, "W") <= h2) And
>(j1 <= Sheets(1).Cells(i, "X") And Sheets(1).Cells(i, "X") <= j2) And
>(k1 <= Sheets(1).Cells(i, "Y") And Sheets(1).Cells(i, "Y") <= k2) And
>(l1 <= Sheets(1).Cells(i, "Z") And Sheets(1).Cells(i, "Z") <= l2) And
>(m1 <= Sheets(1).Cells(i, "AA") And Sheets(1).Cells(i, "AA") <= m2) And
>(n1 <= Sheets(1).Cells(i, "AB") And Sheets(1).Cells(i, "AB") <= n2) And
>(o1 <= Sheets(1).Cells(i, "AC") And Sheets(1).Cells(i, "AC") <= o2) And
>(p1 <= Sheets(1).Cells(i, "AD") And Sheets(1).Cells(i, "AD") <= p2) And
>(q1 <= Sheets(1).Cells(i, "AE") And Sheets(1).Cells(i, "AE") <= q2) Then
>
>Else
>Sheets(1).Rows(x & ":" & y).Hidden = True '表示しない 行(i-x)から行((i+5)-x)"
>End If
>i = i + 6
>Loop Until Sheets(1).Cells(i, "D").Value = ""
>
>----------------------------------------------------------------
>入力した条件に当てはまっていても、
>Sheets(1).Rows(x & ":" & y).Hidden = True となり
>行が非表示となってしまいます。なぜでしょうか?

こちらでは(データを作り難く)検証がむつかしいので、
うえの部分を以下のように修正して、
イミディエイト・ウィンドウでどの列で条件外となっているか
確かめてください。
With Sheets(1)
 For i = 3 To .Cells(.Rows.Count, 4).End(xlUp).Row Step 6
  x = i - 1
  y = i + 4
  .Rows(x & ":" & y).Hidden = True '表示しない 行(i-x)から行((i+5)-x)"
  Select Case False
   Case .Cells(i, "W") >= h1: Debug.Print "[W" & i & "] not(>=h1)"
   Case .Cells(i, "W") <= h2: Debug.Print "[W" & i & "] not(<=h2)"
   Case .Cells(i, "X") >= j1: Debug.Print "[X" & i & "] not(>=j1)"
   Case .Cells(i, "X") <= j2: Debug.Print "[X" & i & "] not(>=j2)"
   Case .Cells(i, "Y") >= k1: Debug.Print "[Y" & i & "] not(>=k1)"
   Case .Cells(i, "Y") <= k2: Debug.Print "[Y" & i & "] not(>=k2)"
   Case .Cells(i, "Z") >= l1: Debug.Print "[Z" & i & "] not(>=L1)"
   Case .Cells(i, "Z") <= l2: Debug.Print "[Z" & i & "] not(>=L2)"
   Case .Cells(i, "AA") >= m1: Debug.? "[AA" & i & "] not(>=m1)"
   Case .Cells(i, "AA") <= m2: Debug.? "[AA" & i & "] not(>=m2)"
   Case .Cells(i, "AB") >= n1: Debug.? "[AB" & i & "] not(>=n1)"
   Case .Cells(i, "AB") <= n2: Debug.? "[AB" & i & "] not(>=n2)"
   Case .Cells(i, "AC") >= o1: Debug.? "[AC" & i & "] not(>=o1)"
   Case .Cells(i, "AC") <= o2: Debug.? "[AC" & i & "] not(>=o2)"
   Case .Cells(i, "AD") >= p1: Debug.? "[AD" & i & "] not(>=p1)"
   Case .Cells(i, "AD") <= p2: Debug.? "[AD" & i & "] not(>=p2)"
   Case .Cells(i, "AE") >= q1: Debug.? "[AE" & i & "] not(>=q1)"
   Case .Cells(i, "AE") <= q2: Debug.? "[AE" & i & "] not(>=q2)"
   Case Else
     .Rows(x & ":" & y).Hidden = False
  End Select
 Next
End With

【72778】Re:複数条件のif構文がうまく機能しない
発言  ドカ  - 12/9/18(火) 22:16 -

引用なし
パスワード
   ▼トウジ さん:
Dim o2 As Long  以降の変数が宣言されていないからのようですね。
入力された数字を文字と判断しているからではないでしょうか。

【72779】Re:複数条件のif構文がうまく機能しない
質問  トウジ  - 12/9/18(火) 22:35 -

引用なし
パスワード
   ▼kanabun さん:
返信ありがとうございます。
仰られた通りに修正して、かつ必ず条件が合うように全項目を0〜99という範囲で指定してみましたが、すべての行が非表示になるという結果でした。
また、イミディエイトウインドウを確認したところ、
[AD3] not(>=p1)
[AD9] not(>=p1)
[AD15] not(>=p1)
[AD21] not(>=p1)
[AD27] not(>=p1)
[AD33] not(>=p1)
[AD39] not(>=p1)
[AD45] not(>=p1)
[AD51] not(>=p1)
[AD57] not(>=p1)
[AD63] not(>=p1)
[AD69] not(>=p1)
[AD75] not(>=p1)
[AD81] not(>=p1)
[AD87] not(>=p1)
[AD93] not(>=p1)
[AD99] not(>=p1)
[AD105] not(>=p1)
[AD111] not(>=p1)
[AD117] not(>=p1)
[AD123] not(>=p1)
[AD129] not(>=p1)
[AD135] not(>=p1)

という結果となりました。
この参照しているセル(Sheets(1).Cells(i, "W")など)が純粋な値ではなく、計算式が入っていてあくまで数値が表示されている状態であるため、上手く機能しないのでしょうか?

再度アドバイスをいただければと思います。
お手数ですが、よろしくお願いいたします。


>>Do
>> 
>>x = i - 1
>>y = x + 5
>>    
>>If (h1 <= Sheets(1).Cells(i, "W") And Sheets(1).Cells(i, "W") <= h2) And
>>(j1 <= Sheets(1).Cells(i, "X") And Sheets(1).Cells(i, "X") <= j2) And
>>(k1 <= Sheets(1).Cells(i, "Y") And Sheets(1).Cells(i, "Y") <= k2) And
>>(l1 <= Sheets(1).Cells(i, "Z") And Sheets(1).Cells(i, "Z") <= l2) And
>>(m1 <= Sheets(1).Cells(i, "AA") And Sheets(1).Cells(i, "AA") <= m2) And
>>(n1 <= Sheets(1).Cells(i, "AB") And Sheets(1).Cells(i, "AB") <= n2) And
>>(o1 <= Sheets(1).Cells(i, "AC") And Sheets(1).Cells(i, "AC") <= o2) And
>>(p1 <= Sheets(1).Cells(i, "AD") And Sheets(1).Cells(i, "AD") <= p2) And
>>(q1 <= Sheets(1).Cells(i, "AE") And Sheets(1).Cells(i, "AE") <= q2) Then
>>
>>Else
>>Sheets(1).Rows(x & ":" & y).Hidden = True '表示しない 行(i-x)から行((i+5)-x)"
>>End If
>>i = i + 6
>>Loop Until Sheets(1).Cells(i, "D").Value = ""
>>
>>----------------------------------------------------------------
>>入力した条件に当てはまっていても、
>>Sheets(1).Rows(x & ":" & y).Hidden = True となり
>>行が非表示となってしまいます。なぜでしょうか?
>
>こちらでは(データを作り難く)検証がむつかしいので、
>うえの部分を以下のように修正して、
>イミディエイト・ウィンドウでどの列で条件外となっているか
>確かめてください。
>With Sheets(1)
> For i = 3 To .Cells(.Rows.Count, 4).End(xlUp).Row Step 6
>  x = i - 1
>  y = i + 4
>  .Rows(x & ":" & y).Hidden = True '表示しない 行(i-x)から行((i+5)-x)"
>  Select Case False
>   Case .Cells(i, "W") >= h1: Debug.Print "[W" & i & "] not(>=h1)"
>   Case .Cells(i, "W") <= h2: Debug.Print "[W" & i & "] not(<=h2)"
>   Case .Cells(i, "X") >= j1: Debug.Print "[X" & i & "] not(>=j1)"
>   Case .Cells(i, "X") <= j2: Debug.Print "[X" & i & "] not(>=j2)"
>   Case .Cells(i, "Y") >= k1: Debug.Print "[Y" & i & "] not(>=k1)"
>   Case .Cells(i, "Y") <= k2: Debug.Print "[Y" & i & "] not(>=k2)"
>   Case .Cells(i, "Z") >= l1: Debug.Print "[Z" & i & "] not(>=L1)"
>   Case .Cells(i, "Z") <= l2: Debug.Print "[Z" & i & "] not(>=L2)"
>   Case .Cells(i, "AA") >= m1: Debug.? "[AA" & i & "] not(>=m1)"
>   Case .Cells(i, "AA") <= m2: Debug.? "[AA" & i & "] not(>=m2)"
>   Case .Cells(i, "AB") >= n1: Debug.? "[AB" & i & "] not(>=n1)"
>   Case .Cells(i, "AB") <= n2: Debug.? "[AB" & i & "] not(>=n2)"
>   Case .Cells(i, "AC") >= o1: Debug.? "[AC" & i & "] not(>=o1)"
>   Case .Cells(i, "AC") <= o2: Debug.? "[AC" & i & "] not(>=o2)"
>   Case .Cells(i, "AD") >= p1: Debug.? "[AD" & i & "] not(>=p1)"
>   Case .Cells(i, "AD") <= p2: Debug.? "[AD" & i & "] not(>=p2)"
>   Case .Cells(i, "AE") >= q1: Debug.? "[AE" & i & "] not(>=q1)"
>   Case .Cells(i, "AE") <= q2: Debug.? "[AE" & i & "] not(>=q2)"
>   Case Else
>     .Rows(x & ":" & y).Hidden = False
>  End Select
> Next
>End With

【72780】Re:複数条件のif構文がうまく機能しない
お礼  トウジ  - 12/9/18(火) 22:42 -

引用なし
パスワード
   ▼ドカ さん:
アドバイスありがとうございます。
仰る通りでした。きちんと変数宣言を行ったところきちんと処理されました。
初歩的なミスで申し訳ありませんでした。
自分ではきちんと定義したと思っても、やはり他の方に見ていただくと浮き彫りになりますね・・・。精進いたします。

この場を借りて、kanabunさんにもお礼をさせていただきたいと思います。
ありがとうございました。

また、何かありましたら利用させていただきますので、よろしくお願いいたします。

>▼トウジ さん:
>Dim o2 As Long  以降の変数が宣言されていないからのようですね。
>入力された数字を文字と判断しているからではないでしょうか。

【72781】Re:複数条件のif構文がうまく機能しない
発言  kanabun  - 12/9/18(火) 22:45 -

引用なし
パスワード
   ▼トウジ さん:
>イミディエイトウインドウを確認したところ、
>[AD3] not(>=p1)
>[AD9] not(>=p1)
>[AD15] not(>=p1)
>[AD21] not(>=p1)
>[AD27] not(>=p1)
>[AD33] not(>=p1)
>[AD39] not(>=p1)
>[AD45] not(>=p1)
>[AD51] not(>=p1)
>[AD57] not(>=p1)
>[AD63] not(>=p1)
>[AD69] not(>=p1)
>[AD75] not(>=p1)
>[AD81] not(>=p1)
>[AD87] not(>=p1)
>[AD93] not(>=p1)
>[AD99] not(>=p1)
>[AD105] not(>=p1)
>[AD111] not(>=p1)
>[AD117] not(>=p1)
>[AD123] not(>=p1)
>[AD129] not(>=p1)
>[AD135] not(>=p1)
>
>という結果となりました。

この結果と、直前のドカさんのコメントを合わせると、
原因は一目瞭然ですね!
ドカさん、ありがとうございます。

1663 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free