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

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

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

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

配列

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

Q&A

解決済

2回答

1750閲覧

VBA 配列に詰めたデータを昇順で表示させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

配列

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

0グッド

0クリップ

投稿2021/05/17 08:52

編集2021/05/17 08:54

実現したいこと

配列に詰めたデータを昇順で表示させたい

データ

現状ソート後も、昇順にならない状態です。
都道府県がA2:B48まで並んでいます。
イメージ説明

Dim s As Long, B As Variant, n As Long n = Cells(Rows.count, 4).End(xlUp).Row ReDim B(n - 2, 0) On Error GoTo myError For s = 2 To n B(s - 2, 0) = WorksheetFunction.VLookup(Cells(s, 4), Range("H2:I11"), 2, False) On Error Resume Next Next s Exit Sub myError: MsgBox "エラー番号:" & Err.Number & vbCrLf & _ "エラーの種類:" & Err.Description, vbExclamation Dim tmp As Variant '入れ替え時に一時的にデータを格納 Dim min As Integer 'その時点での最小値が格納されるセルの行番号 Dim k As Integer '最新のソート対象行 Dim m As Integer Dim i As Integer '繰り返しカウンタ '昇順にデータ整列 'ソート対象行を最上位から最終行の手前まで進める For k = 2 To n '最小値格納行を初期化 min = k For i = k + 1 To n + 1 If Cells(min, 8).Value > Cells(i, 8).Value Then min = i End If Next i For m = 8 To 9 tmp = Cells(k, m) Cells(k, m) = Cells(min, m) Cells(min, m) = tmp Next m Next k End Sub ### 現状 現状配列に詰め出力範囲に詰めることができたのですが、昇順に並べ替えることができません。 私のコードですと配列B()というのにデータがあるのですが、そこにあるデータをどのように取り出してコード後半にある選択ソートにはめ込めばいいかわかりません。 ちなみに、最初にFor k = 2 To nから下のコードを完成させ昇順に並べ替えることに成功しました。 しかし、WorksheetFunction.VLookupこちらを使い配列に詰めてから昇順にしたいのです。 よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ExcelVBA

1Sub test() 2 Dim rngList As Range '一覧のセル範囲 3 Dim rngKey As Range '検索値のセル範囲 4 Dim rngResults As Range '結果を書き込むセル範囲 5 Dim s As String '数式で使う検索値の最初のセルアドレス 6 7 With ActiveSheet 8 Set rngList = .Range("A1").CurrentRegion 9 With .Range("D1").CurrentRegion 10 Set rngKey = Intersect(.Cells, .Offset(1)) 11 End With 12 Set rngResults = rngKey.Offset(, 4).Resize(, 2) 13 End With 14 s = rngKey(1).Address(False, False) 15 16 With rngResults 17 .Columns(1).Formula = "=" & rngKey(1).Address(False, False) 18 .Columns(2).Formula = "=Vlookup(" & s & "," & rngList.Address & ",2)" 19 .Value = .Value 20 .Sort .Cells(1), xlAscending, , , , , , xlNo 21 End With 22End Sub

ソートのアルゴリズムを勉強したいなら別ですが、
Excelを使うならエクセルのソート機能を使った方が、楽で速いです。

動作確認してません。書き間違いがあるかもです。

投稿2021/05/17 23:49

mattuwan

総合スコア2163

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

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

退会済みユーザー

退会済みユーザー

2021/05/18 00:31

回答ありがとうございます。 ソートアルゴリズムを勉強したくて、選択ソートで私は書いているんですが、Excelのソート機能というものを知らなかったのでそちらも勉強していきます。ありがとうございました。
guest

0

ベストアンサー

実現したいことがよくわからなかったので、勘で書きました。

VBA

1Sub Sample() 2 Dim arrCode, arrPref 3 4 Dim n 5 n = Cells(Rows.Count, 4).End(xlUp).Row 6 ReDim arrCode(n - 2, 0) 7 ReDim arrPref(n - 2, 0) 8 Dim s 9 For s = 2 To n 10 If Cells(s, 4) <> "" Then 11 arrCode(s - 2, 0) = Cells(s, 4) 12 arrPref(s - 2, 0) = WorksheetFunction.VLookup(Cells(s, 4), Range("A2:B48"), 2, False) 13 End If 14 Next 15 16 Dim tmp As Variant '入れ替え時に一時的にデータを格納 17 Dim min As Integer 'その時点での最小値が格納されるセルの行番号 18 Dim k As Integer '最新のソート対象行 19 Dim m As Integer 20 Dim i As Integer '繰り返しカウンタ 21 22 For k = 0 To n - 3 23 min = k 24 For i = k + 1 To n - 2 25 If arrCode(min, 0) > arrCode(i, 0) Then 26 min = i 27 End If 28 Next i 29 30 tmp = arrCode(k, 0) 31 arrCode(k, 0) = arrCode(min, 0) 32 arrCode(min, 0) = tmp 33 tmp = arrPref(k, 0) 34 arrPref(k, 0) = arrPref(min, 0) 35 arrPref(min, 0) = tmp 36 37 Next 38 39 Dim r 40 r = 2 41 For k = 0 To n - 2 42 If Not IsEmpty(arrCode(k, 0)) Then 43 Cells(r, 8) = arrCode(k, 0) 44 Cells(r, 9) = arrPref(k, 0) 45 r = r + 1 46 End If 47 Next 48 49End Sub 50

投稿2021/05/17 10:46

jinoji

総合スコア4592

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

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

退会済みユーザー

退会済みユーザー

2021/05/18 00:34

回答ありがとうございます。 やはり、配列を二つ使ったほうが現実てきなのでしょうか?? 配列の中身を昇順のコードにはめ込む部分はjinojiさんのコードを参照させていただきます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問