Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11580 / 13645 ツリー ←次へ | 前へ→

【15322】間違いを探してください。 たすけてください 04/6/21(月) 19:44 質問[未読]
【15324】Re:間違いを探してください。 しん 04/6/21(月) 19:56 回答[未読]
【15325】Re:間違いを探してください。 かみちゃん 04/6/21(月) 19:58 発言[未読]
【15327】Re:間違いを探してください。 たすけてください 04/6/21(月) 20:07 質問[未読]
【15328】Re:間違いを探してください。 かみちゃん 04/6/21(月) 20:10 発言[未読]
【15330】Re:間違いを探してください。 たすけてください 04/6/21(月) 20:15 質問[未読]
【15331】Re:バブルソート? かみちゃん 04/6/21(月) 20:28 回答[未読]
【15332】Re:バブルソート? たすけてください 04/6/21(月) 20:37 質問[未読]
【15334】Re:バブルソート? かみちゃん 04/6/21(月) 20:51 回答[未読]
【15335】Re:バブルソート? たすけてください 04/6/21(月) 20:58 質問[未読]
【15336】Re:バブルソート? かみちゃん 04/6/21(月) 21:08 回答[未読]
【15337】Re:バブルソート? たすけてください 04/6/21(月) 23:31 質問[未読]
【15339】Re:バブルソート? かみちゃん 04/6/22(火) 0:15 回答[未読]
【15341】Re:バブルソート? ichinose 04/6/22(火) 0:25 発言[未読]
【15329】Re:間違いを探してください。 ichinose 04/6/21(月) 20:15 回答[未読]

【15322】間違いを探してください。
質問  たすけてください  - 04/6/21(月) 19:44 -

引用なし
パスワード
   Sub 練習3()
fori = 4 to 1 step -1
forj = 1 to i
If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
x = Cells(1, j).Value
 Cells(1, j).Value = Cells(1, (j + 1)).Value
 Cells(1, (j + 1)).Value = x
 End If
Next j
Next i

End Sub

このプログラミングが実行できません。間違いを探してください。お願いします。

【15324】Re:間違いを探してください。
回答  しん  - 04/6/21(月) 19:56 -

引用なし
パスワード
   ▼たすけてください さん:

>fori = 4 to 1 step -1
>forj = 1 to i

>このプログラミングが実行できません。間違い
は上の2行のステートメントです。

for iやfor jとしないと文法エラーになります。

【15325】Re:間違いを探してください。
発言  かみちゃん  - 04/6/21(月) 19:58 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>このプログラミングが実行できません。間違いを探してください。お願いします。

実行できないのは、何かエラーが出るのでしょうか?
強いて言うならここかな?単純にタイプミスのような気もしますが・・・
>fori = 4 to 1 step -1
>forj = 1 to i
何もエラーが出ないのに、期待するとおり動かないということなのでしょうか?

もう少し具体的に質問していただかないと「添削」のしようがないのですが・・・

【15327】Re:間違いを探してください。
質問  たすけてください  - 04/6/21(月) 20:07 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>このプログラミングが実行できません。間違いを探してください。お願いします。
>
>実行できないのは、何かエラーが出るのでしょうか?
>強いて言うならここかな?単純にタイプミスのような気もしますが・・・
>>fori = 4 to 1 step -1
>>forj = 1 to i
>何もエラーが出ないのに、期待するとおり動かないということなのでしょうか?
>
>もう少し具体的に質問していただかないと「添削」のしようがないのですが・・・
すみません単純なミスでした。
もう一つお聞きしたいのですが、私の作ったプログラミングで実行すると
A1のセルがあいて、B1から表示されます。どうすればよいでしょうか。

【15328】Re:間違いを探してください。
発言  かみちゃん  - 04/6/21(月) 20:10 -

引用なし
パスワード
   こんちには。かみちゃん です。

>A1のセルがあいて、B1から表示されます。どうすればよいでしょうか。

再度おたずねいただくは、いいのですが、それであれば、テストデータと期待する結果を提示していただけますか?

【15329】Re:間違いを探してください。
回答  ichinose  - 04/6/21(月) 20:15 -

引用なし
パスワード
   ▼たすけてください さん:
こんばんは。
バブルソートですか?

>Sub 練習3()
for i = 4 to 1 step -1
'Forと変数の間は、空白ひとつ入れてください
 for j = 1 to i
   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
    x = Cells(1, j).Value
    Cells(1, j).Value = Cells(1, (j + 1)).Value
    Cells(1, (j + 1)).Value = x
    End If
   Next j
 Next i
>
>End Sub
入れ子の構文は、上記のようにしないと見難くないですか?

>
>このプログラミングが実行できません。間違いを探してください。お願いします。
次回は、↑の「実行できない」の現象を詳しく書いてくださいね!!

ちなみに上記のコードだと
セルA1からE1の並べ替えになってますが、正しいですか?
(A1〜D1ではないですよ!!)

【15330】Re:間違いを探してください。
質問  たすけてください  - 04/6/21(月) 20:15 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんちには。かみちゃん です。
>
>>A1のセルがあいて、B1から表示されます。どうすればよいでしょうか。
>
>再度おたずねいただくは、いいのですが、それであれば、テストデータと期待する結果を提示していただけますか?
Sub 練習3()
For i = 4 To 1 Step -1
For j = 1 To i
If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
x = Cells(1, j).Value
 Cells(1, j).Value = Cells(1, (j + 1)).Value
 Cells(1, (j + 1)).Value = x
 End If
Next j
Next i

End Sub


これを実行させてA1、B1、C1、D1のセルにそれぞれ24、17、16、18 を昇順
にならびかえて表示させたいです。説明不足でした。すみません。

【15331】Re:バブルソート?
回答  かみちゃん  - 04/6/21(月) 20:28 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>これを実行させてA1、B1、C1、D1のセルにそれぞれ24、17、16、18 を昇順
>にならびかえて表示させたいです。説明不足でした。すみません。

ichinoseさんからも、コメントが書かれていますが、
> > セルA1からE1の並べ替えになってますが、正しいですか?
のとおりです。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=15329;id=excel

つまり、B1から始まっているのではなく、E1まで比較を繰り返していて、E1が空白だった場合、A1にその空白がきているということになります。

そこで、
> For i = 4 To 1 Step -1
の部分を
For i = 3 To 1 Step -1
としてみてください。

【15332】Re:バブルソート?
質問  たすけてください  - 04/6/21(月) 20:37 -

引用なし
パスワード
   ▼かみちゃん さん:
>そこで、
>> For i = 4 To 1 Step -1
>の部分を
>For i = 3 To 1 Step -1
>としてみてください。

うまくできましたが、なぜ3にすると出来るのでしょうか。

【15334】Re:バブルソート?
回答  かみちゃん  - 04/6/21(月) 20:51 -

引用なし
パスワード
   こんちには。かみちゃん です。

>うまくできましたが、なぜ3にすると出来るのでしょうか。

「バブルソート」のアルゴリズムについての考え方です。
http://aitech.ac.jp/~koikelab/webp/vba/vba_9.html
ちょっと、難しいかも?

24、17、16、18のバブルソートの考え方を簡単に言うと、

1-1回目で24と17を比較して、17、24(入替)、16、18になる。
1-2回目で24と16を比較して、17、16、24(入替)、18になる。
1-3回目で24と18を比較して、17、16、18、24(入替)になる。
2-1回目で17と16を比較して、16、17(入替)、18、24になる。
2-2回目で17と18を比較して、16、17、18(そのまま)、24になる。
★2-3回目は、1-3回目で比較済みだから、比較しない。
3-1回目で16と17を比較して、16、17(そのまま)、18、24になる。
★3-2回目は、2-2回目で比較済みだから、比較しない。

となります。わかりますでしょうか?
もしかして、これも、「情報B」の課題ですか?

【15335】Re:バブルソート?
質問  たすけてください  - 04/6/21(月) 20:58 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんちには。かみちゃん です。
>
>>うまくできましたが、なぜ3にすると出来るのでしょうか。
>
>「バブルソート」のアルゴリズムについての考え方です。
>http://aitech.ac.jp/~koikelab/webp/vba/vba_9.html
>ちょっと、難しいかも?
>
>24、17、16、18のバブルソートの考え方を簡単に言うと、
>
>1-1回目で24と17を比較して、17、24(入替)、16、18になる。
>1-2回目で24と16を比較して、17、16、24(入替)、18になる。
>1-3回目で24と18を比較して、17、16、18、24(入替)になる。
>2-1回目で17と16を比較して、16、17(入替)、18、24になる。
>2-2回目で17と18を比較して、16、17、18(そのまま)、24になる。
>★2-3回目は、1-3回目で比較済みだから、比較しない。
>3-1回目で16と17を比較して、16、17(そのまま)、18、24になる。
>★3-2回目は、2-2回目で比較済みだから、比較しない。
>
>となります。わかりますでしょうか?
>もしかして、これも、「情報B」の課題ですか?

はい。情報Bの課題です。
本当は、2,5,3,1,4,を並び替える。
というのをつくりたいのです。
これを利用して出来るでしょうか。

【15336】Re:バブルソート?
回答  かみちゃん  - 04/6/21(月) 21:08 -

引用なし
パスワード
   こんにちは、かみちゃん です。

>>もしかして、これも、「情報B」の課題ですか?
>
>はい。情報Bの課題です。

基本的な考え方は、教科書などに載っているかもしれません。

>本当は、2,5,3,1,4,を並び替える。
>というのをつくりたいのです。
>これを利用して出来るでしょうか。

要は、何個の数字を並べ替えたいのかということです。
さきほどの For i = 3の場合は、4個の数字の並べ替え
では、今回の5個の数字の並べ替えは・・・・
For i = 4
とすれば、できると思います。
つまり、「並べ替えしたい個数-1」がxxだった場合、
For i = xx とすればいいです。

【15337】Re:バブルソート?
質問  たすけてください  - 04/6/21(月) 23:31 -

引用なし
パスワード
   ▼かみちゃん さん:
Sub 練習3()
For i = 3 To 1 Step -1
 For j = 1 To i
   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
    x = Cells(1, j).Value
    Cells(1, j).Value = Cells(1, (j + 1)).Value
    Cells(1, (j + 1)).Value = x
    End If
   Next j
 Next i
End Sub
の説明をしなければならないのですが意味がチンプンカンプンです。
ほんとうにピンチです。おしえてください。御願いします。

【15339】Re:バブルソート?
回答  かみちゃん  - 04/6/22(火) 0:15 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>の説明をしなければならないのですが意味がチンプンカンプンです。

とりあえず、コメント文にして、説明を我流で書きました。
「意味がチンプンカンプン」とは、具体的にどこなのでしょうか。
何か情報Bの課題を手伝わされているような気がして、いわばノートの書き写しをされているような気がします。
まずは、ご自分で、教科書、ExcelVBAのヘルプ情報、VBAの解説本、Excelのサイトなどで「調べる」という努力をされてはいかがでしょうか?

Sub 練習3()
 '変数iを3を起点として-1ずつ足して(Step)いってiが1になるまで繰り返す。
 For i = 3 To 1 Step -1
  '変数jを1を起点として1ずつ足して(Step 1の記述は省略されている)変数iになるまで繰り返す。
  For j = 1 To i
   'もし、1行目、変数j列目のセルの値が、1行目、変数jに1足した列のセルの値よりも大きければ
   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
    '変数xに1行目、変数jの値の列のセルの値を入れる。
    x = Cells(1, j).Value
    '変数xに1行目、変数jの値の列のセルに、1行目、変数jに1足した列のセルの値を入れる。
    Cells(1, j).Value = Cells(1, (j + 1)).Value
    '変数jに1足した列のセルに変数xを入れる。
    Cells(1, (j + 1)).Value = x
   End If
  '変数jのFor文の先頭に戻る。
  Next j
 '変数iのFor文の先頭に戻る。
 Next i
End Sub

※今日は、もう寝ますので・・・

【15341】Re:バブルソート?
発言  ichinose  - 04/6/22(火) 0:25 -

引用なし
パスワード
   ▼たすけてください さん:
皆さん、こんばんは。
解決したと思っていたんですが・・・。


>Sub 練習3()
>For i = 3 To 1 Step -1
> For j = 1 To i
>   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
>    x = Cells(1, j).Value
>    Cells(1, j).Value = Cells(1, (j + 1)).Value
>    Cells(1, (j + 1)).Value = x
>    End If
>   Next j
> Next i
>End Sub
>の説明をしなければならないのですが意味がチンプンカンプンです。
>ほんとうにピンチです。おしえてください。御願いします。
このソートは(上記のコードを例に取ると)、

小さい数〜大きい数の順で並べるロジックなんですが、


>  For i = 3 To 1 Step -1
   のiの値が3のときのつまり最初の繰り返し処理を考えましょう。
   
>   For j = 1 To i
>    If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
>      x = Cells(1, j).Value
>      Cells(1, j).Value = Cells(1, (j + 1)).Value
>      Cells(1, (j + 1)).Value = x
>      End If
>    Next j

この内側のFor〜Next文を考えましょう。
i=3
ですから、

 For j = 1 To 3
   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
    x = Cells(1, j).Value
    Cells(1, j).Value = Cells(1, (j + 1)).Value
    Cells(1, (j + 1)).Value = x
    End If
   Next j

ということになりますね?
ループは、3回繰り返しますが、
その間に
A1とB1を比較 1回目
B1とC1を比較 2回目
C1とD1を比較 3回目

という処理をしている事を理解して下さい。

そして、この処理により、セルA1〜D1の中で一番大きい値が
D1にセットされます。

これがi=3 の時に行う処理なんです。つまり、

・4つの値の中で一番大きい値を最後の入れ物に入れる


では、


>  For i = 3 To 1 Step -1
   のiの値が2のときのは?
 内側のFor文を書き換えると

 For j = 1 To 2
   If Cells(1, j).Value > Cells(1, (j + 1)).Value Then
    x = Cells(1, j).Value
    Cells(1, j).Value = Cells(1, (j + 1)).Value
    Cells(1, (j + 1)).Value = x
    End If
   Next j

ループは、2回繰り返しますが、
その間に
A1とB1を比較 1回目
B1とC1を比較 2回目

これは、一番大きい値を除いた3つ値から一番大きい値をC1にセットします。
つまり、A1〜D1の中で2番目に大きい値をC1にセットする処理です。

同様に
i=1のときは、
A1〜D1の中で3番目に大きい値をB1にセットする処理です。

当然ですが、B1が決まれば、A1は自ずと決まりますよね?


と言うように
A1〜D1の中で一番大きい値から2番目、3番目と大きい順に値をセットしていく
ロジックなんです。

後は、iの値が3〜1になる間にセルの値の移動を
紙に書くなどして確認してみて下さい。
あっ、Excel使ってるんだから、2行目、3行目に書いていってみて下さい。

11580 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free