|
皆さん、こんにちは。
>Select Case の使い方はJakaさんの御回答を参考に^^
CASE文のご質問なのでこれはこれで・・・。
>私のは質問の内容とはまったく違うのですが
>今回のような計算の場合、数学的にもっと簡単に
>1つの計算式の中で値の条件分岐で求められると思ったので
私もこの事象だとたぶん、Case文は使わないことが多いです。
理由は、拡張性を考慮した場合、Case文を使用すると、コード変更を余儀なくされそうだ
からです。
例えば、ご質問内容だと、三角形、正方形、台形ですが、円を追加したとき
コードの変更が要らないようにしたいということです。
(もしくは、殆ど要らないようにしたい)
新規ブック(Sheet1、Sheet2というシート名が存在するブック)の
標準モジュールに
'==================================================================
Option Explicit
Sub mk_sample()
Application.EnableEvents = False
With Worksheets("sheet2")
.Range("a1:b3").Value = _
[{"三角形","c???*d???/2";"正方形","c???*d???";"台形","(b???+c???)*d???/2"}]
End With
With Worksheets("sheet1")
.Range("a1:e1").Value = Array("形", "上辺", "底辺", "高さ", "面積")
.Range("a2:a4").Value = [{"三角形";"正方形";"台形";" "}]
With .Range("a2:a100").Validation
.Delete
.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, _
Formula1:="=INDIRECT(""sheet2!a1:a4"")"
End With
End With
Application.EnableEvents = True
End Sub
上記のmk_sampleの実行でサンプルデータをSheet1とSheet2に作成します。
Sheet1には、kumi さんが提示された面積計算表シート
Sheet2には、各多角形名称と面積計算公式が入力されています。
次いでSheet1のシートモジュールに
'============================================================
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rw As Long
Dim arw As Variant
Dim rng As Range
With Target
If .Count <> 1 Then Exit Sub
If .Row > 1 Then
rw = .Row
With Worksheets("sheet2")
Set rng = .Range("a1", .Cells(.Rows.Count, "a").End(xlUp))
End With
arw = Application.Match(Range("a" & rw).Value, rng, 0)
If Not IsError(arw) Then
Application.EnableEvents = False
Range("e" & rw).Value = _
Evaluate(Replace(rng.Cells(arw).Offset(0, 1).Value, "???", rw))
If IsError(Range("e" & rw)) Then Range("e" & rw).Value = ""
Application.EnableEvents = True
End If
End If
End With
End Sub
これで、Sheet1に数値を入力して面積が算出されるか確認してください。
この方法だと、円が追加されても
Sheet2にデータを追加し、入力規則を再設定すれば、
コード変更が殆ど要らないと思います。
「機能追加のため、コード変更を行うとバグの発生確率がxx%増加する」
という話しをはるか昔聞いたことがあります。
|
|