![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
2次方程式を解くマクロを作成したのですが解けません。
マクロの授業で2次方程式を解くマクロを作成したのですが途中で何がなんだかわかんなくなってしまいました。
どこがどう間違っているのかわからない初心者なのでわかりやすい解説よろしくお願いします。
■二次方程式の解を求めるマクロ
マクロ名 niji
条件
課題のファイルのsheet1を開き、
A1にxの二乗の係数
C3にxの係数
E3に定数項
を入力した場合
判別式の結果より、I3に解の状態を表示させる
表示は
2つの異なる実根
重根
複素数根
のいずれかとする。
そして、J3、K3に二次方程式の解を表示させる。解は二次方程式の解の公式
より求める。
複素数は i としてあらわす。
以下作成したマクロ↓
Sub niji()
Range("A3").Select
a = ActiveCell.Formula
Range("C3").Select
b = ActiveCell.Formula
b2 = -b / 2
Range("E3").Select
c = ActiveCell.Formula
d = b * b - 4 * a * c
Range("J3,K3").Formula = ""
'ActiveCell.Formula = ""
If d > 0 Then
x1 = b2 + Sqr(d) / 2
x2 = b2 - Sqr(d) / 2
Range("J2").Select
ActiveCell.Formula = "解1"
Range("J3").Select
ActiveCell.Formula = Str$(x1)
Range("K2").Select
ActiveCell.Formula = "解2"
Range("K3").Select
ActiveCell.Formula = Str$(x2)
End If
If d = 0 Then
Range("J2").Select
ActiveCell.Formula = "x ="
Range("J3").Select
ActiveCell.Formula = Str$(b2)
End If
If d < 0 Then
d2 = Sqr(-d) / 2
Range("J2").Select
ActiveCell.Formula = "x1 ="
Range("J3").Select
ActiveCell.Formula = Str$(b2) + " +- i " + Str$(d2)
End If
If "J3" = "K3" Then
Range("I3").Select
ActiveCell.Formula = "重解"
End If
If "J3" > "K3" Then
Range("I3").Select
ActiveCell.Formula = "2つの異なる実根"
End If
If "J3" < "K3" Then
Range("I3").Select
ActiveCell.Formula = "2つの異なる実根"
End If
Range("b8").Select
End Sub
マクロ初心者なのでわかりやすい解説お願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんばんは。
この内容の解説はしませんが、ユーザー定義関数で、マクロを作ってみました。
関数だけでも、出せますが、マクロなので、組み込みました。
他人のマクロは、こちらは、手を付けません。
-----------------------------------------
Sub Test1()
Dim a As Double
Dim b As Double
Dim c As Double
Dim D As Double
a = Range("A3").Value
b = Range("C3").Value
c = Range("E3").Value
Range("I3:K3").ClearContents
D = b ^ 2 - 4 * a * c '判定式
If D > 0 Then
Range("I3").Value = "二つの異なる実数解"
Range("J3").Value = xQuadra(a, b, c, 0)
Range("K3").Value = xQuadra(a, b, c, 1)
ElseIf D = 0 Then
Range("I3").Value = "重解"
Range("J3").Value = xQuadra(a, b, c, 0)
Else
Range("I3").Value = "二つの異なる虚数解"
'ひとつにまとめる
Range("J3").Value = Replace(xQuadra(a, b, c, 0), "-i", "±i", , 1)
'Range("J3").Value = xQuadra(a, b, c, 0)
'Range("K3").Value = xQuadra(a, b, c, 1)
End If
End Sub
Function xQuadra(a As Double, b As Double, c As Double, Optional n As Long = 0)
Dim ret(1) As Double
Dim D As Double
Dim buf As Variant
Dim iSgn As Variant
Dim i As Variant
D = b ^ 2 - 4 * a * c '判定式
If a = 0 Then xQuadra = CVErr(xlErrNum): Exit Function
If n > 0 Then n = 1: iSgn = 1
If n <= 0 Then n = 0: iSgn = -1
If D >= 0 Then
ret(n) = (-b + iSgn * D ^ (1 / 2)) / 2 * a
If ret(n) = 0 Then
buf = 0
Else
buf = ret(n)
End If
ElseIf D < 0 Then
ret(n) = -b / 2 * a
If ret(n) = 0 Then
buf = ""
Else
buf = ret(n)
End If
If iSgn > 0 Then
iSgn = "+"
Else
iSgn = "-"
End If
i = ((-D) ^ (1 / 2)) / 2 * a
If i = 1 Then
i = ""
End If
buf = buf & iSgn & CStr(i) & "i"
End If
xQuadra = buf
End Function
No.2
- 回答日時:
dの値が正・ゼロ・負のいずれかによって
2つの異なる実根・重根・複素数根が判断できると思うので、
>If "J3" = "K3" Then
から下でやりたいことは上にあるifの中に組み込んでしまうのがスムーズです。
ついでに言うなら、
>If "J3" = "K3" Then
これは、If Range("J3") = Range("K3") Then
のようにしたかったのだと推察します。
それに、重根の時はJ3セルにしか数値を入力していなくK3セルは値が無いので、
ここでこういった判断をした所で意味がありません。
少し見ずらい所があったので、
同じ処理をしつつ、簡易的に修正を入れてみました。
Ifを3つ使って判断していますが、Select Case~の方が慣れてきたら使いやすいと思います。
余裕があれば調べてみて下さい。
※ここは数学のカテゴリーでは無いので計算内容についてはご自身で検証して下さい。
Sub niji()
a = Range("A3").Value
b = Range("C3").Value
b2 = -b / 2
c = Range("E3").Value
d = b * b - 4 * a * c
Range("I2:K3").ClearContents
If d > 0 Then
x1 = b2 + Sqr(d) / 2
x2 = b2 - Sqr(d) / 2
Range("J2").Value = "解1"
Range("J3").Value = Str$(x1)
Range("K2").Value = "解2"
Range("K3").Value = Str$(x2)
Range("I3").Value = "2つの異なる実根"
End If
If d = 0 Then
Range("J2").Value = "x ="
Range("J3").Value = Str$(b2)
Range("I3").Value = "重解"
End If
If d < 0 Then
d2 = Sqr(-d) / 2
Range("J2").Value = "x1 ="
Range("J3").Value = Str$(b2) + " +- i " + Str$(d2)
Range("I3").Value = "複素数根"
End If
End Sub
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?e8efa67)
No.1
- 回答日時:
当方 エクセル97ですのでそのつもりで聞いてください。
あなたのプログラムの2箇所だけ、プログラムの最初に変数宣言文を入れ、Xの2乗の項の係数をA3に入れましたら、答えが得られました。ただし、例題は実数の解のあるときですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二次方程式の解の書き方
-
高校数学についてです。 以下の...
-
なぜ「異なる2つの実数解」と書...
-
高1の数学でこんな感じに解の公...
-
連立方程式の答え方って (x,y)=...
-
「二つの2次方程式があり、一方...
-
2次方程式でX^2-3x+2k=0 が...
-
対称行列同士の積は対称行列?
-
判別式はyにおいても使えますか...
-
83 a=0、2、≠0、2、と場合分け...
-
日本冰川神社解籤
-
虚数係数?の三次方程式について
-
文字でおく意味
-
八阪神社 戀愛籤 解籤
-
なんでx軸と接しているところが...
-
aを定数とする。 2次方程式 x²+...
-
★判別式って必要?不要?なのか...
-
異なるふたつの虚数解と虚数解...
-
D<0はすべての実数じゃないんで...
-
数が大きい式の因数分解をする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
小学生の時(40年前)に、18÷...
-
高1の数学でこんな感じに解の公...
-
二次方程式の解の書き方
-
なんでx軸と接しているところが...
-
求伏見稻荷大社和難波八阪神社...
-
3次と2次の方程式の共通解
-
二次方程式の虚数解と複素数の...
-
対称行列同士の積は対称行列?
-
なぜ「異なる2つの実数解」と書...
-
共通解の問題についてです。こ...
-
中3の因数分解についてです x^2...
-
2次方程式でX^2-3x+2k=0 が...
-
2次方程式x^2-x-1=0の2つの解を...
-
xとyの一次式の積に因数分解
-
八阪神社 戀愛籤 解籤
-
ちょっと思い至ったんですが超...
-
a又はb及びc
-
異なる4つの解
-
2次・3次方程式の共通解に関...
-
高校数学についてです。 以下の...
おすすめ情報