第6講 ファンクションプロシージャを理解しよう

第2話 ファンクションプロシージャ演習その1
127

を実現するプログラム例
Private Sub CommandButton1_Click()

  Cells(4, 1) = "1から10までの和  ="
  Cells(4, 3) = f
  Cells(5, 1) = "10から20までの和 ="
  Cells(5, 3) = g
    
End Sub
Function f()
  
  Dim w As Integer, i As Integer
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  f = w
  
End Function
Function g()
  
  Dim w As Integer, i As Integer
  w = 0
  For i = 11 To 20
    w = w + i
  Next
  g = w
  
End Function

Private Sub CommandButton2_Click()
  
  Rows("4:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
  
End Sub
参考ダウンロード添付ファイル

解説
Private Sub CommandButton1_Click()

  Cells(4, 1) = "1から10までの和  ="
  Cells(4, 3) = f
  Cells(5, 1) = "10から20までの和 ="
  Cells(5, 3) = g
    
End Sub
はもちろん
Private Sub CommandButton1_Click()

  Dim a As Integer, b As Integer
  a = f
  b = g
  Cells(4, 1) = "1から10までの和  ="
  Cells(4, 3) = a
  Cells(5, 1) = "10から20までの和 ="
  Cells(5, 3) = b
    
End Sub
でも動きます。
では、簡略な今話の解答の方が優れるかと申しますと、
必ずしもそうはいえません。
なぜなら、fとgの報告結果を再利用する場合に、
Private Sub CommandButton1_Click()

  Cells(4, 1) = "1から10までの和  ="
  Cells(4, 3) = f
  Cells(5, 1) = "11から20までの和 ="
  Cells(5, 3) = g
  Cells(5, 1) = "1から20までの和  ="
  Cells(5, 3) = f + g
    
End Sub
とするより、
Private Sub CommandButton1_Click()

  Dim a As Integer, b As Integer
  a = f
  b = g
  Cells(4, 1) = "1から10までの和  ="
  Cells(4, 3) = a
  Cells(5, 1) = "10から20までの和 ="
  Cells(5, 3) = b
  Cells(5, 1) = "1から20までの和  ="
  Cells(5, 3) = a + b
    
End Sub
の方が優れているといえるからです。
もちろん
1+2+・・・+10

11+12+・・・+20
の計算ですから、両方とも一瞬です。
0.0001秒もかからないでしょう。
ですから、2つのコードのどちらでも大差はありませんが、
fもgも膨大な量の計算をするときには、
2つのコードには大きな差が生じます。
なぜなら、
  Cells(5, 3) = f + g
の方は、もう一度fとgの計算をやり直すからです。
  Cells(5, 3) = a + b
の方は前に計算した結果を使うだけですから、再計算をやりません。
  Cells(5, 3) = f + g
の方は、fには
1+2+・・・+10
の結果を調べて報告しなさいという命令をもう一度下していますし、
gには
11+12+・・・+20
の結果を調べて報告しなさいという命令をもう一度下しています。
同じ計算を2回ずつさせていることになります。
将来扱う巨大魔方陣の自動生成や巨大完全数の場合、
膨大な計算量が必要になります。
私が、366桁の完全数をコンピュータに計算させたときには、
最初は数日もかかりました。
こういった膨大な計算量が伴う場合には、
出来るだけ無駄をさせないことが必要不可欠です。
fやgを呼び出す=Callする度に、
同じ計算をコンピュータは何も言わずにやってしまうのです。
『えっ!?、それ先ほど報告しましたよ。』とはいわずに何度でも、
不平不満を言わずに求められれば、再計算してしまいます。

また、
Function f()
  
  Dim w As Integer, i As Integer
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  f = w
  
End Function

Function f()
  
  Dim i As Integer
  f = 0
  For i = 1 To 10
    f = f + i
  Next
  
End Function
でも全く問題なく動きます。
ですが、私は
Function f()
  
  Dim w As Integer, i As Integer
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  f = w
  
End Function
のように書いてしまいます。
それは、私の1番の専門がC言語及びC++であるからです。
C言語の場合には、最後の1行
  f = w

  return(w);
ですが。
皆さんお気づきでしょうか。
VBAの場合、戻り値の型指定がなかったことに。
戻り値は、
Function f()
  
  Dim i As Integer
  f = 0
  For i = 1 To 10
    f = f + i
  Next
  
End Function
をご覧にならばお分かりのようにfです。
ところが、このfの型はどこにも指定されていません。
C言語やC++ではこのような曖昧なことをやると、
必ずエラーしてプログラムは実行できません。
C言語&C++では、皆さんからすれば驚きかも知れませんが、
関数にもint型(VBAのInteger型に相当)やString型(文字型)などの型があるのです。
その型は、戻り値の型です。
曖昧でも動くことは、VBAの長所であると同時に短所でもあります。
記述が曖昧でも動く・・・これは初心者にはありがたいことです。
ですから、私はプログラム初心者にお勧めの言語はVBAだと考えるのです。
C言語やJavaは、初心者には敷居が高すぎます。
ですが、あなたが将来C言語やJava等も学んでみたいと考えているのでしたら、
Function f()
  
  Dim w As Integer, i As Integer
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  f = w
  
End Function
のように書くことをお勧めします。
尚、いずれのコードでもVBAが自動的に戻り値は、
今回の場合Integer型であると判断してくれます。
なぜなら、Integer型同士の計算結果もInteger型であるからです。


では、次ぎにfとgに引数をつけて、
はじめの値と終わりの値をfとgに送れるように変更しましょう。
しかも、CommandButton1_Clickはそのはじめの値と終わりの値を、
エクセルシートからもらってきてそれを引数にして
fやgに送るようにして下さい。
8
尚、If文を学びましたので、If文を使い
hj
bv
空欄がある場合、入力欄に入力してからもう一度実行ボタンを押すように、
警告するようにしましょう。
If文の条件を入れるとき、
P Or Q Or R
と繋いでいくと、
条件は
PまたはQまたはR
ということになります。ですから、条件を
n1 = 0 Or m1 = 0 Or n2 = 0 Or m2 = 0
のようにすれば
bv
と警告を出すことが出来ます。
尚、途中でCommandButton1_Clicなどのサブプロシージャをやめるときは、
Exit Sub
と入力します。
サブプロシージャの強制終了です。

第1話へ 第3話へ

004


eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ第2部へ
小学生からエンジニアまでのRuby入門へ
小学生からエンジニアまでのC言語入門 基礎から応用まで
本サイトトップへ