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
No.1
- 回答日時:
当方 エクセル97ですのでそのつもりで聞いてください。
あなたのプログラムの2箇所だけ、プログラムの最初に変数宣言文を入れ、Xの2乗の項の係数をA3に入れましたら、答えが得られました。ただし、例題は実数の解のあるときですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 3 2022/08/21 20:51
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 2 2022/03/28 17:38
- Excel(エクセル) マクロを簡潔にしたい 6 2022/09/16 10:37
- Excel(エクセル) Excelマクロ 同列内で複数の数式を繰り返す方法 5 2022/05/22 13:58
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Visual Basic(VBA) 関数を最終行までコピー 3 2022/09/04 11:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
高1の数学でこんな感じに解の公...
-
3次と2次の方程式の共通解
-
求伏見稻荷大社和難波八阪神社...
-
xについての2次方程式x²-2mx+2m...
-
共通解の問題についてです。こ...
-
異なる4つの解
-
数学についてです。 aX²+bX+c...
-
数学I
-
a又はb及びc
-
対称行列同士の積は対称行列?
-
数学を教えてください。
-
二次方程式の解の書き方
-
なんでx軸と接しているところが...
-
2次・3次方程式の共通解に関...
-
なぜ「異なる2つの実数解」と書...
-
2次方程式でX^2-3x+2k=0 が...
-
数2の問題について
-
【数Ⅰ】次の2次方程式が重解を...
-
高校数学についてです。 以下の...
-
因数分解 数字を早く見つける方法
おすすめ情報