はじめに
VBAゼロからシリーズです。

適当な例題を探していたのですが、なかなかいいものが見つからないので、今回は簡単な数学の問題とプログラミングを組み合わせてみます。
簡単な価格決定の問題をプログラミングを使って解いてみようという話です。
二次方程式の解の公式がわかればできるくらいの問題をやっていきます。
今回は解の公式をプログラミングで表現します。
主にIf文で書いていきます。
数学はプログラミングと相性がいいので、これからもちょくちょくこういう回があると思いますが、中学、高校くらいの数学の授業を思い出しながら読み進めていただければと思います。
今回の問題
ある製品を一個500円で仕入れて510円で売ると一日200個売れる。
一個につき一円値上げすると一日の売り上げ個数は10個減る。
利益を最大にするためには一個いくらで売ればよいだろうか。
解き方
一個\(x\)円で売るとして、一日の利益を\(f\)とすると次のようになる。
\[
f=(x-500)\{200-10(x-510)\}
\]
(価格-原価)×個数
ですね。
これを展開して整理すると
\[
f=-10x^{2}+10300x-2650000
\]
\[
f=-10(x-515)^{2}+2250
\]
\(f\)のグラフは上に凸であり、最大値では\(x=515\)となるので利益が最大になるときは一個515円のときである。
発展問題
利益が一個510円で売った時より大きくなるのは何円から何円の範囲か。
解き方
次の不等式を解く。
\[
-10x^{2}+10300x-2650000>200(510-500)
\]
これを整理すると
\[
-10x^{2}+10300x-2652000>0
\]
\[
-10x^{2}+10300x-2652000=0
\]
を\(x\)について解く。
解の公式より
\[
x=510,520
\]
よって510円から520円の範囲で売れば510円で売ったときより利益が大きくなる。
プログラミングの介入する余地はどこか
今回は解の公式をプログラミングします。
2aぶんの、まいなすびー、ぷらすまいなす、るーと、びーにじょう、まいなすよんえーしー。
結構手計算すると面倒なので、パッとでるようにします。
解の公式をVBAで計算してみる
次のようなVBAを書きます。
Sub SolutionFormula()
Dim a As Double
Dim b As Double
Dim c As Double
Dim D As Double
a = Range("B3").Value
b = Range("C3").Value
c = Range("D3").Value
D = b * b - 4# * a * c
If D > 0 Then
Range("E3").Value = (-b + Sqr(D)) / (2 * a)
Range("F3").Value = (-b - Sqr(D)) / (2 * a)
ElseIf D = 0 Then
Range("E3").Value = (-b) / (2 * a)
Range("F3").Value = "No solution"
ElseIf D < 0 Then
Range("E3").Value = "No solution"
Range("F3").Value = "No solution"
End If
End Sub
解の公式自体の解説は省略します。
If文で分岐させているのは、解が2個か、1個か、ないのか(虚数解)で3分岐させています。
あとは公式を計算させているだけです。
D = b * b – 4# * a * c
の部分で4#とあるのはただの整数の4ではなく、浮動小数の4という意味です。
計算させると510と520が出力されます。

まとめ
今回は二次方程式の解の公式の部分を自動化してみました。
手計算でa、b、cを変形させていくと間違いやすいので、プログラムで検算してみるといいかもしれませんね。