第6講 Functionプロシージャ

第4話 円の面積を求めるFuncitonプロシージャ

円の一部の面積を求めるFuncitonプロシージャ
Private Sub CommandButton1_Click()

  Dim r As Double, a As Double, b As Double, k As Long

  r = Cells(6, 2)
  a = Cells(7, 2)
  b = Cells(8, 2)
  k = Cells(9, 2)

  Cells(10, 2) = f(r, a, b, k)
  Cells(11, 2) = 4 * f(1, 0, 1, k)

End Sub


Function f(r As Double, a As Double, b As Double, k As Long)

  Dim w As Double, d As Double

  w = 0
  d = (b - a) / k
  For i = 0 To k
    w = w + d * Sqr(r * r - (a + i * d) * (a + i * d))
  Next

  f = w

End Function


Private Sub CommandButton2_Click()

  Columns("B").Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub
実行画面例
c


因みに、このマクロによる分割個数とπの近似値の表を載せておくと、

分割個数 10 100 1000 10000 100000 1000000 10000000 100000000
半径1の円の面積 3.304518326 3.160417032 3.143555467 3.141791478 3.141612616 3.141594652 3.141592854 3.141592674

円周率は、3.14159265ですからたった10000000個に分割するだけで、かなり正確な値が求められることがわかります。

さて、次の課題です。Functionプロシージャによって、
成績一覧表マクロ
Private Sub CommandButton1_Click()

  f1 '各生徒の合計点・平均点の計算
  f2 '各教科等の合計点・平均点の計算
  
f3 '各生徒の合否判定
  f4 '各生徒の講評
  f5 '各生徒の最高点の算出
  f6 '各生徒の最低点の算出
  f7 '各教科と合計・平均の最高点の算出
  f8 '各教科と合計・平均の最低点の算出

End Sub

Sub f1()

  Dim i As Byte, j As Byte

  '生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next

End Sub


Sub f2()

  Dim i As Byte, j As Byte

  '各教科等の合計点・平均点の計算
  For i = 1 To 7
    w = 0
    For j = 1 To 40
      w = w + Cells(6 + j, 1 + i)
    Next
    Cells(47, 1 + i) = w
    Cells(48, 1 + i) = w / 40
  Next

End Sub


Sub f3()

  Dim i As Byte, j As Byte

  '各生徒の合否判定 
  For i = 1 To 40
    If Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 11) = "合格"
    End If
    If Cells(6 + i, 7) < 300 Then
      Cells(6 + i, 11) = "不合格"
    End If
  Next

End Sub


Sub f4()

  Dim i As Byte, j As Byte

  '各生徒の講評
  For i = 1 To 40
    If Cells(6 + i, 7) >= 350 Then
      Cells(6 + i, 12) = "あなたはかなり優秀です。"
    End If
    If Cells(6 + i, 7) < 350 And Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 12) = "おめでとう。"
    End If
    If Cells(6 + i, 7) < 300 And Cells(6 + i, 7) >= 200 Then
      Cells(6 + i, 12) = "合格まで後一歩です。"
    End If
    If Cells(6 + i, 7) < 200 Then
      Cells(6 + i, 12) = "かなりのがんばりが必要です。"
    End If
  Next

End Sub


Sub f5()

  Dim i As Byte, j As Byte

  '各生徒の最高点の算出
  Dim max As Integer
  For i = 1 To 40
    max = 0
    For j = 1 To 5
      If Cells(6 + i, 1 + j) >= max Then max = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 9) = max
  Next

End Sub


Sub f6()

  Dim i As Byte, j As Byte

  '各生徒の最低点の算出
  Dim min As Integer
  For i = 1 To 40
    min = 100
    For j = 1 To 5
      If Cells(6 + i, 1 + j) < min Then min = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 10) = min
  Next

End Sub


Sub f7()

  Dim i As Byte, j As Byte

  '各教科と合計・平均の最高点の算出
  For i = 1 To 7
    max = 0
    For j = 1 To 40
      If Cells(6 + j, 1 + i) > max Then max = Cells(6 + j, 1 + i)
    Next
    Cells(49, 1 + i) = max
  Next

End Sub


Sub f8()

  Dim i As Byte, j As Byte

  '各教科と合計・平均の最低点の算出
  For i = 1 To 7
    min = 500
    For j = 1 To 40
      If Cells(6 + j, 1 + i) < min Then min = Cells(6 + j, 1 + i)
    Next
    Cells(50, 1 + i) = min
  Next

End Sub




Private Sub CommandButton2_Click()

  Range("B7:L50").Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub

Private Sub CommandButton3_Click()

  Dim i As Byte, j As Byte

 For i = 1 To 40
   For j = 1 To 5
     Cells(6 + i, 1 + j) = Int(100 * Rnd())
   Next
  Next

End Sub
をより見通しのよいものに変更します。

横の合計を求めるFuncitonプロシージャg1、縦の合計を求めるFunctionプロシージャg2、
横の最高点を求めるFuncitonプロシージャg3、横の最低点を求めるFunctionプロシージャg4
縦の最高点を求めるFunctionプロシージャg5、縦の最低点を求めるFunctionプロシージャg6
用意して書き換えてください。

第3話へ 第5話へ

004


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る