質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

1822閲覧

助けてください何を調べてもできないです。VBA

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/07/31 11:33

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

VBAのコマンドボタンを押して、数字を入れていき、999という数字が入る、または件数が100件を超えるまで入れた数字をセルA1からA2,A3 という風に入れていき、バブルソートを使って入れた数字を昇順に並び替えた後、再びセルA1からA2,A3と入れていくプログラムを作っているのですが、なぜかうまくいかないです。なので、どこをどう直したら思い通りに動いてくれるか教えてください。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

VBA

Private Sub CommandButton1_Click()
Dim T As Integer
Dim num As Integer

Do

T = InputBox(" 点数を入力してください ") num = num + 1 Cells(num, 1) = T        ' セル A1、A2、A3という風に下へ順番に点数を入れていく

Loop Until T = 999 Or num > 100 '999が入るか点数の入力が 100 件を超えるまで入力

If Cells(num, 1) = 999 Then

Cells(num, 1).Clear

End If         '999 はデータに含まないので消す

Dim n As Long
n = Cells(1, 1).Cells(num, 1)       ' ソート対象のデータ数を特定

Dim S() As Long
ReDim S(n)        ' 数列を格納する配列の準備

Dim i As Long
For i = 1 To n
S(i) = Cells(i, 1)
Next i        ' ソート対象の数字を配列に格納

Dim x As Long
x = n - 1

Do While x > 0      ' 隣り合う数字を比較して並び替え

For i = 1 To x

If S(i) > S(i + 1) Then Dim tmp As Long     ' 一次変数を利用して値を入れ替える tmp = S(i) S(i) = S(i + 1) S(i + 1) = tmp End If Next i x = x - 1

Loop

For i = 1 To n
Cells(i, 1) = S(i)
Next i ' ソート結果を再びセルA1、 A2 、 A3 という風に下へ順番に入れていく

End Sub

試したこと

https://vbabeginner.net/配列のソート(バブルソート)/ このURL先に書いてあるコードを参考に作ったのですがうまく動きませんでした。

補足情報(FW/ツールのバージョンなど)

VBA初心者なので、猿でもわかるように説明していただければ嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/07/31 12:07

それ、人に聞いていい課題じゃないですよね?
mako1972

2020/07/31 12:12

ようするに大学の課題とかという・・。
dodox86

2020/07/31 14:11

なぜうまくいかないか分からない状態で、どこをどう直したら動くか回答を聞いても理解はおぼつかないと思いますよ。従って、ただ直すだけの作業な回答がつくことは稀です。
m.ts10806

2020/08/01 00:20

どんなに調べたとて理解できた上でコードを書かないと想定どおりに動かないのは当然で。
m.ts10806

2020/08/01 00:30

真面目な話、例えとかではなく猿の言葉が分かるんですか? 私は分かりませんし多くは分からないので猿でも分かる内容のアドバイスは存在しません。 茶化しとかではなく。 それに猿も色々理解力はあるでしょう。どのレベルの猿ですか?いわれても私は分かりませんが。
guest

回答2

0

猿はバブルソートしません。

投稿2020/07/31 11:38

mako1972

総合スコア383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こういうのが、バブルソートと呼ばれるアルゴリズムなのかは知りませんが、

数列が

3,5,5,7,9,1

とあったとき、

昇順に並べ替える。

1)1番目と2番目を比べる false
2)2番目と3番目を比べる false
3)3番目と4番目を比べる false
4)4番目と5番目を比べる false
5)5番目と6番目を比べる true
6) 5番目と6番目を入れ替える

とここまで来たとき、
5番目と6番目の関係は整合が取れてますが、
4番目と新たな5番目の関係性は担保されません。
なので、リセットして1から関係性のチェックが必要になると思います。
ということは、入れ替えが発生したときはいったんループを抜け、
ループを初期値から繰り返すことになります。
ループを途中で抜けなかったら(Nextの行を通ったら)、
すべての整合性が取れているということになるので、
それで作業終了になります。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim i As Long 5 Dim s As Long 6 7 'テストデータ入力 8 i = 1 9 Do 10 s = InputBox(Prompt:="点数入力", Default:=Int(Rnd() * 100)) 11 If s >= 999 Then Exit Do 12 Cells(i, "A").Value = s 13 i = i + 1 14 Loop Until i = 100 15 16 'セル範囲の値群を一次配列に変換 17 Dim v As Variant 18 v = WorksheetFunction.Transpose(Range("A1").Resize(i - 1)) 19 20 21 '並び替え 22 バブルソート練習 v 23 24 '結果をシートに返す 25 Range("A1").Resize(i - 1).Value = WorksheetFunction.Transpose(v) 26End Sub 27 28Function バブルソート練習(ByRef vv As Variant) 29 Dim i As Long 30 Dim j As Long 31 Dim tmp As Long 32 33 j = UBound(vv) - 1 34 35 Do 36 For i = 1 To j 37 If vv(i) > vv(i + 1) Then 38 tmp = vv(i) 39 vv(i) = vv(i + 1) 40 vv(i + 1) = tmp 41 Exit For 42 End If 43 Next 44 Loop Until i > j 45End Function

あれもこれも列記していくと何がなんだかわからなくなるので、
バブルソートがうまくいかないなら、そこに集中できるよう、
プロシージャを分けてしまって、変数にはすでに一次配列が入っているところから、
考えましょう。

あぁ、動作確認はしてません。
(2,3回試したけど大丈夫そう?)
上手くいってなかったらごめんなさい。

んー。
とりあえず、変更があったのは1個だから、
その時にリセットして最初から見ていかなくても、
何か工夫をしたら、ループの回数を減らせそうな気はするが。。。。

投稿2020/08/01 01:14

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mako1972

2020/08/01 01:22

素晴らしいですね。昔、VBで最大値、最小値を求めるプログラムを授業の課題として でましたが、バブルソートはやりませんでした。 VBAアルゴリズム辞典とかあると勉強が進んでいいですね。
mattuwan

2020/08/01 01:28

このレベルなら、習わなくても思いつくレベルでしょう。 アルゴリズムを勉強するなら、VBAから離れて書籍を漁った方がいいかと。 個人的にはアルゴリズムを勉強しないで、エクセル君の並べ替え機能に頼ります。 一行でなんも考えずにSort!と呪文を唱えればいいのですから。 が、シートの並べ替えとかにこういう感じのやり方が応用できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問