前回は A Like "*B*" で文字列の場合分けについて例を出しましたので、
今回は数値を使った場合分けを練習してみます。
 
 
 
練習①
シートには教科毎にテスト結果が入力されています。
下記を参考に評価を入力してみましょう。
 
点数     評価
0-59    不可
60-69   可
70-79   良
80-89   優
90-100   秀

(その他)  無効の値

 

 

 

 

::::::::::::::::::::::::::::::::::::::

 

回答例

 

Sub テスト評価①()

  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 7

  For 行 = 上端 To 下端
  
    If 0 <= Cells(行, 2) And Cells(行, 2) <= 59 Then
      Cells(行, 3) = "不可"
      
    ElseIf 60 <= Cells(行, 2) And Cells(行, 2) <= 69 Then
      Cells(行, 3) = "可"
      
    ElseIf 70 <= Cells(行, 2) And Cells(行, 2) <= 79 Then
      Cells(行, 3) = "良"
      
    ElseIf 80 <= Cells(行, 2) And Cells(行, 2) <= 89 Then
      Cells(行, 3) = "優"
      
    ElseIf 90 <= Cells(行, 2) And Cells(行, 2) <= 100 Then
      Cells(行, 3) = "秀"


    Else
        Cells(行, 3) = "無効の値"
    End If
    
  Next 行

End Sub

 

 

 

 

Sub テスト評価②()

  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 7

  For 行 = 上端 To 下端
  
    Select Case Cells(行, 2)
    Case 0 To 59
      Cells(行, 3) = "不可"
      
    Case 60 To 69
      Cells(行, 3) = "可"
      
    Case 70 To 79
      Cells(行, 3) = "良"
      
    Case 80 To 89
      Cells(行, 3) = "優"
      
    Case 90 To 100
      Cells(行, 3) = "秀"
      
    Case Else
        Cells(行, 3) = "無効の値"
    End Select
    
  Next 行

End Sub

 
 
 
多少違いはあると思いますが、同じように場合分けできたでしょうか?
 

ご存じの方もいると思いますが、実は上記回答例には隙があります。

 
テスト点数のように場合分けされるものが整数だけという前提があるのであれば、上記の回答例でも問題ありませんが、小数点も含まれる可能性があるときはもう少し注意して場合分けしないといけません。
 
よく見ると、59~60、69~70、79~80など条件に隙間があり、その間の値だった場合には、すべてCase Elseの処理をされてしまうのです。
 
その辺りも考慮して次の問題を解いてみましょう。
 
 
::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::
 
 
練習②
シートには各々の体重と身長が入力されています。
下記のBMIを求める式と判定基準を基に場合分けをして、BMIと判定を入力してみましょう。
 
 
BMI = 体重kg ÷ (身長m)²
m=100cm
 
BMI値      判定
18.5未満     低体重(瘦ㄝ型)
18.5~25未満  普通体重
25~30未満   肥満(1度)
30~35未満   肥満(2度)
35~40未満   肥満(3度)
40以上     肥満(4度)
 
 
 
 
::::::::::::::::::::::::::::::::::::::
 
回答例
 
 
Sub BMI判定①()

  Dim BMI As Double
  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 16

  For 行 = 上端 To 下端

    BMI = Cells(行, 3) / (Cells(行, 2) / 100) ^ 2
    Cells(行, 4) = BMI

    If BMI < 18.5 Then
        Cells(行, 5) = "低体重(痩せ型)"

    ElseIf 18.5 <= BMI And BMI < 25 Then
        Cells(行, 5) = "普通体重"

    ElseIf 25 <= BMI And BMI < 30 Then
        Cells(行, 5) = "肥満(1度)"
 
    ElseIf 30 <= BMI And BMI < 35 Then
        Cells(行, 5) = "肥満(2度)"

    ElseIf 35 <= BMI And BMI < 40 Then
        Cells(行, 5) = "肥満(3度)"

    ElseIf BMI >= 40 Then
        Cells(行, 5) = "肥満(4度)"
    End If

  Next 行

End Sub
 
 
 
 
 
Sub BMI判定②()

  Dim BMI As Double
  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 16

  For 行 = 上端 To 下端

    BMI = Cells(行, 3) / (Cells(行, 2) / 100) ^ 2
    Cells(行, 4) = BMI

    Select Case BMI
    Case Is < 18.5
        Cells(行, 5) = "低体重(痩せ型)"

    Case Is < 25
        Cells(行, 5) = "普通体重"

    Case Is < 30
        Cells(行, 5) = "肥満(1度)"
 
    Case Is < 35
        Cells(行, 5) = "肥満(2度)"

    Case Is < 40
        Cells(行, 5) = "肥満(3度)"

    Case Is >= 40
        Cells(行, 5) = "肥満(4度)"
    End Select

  Next 行

End Sub
 
 
::::::::::::::::::::::::::::::::::::::
 
 
If と Select Case の使い方には慣れてきましたか?
 
2つの違いといえば、複数の変数を使った条件は Select Case ではできないというところでしょうか。
 
だいたいは If と Select Case どちらでも表現でき、どちらか片方で事足りることも多いと思います。
 
お好きな方を使ったり、 併用してみたり、 見やすさを鑑みて色々試してみましょう。