掃き出し法を使って解くようですが、
-1002000
00-1-2000
0-200-110
0210000
000-20-10
0002001
このように、行の入れ替えが必要な場合、繰り返しを用いて行を入れ替える必要がありますよね?
下のように作ってみましたが、上手くいきません。↑の行列を正しく入れ替えるだけならできるのですが、もう一度プログラムを作動させるとエラーが出ます。
For j = l To 6
If Abs(a(j, l)) >= Abs(max) Then'0と負の値しかない場合、0が最大になってしまう
u = j 'このときの行を保存
End If
Next j
For m = 1 To 7
brank = a(l, m) '入れ替える前の値を保存
a(l, m) = a(u, m)
a(u, m) = brank
Cells(l, m) = Cells(u, m)
Cells(u, m) = brank
Next m
Next l
do loopを使った方が良いと聞いたのですが、どのようにすればよいのでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
プログラムの一部だけ示されても、エラーの原因を特定するのは困難ですが、あえて想像するなら、
For j = l To 6
If Abs(a(j, l)) >= Abs(max) Then'0と負の値しかない場合、0が最大になってしまう
u = j 'このときの行を保存
End If
Next j
のところで、maxには何の値が入っているんでしょうか?
If文がすべてFLASEで、u = j が1回も実行されないとき、uには何の値が入っているんでしょうか?
もし、u = 0 なら Cells(l, m) = Cells(u, m) の箇所でエラーになります。
For m = 1 To 7
・・・・・
Next m
で列を入れ替えていますが、入れ替えするかどうかの判定が必要ではないですか?
do loopを使った方が良いかどうかは、全体の流れがわからないので何とも言えないです。
この回答への補足
Sub kadai2() ' 列の入れ替えを行う必要がある
Dim a(6, 7) As Double
Dim b(6) As Double
Dim max As Double
Dim f As Single
Dim j As Integer
Dim i As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim u As Integer
Dim w As Double
Dim brank As Double
For j = 1 To 6
For i = 1 To 7
a(j, i) = Cells(j, i)
Next i
b(j) = Cells(j, 7)
Next j
For l = 1 To 6
i = 1
max = 0
brank = 0
For j = l To 6 '入れ替えの時、iの値が変化していない、繰り返し
If Abs(a(j, l)) >= Abs(max) Then
max = a(j, l) '行の最大値が分かればよい,最大値を記録する必要無
u = j 'このときの行を保存
End If
Next j '繰り返し終わり
For m = 1 To 7
brank = a(l, m) '入れ替える前の値を保存
a(l, m) = a(u, m)
a(u, m) = brank
Cells(l, m) = Cells(u, m) '入れ替えは繰り返し終わった後 lの値が変化しないorz⇒入れ替えてるのはセルだけで、配列を入れ替えていない!
Cells(u, m) = brank '入れ替えは繰り返し終わった後
Next m
Next l
For j = 1 To 6
For i = 1 To 6
a(j, i) = Cells(j, i)
Next i
b(j) = Cells(j, 7)
Next j
For j = 1 To 6
For i = 1 To 6
If j <> i Then
a(j, i) = a(j, i) / a(j, j)
End If
Next i
b(j) = b(j) / a(j, j)
a(j, j) = 1
Cells(j + 7, j) = a(j, j)
For l = 1 To 6
If l <> j Then
w = a(l, j)
For i = 1 To 6 'j列同士の引き算
a(l, i) = a(l, i) - a(j, i) * w
Next i
b(l) = b(l) - b(j) * w 'wの値がおかしい ここi で繰り返す意味ない。ここでbの値が全く変化していない!A.a(j,7)は存在しない: l =2のとき、b(1)が計算されない
End If
Next l
Next j
For j = 1 To 6
For i = 1 To 6
Cells(j + 7, i) = a(j, i)
Cells(j + 7, 7) = b(j)
Next i
Next j
End Sub
No.2
- 回答日時:
アルゴリズムを確認。
サンプルも多数ある。無駄なループはしてないか、判定なく入れ替えか、初期値は良いか、そんなところから。
1のときどう?、2のときどう?、トレース作業をすると見えてくる。
聞く前にもう一度見る。
No.3
- 回答日時:
#1です。
プログラムを見ましたが、掃き出し法のアルゴリズムが間違ってます。
プログラムを見ると、
まず、行の入れ替えで対角上に最大の数値を移してから、そのあとに掃き出し法の計算で対角以外を0にしていますね。
この方法では、行の入れ替えで必ずしも対角上に0以外の数値がくるとは限りません。
実際、2回目の実行では、行の入れ替えをしてもCells(5,5)が0になっています。
これがエラーになる原因です。
正しい掃き出し法のアルゴリズムは、
行の入れ替えと行の計算を別々に行うのではなく、同じループの中で行います。
For n = 1 to 6
(n列n行が最大数値になるようn+1行以降の行と入れ替える)
(n列のn行を1に、n行以外が0になるように計算する)
Next n
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正しい五十音順について
-
Dijkstraて
-
多変数関数の最小値を求めるプ...
-
[ EXCEL VBA ] 図形を読み込む...
-
Stuck
-
プログラミングの才能のある無...
-
Fotranで最小公倍数
-
アルゴリズムのB木について
-
Cプログラミング
-
よくプログラミングをやるにあ...
-
Visual studio2019 C#で生まれ...
-
画像から文字を認識してテキス...
-
アルゴリズムとは、フローチャ...
-
OpenCVのライセンスについて
-
乗換案内の作り方が知りたいです。
-
C++行列計算プログラム
-
パズルが好きな人ってプログラ...
-
携帯のパスワードについてです。
-
アルゴリズムとプロトコールの違い
-
一番近い組み合わせを見つけるには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正しい五十音順について
-
Dijkstraて
-
Stuck
-
[ EXCEL VBA ] 図形を読み込む...
-
BCDについて
-
アルゴリズムとプロトコールの違い
-
期間重複チェックがわかりません
-
グループを均等に分けるには?...
-
三次元形状曲面の導出法
-
あいまい検索(文字列一致率)
-
Visual studio2019 C#で生まれ...
-
gooという検索エンジンの後にGo...
-
フリーセルの難易度について
-
CRC-CCITT16の算出法
-
経路探索について
-
C♯で電卓を作成しています。演...
-
理系の高校生です。大学で情報...
-
OpenCVのライセンスについて
-
偏りのある乱数のアルゴリズム
-
詰め将棋をとくのは、アルゴリ...
おすすめ情報