Excel VBA質問箱 IV

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

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


5517 / 13645 ツリー ←次へ | 前へ→

【50335】Select Caseを使った計算方法を教えてください kumi 07/7/20(金) 9:47 質問[未読]
【50336】Re:Select Caseを使った計算方法を教えてく... Jaka 07/7/20(金) 10:09 発言[未読]
【50340】Re:Select Caseを使った計算方法を教えてく... Jaka 07/7/20(金) 10:57 発言[未読]
【50349】一応貼っときます Jaka 07/7/20(金) 14:17 発言[未読]
【50337】Re:Select Caseを使った計算方法を教えてく... Lindy 07/7/20(金) 10:33 発言[未読]
【50351】Re:Select Caseを使った計算方法を教えてく... ichinose 07/7/20(金) 16:03 発言[未読]
【50350】Re:Select Caseを使った計算方法を教えてく... マルチネス 07/7/20(金) 15:05 発言[未読]

【50335】Select Caseを使った計算方法を教えてく...
質問  kumi  - 07/7/20(金) 9:47 -

引用なし
パスワード
   こんにちは。

マクロで困っていますのでご教授下さい。
Excel2000で下記のような表を作りました。

  A    B   C  D   E
1 形   上辺 底辺 高さ 面積
2 三角形    10  20  100  
3 正方形    11  12  132
4 台形   5  6   7  38.5



21

セルA2からA21まで入力規則のリストで三角形・正方形・台形・空白のいずれか
が入ります。
セルA2からA21それぞれをリストから選択したとき、またセルB2からD21の数値を
変更したときにセルE2からE21に面積が自動的に計算されるようにしたいのですが
どのようなプログラムを組めば良いのでしょうか。
セルE2からE21にIf関数で数式を書かずにWorksheet_Change イベントでSelect
Case で分岐して計算する方法を教えてください。

よろしくお願いします。

【50336】Re:Select Caseを使った計算方法を教えて...
発言  Jaka  - 07/7/20(金) 10:09 -

引用なし
パスワード
   Select Case の書き方。
こう言う事でよろしいでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column > 1 Then Exit Sub
Select Case Target.Value
  Case "三角形"
   三角形の計算
  Case "正方形"
   正方形の計算
  Case "台形"
   台形の計算
End Select

End Sub

【50337】Re:Select Caseを使った計算方法を教えて...
発言  Lindy  - 07/7/20(金) 10:33 -

引用なし
パスワード
   ▼kumi さん:
こんにちは。

Select Case の使い方はJakaさんの御回答を参考に^^

私のは質問の内容とはまったく違うのですが
今回のような計算の場合、数学的にもっと簡単に
1つの計算式の中で値の条件分岐で求められると思ったので
ご参考程度に・・・
(VBAの質問の回答としては相応しく無いかもですが・・・)

Private Sub Worksheet_Change(ByVal Target As Range)

'変更セルがA2:D21以外か変更範囲が1つ以上なら終わり
If Application.Intersect(Target, Range("A2:D21")) Is Nothing _
  Or Target.Count > 1 Then Exit Sub

'計算式の中で条件設定
'(上辺+下辺)×高さ÷2 の台形の計算式を基準に
'A列が「台形」の時だけ上辺を設定、その他の場合は0
'A列が「正方形」の時だけ「÷1」、その他の場合は「÷2」
With Target
 Cells(.Row, 5).Value = _
  (IIf(Cells(.Row, 1).Value = "台形", Cells(.Row, 2).Value, 0) + _
  Cells(.Row, 3).Value) * Cells(.Row, 4).Value / _
  IIf(Cells(.Row, 1).Value = "正方形", 1, 2)
End With
End Sub

【50340】Re:Select Caseを使った計算方法を教えて...
発言  Jaka  - 07/7/20(金) 10:57 -

引用なし
パスワード
   算数の計算式忘れちゃったんで、復習のつもりで書いてみたけれど...。
最近の計算方法はわかりません。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column > 1 Then Exit Sub
Select Case Target.Value
  Case "三角形"
   Target.Offset(, 4).Value = 三角形の計算(Target)
  Case "正方形"
   Target.Offset(, 4).Value = 正方形の計算(Target)
  Case "台形"
   Target.Offset(, 4).Value = 台形の計算(Target)
End Select

End Sub

Function 三角形の計算(Rng As Range) As Double
Dim 底辺 As Double, 高さ As Double
底辺 = Rng.Offset(, 2).Value
高さ = Rng.Offset(, 3).Value
三角形の計算 = 底辺 * 高さ / 2
End Function

Function 正方形の計算(Rng As Range) As Double
Dim 上辺 As Double, 底辺 As Double
上辺 = Rng.Offset(, 1).Value
底辺 = Rng.Offset(, 2).Value
正方形の計算 = 上辺 * 底辺
End Function

Function 台形の計算(Rng As Range) As Double
Dim 上辺 As Double, 底辺 As Double, 高さ As Double
上辺 = Rng.Offset(, 1).Value
底辺 = Rng.Offset(, 2).Value
高さ = Rng.Offset(, 3).Value
台形の計算 = (上辺 + 底辺) * 高さ / 2
End Function

【50349】一応貼っときます
発言  Jaka  - 07/7/20(金) 14:17 -

引用なし
パスワード
   htt p://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi?mycmd=read&mypage=[[20070719171503]]&mytime=082159

【50350】Re:Select Caseを使った計算方法を教えて...
発言  マルチネス  - 07/7/20(金) 15:05 -

引用なし
パスワード
   これもね。

htt p://www2.moug.net/bbs/exvba/20070720000004.htm

【50351】Re:Select Caseを使った計算方法を教えて...
発言  ichinose  - 07/7/20(金) 16:03 -

引用なし
パスワード
   皆さん、こんにちは。

>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%増加する」
という話しをはるか昔聞いたことがあります。

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