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

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

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

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

2回答

9543閲覧

VBA ユーザーフォーム リストボックスのソート

kohan

総合スコア9

VBA

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

0クリップ

投稿2020/10/10 13:13

平素は皆様にご教授いただき、まことにありがとうございます。
リストボックス内で、時間で昇順にソートをかけたいと思い、サイトを巡回して似たようなものを見つけたので、少し変えて作ってみました。
結果として、エラーは出ずに、昇順ソートしてくれていますが、、以下のような問題に直面しています、、画像もお付けいたします。
1、2列目から1列目に寄ってしまう
2、ソートすると、1桁時刻と2桁時刻をわけてしまう
という感じです。
1次元配列(専門用語の理解とか使い方間違ってると思います。。。以下同じ)でなくて、2次元配 
列で放り込む方法ってあるんでしょうか、、
よろしければ、ご教授いただければ幸いです。。

ABV

1Private Sub CommandButton12_Click() 2 Dim column1 As String 3  Dim column2 As String 4   Dim i As Long 5 6With CreateObject("System.Collections.ArrayList") 7For i = 0 To ListBox1.ListCount - 1 8column1 = ListBox1.List(i, 0) 9column2 = ListBox1.List(i, 1) 10 11.Add column2 12 13Next i 14 15.Sort 16 17ListBox1.Clear 18 19For i = 0 To .Count - 1 20 21ListBox1.AddItem .Item(i) 22 23Next i 24.Clear 25End With 26 27End Sub 28

add colimn2を入れてみましたが、見事に時刻と数字が一直線に並びました、
おそらくですが、、時刻が文字列なので、数値に変えて格納して、2列で格納出来たら解決するのかなと、、
よろしければ、ご教授いただけませんでしょうか、よろしくお願いいたします。イメージ説明

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

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

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

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

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

meg_

2020/10/10 13:32

「8:20」ではなく「08:20」にしてはどうでしょうか?
kohan

2020/10/10 13:53

ご回答ありがとうございます。あ、、そうですね、、、、やってみたいと思います。。 あと、2列で格納できるかどうかですが、、この点については解決可能なのでしょうか? arrylistには、1次元でしか格納できないのでしょうか、、
meg_

2020/10/10 13:59

「2列で格納」の意味がちょっと分かりませんでした。(”何を”2列にして”何に”格納するんでしょう?)
kohan

2020/10/10 14:18

あ、失礼いたしました。 リストボックスにある 1列目 「氏名」のデータ 2列目の「時刻」のデータ を ArrayList に格納できるかということです、、 With CreateObject("System.Collections.ArrayList") For i = 0 To ListBox1.ListCount - 1 column1 = ListBox1.List(i, 0) column2 = ListBox1.List(i, 1) .Add column1 .Add column2 とすると、ソートをかけると、結果として、1列縦隊で出力するので、なにか他に格納の方法があれば、、、ということでの質問です。
meg_

2020/10/10 14:44

tmpが2次元配列だとすると、ListBox1.List = tmp で初期化できるようです。
kohan

2020/10/10 15:04

すいません、、たびたびです、、構文としては、どう書けばいいのでしょうか、、よろしければ、教えていただけませんか、
kohan

2020/10/11 11:55

情報をいただきまして、まことにありがとうございます。 temp とはそういうことなのですね、、といいつつ、まだ理解できていませんが、、
guest

回答2

0

ベストアンサー

System.Collections.ArrayList は1列しか格納できません。

時刻と氏名を文字列として連結して格納することになります。
文字列でのソートは先頭からが基準になりますので、
時刻が前にくるようにして、時刻の桁数はそろえて格納します。

vba

1Private Sub UserForm_Initialize() 2 With Me.ListBox1 3 .ColumnCount = 2 4 .AddItem "AAA" 5 .List(.ListCount - 1, 1) = "10:00" 6 .AddItem "BBB" 7 .List(.ListCount - 1, 1) = "08:20" 8 .AddItem "CCC" 9 .List(.ListCount - 1, 1) = "09:00" 10 .AddItem "DDD" 11 .List(.ListCount - 1, 1) = "09:05" 12 .AddItem "EEE" 13 .List(.ListCount - 1, 1) = "09:55" 14 End With 15End Sub 16 17Private Sub CommandButton12_Click() 18 Dim column1 As String 19 Dim column2 As String 20 Dim i As Long 21 22 With CreateObject("System.Collections.ArrayList") 23 For i = 0 To ListBox1.ListCount - 1 24 column1 = ListBox1.List(i, 0) 25 column2 = ListBox1.List(i, 1) 26 .Add column2 & ";" & column1 '"10:00;AAA" という文字列で格納。 27 Next i 28 29 .Sort 30 31 Dim ary 32 For i = 0 To .Count - 1 33 ary = Split(.Item(i), ";") '; で配列に分割 34 Debug.Print Join(ary) 35 ListBox1.List(i, 0) = ary(1) 36 ListBox1.List(i, 1) = ary(0) 37 Next i 38 .Clear 39 End With 40 41End Sub

別案

エクセルの機能を活用しましょう。
まずシート上に見出しとデータを入力します。
入力したセル範囲を選択して「テーブルとして書式設定」でテーブル化します。
イメージ説明

リボンの「数式」→「名前の管理」をクリックすると表の範囲が「テーブル1」という名前が自動でついているのが確認できます。ここでテーブル名は内容を表す分かり安いものにしておいてもいいでしょう。
シート名は「TableSheet」としておきます。

リストボックスのRowSourceプロパティにこのテーブル名を設定しておくとテーブルと関連付けられてテーブルのデータが表示されてます。
テーブルを並べ替えたり、フィルターをかけるとリストボックスにも反映されます。

vba

1Private Sub UserForm_Initialize() 2 With Me.ListBox1 3 .ColumnCount = 2 4 .ColumnHeads = True 5 .RowSource = "TableSheet!テーブル1" 6 End With 7End Sub 8 9Private Sub CommandButton1_Click() 10 With Worksheets("TableSheet") 11 .Range("TableSheet").Sort _ 12 Key1:=.Range("テーブル1[時刻]"), _ 13 Order1:=xlAscending, _ 14 Header:=xlYes 15 End With 16End Sub

投稿2020/10/10 15:47

編集2020/10/11 00:20
hatena19

総合スコア33620

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

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

kohan

2020/10/11 12:20

更には、このような別の構文まで用意してくださり、まことにありがとうございます。 テーブルにして、こういう方法もあるのですね、、ぜひ、吸収させていただきます。
guest

0

作業用のワークシート[SortWork]を追加して、次のコードでいかがでしょうか。

VBA

1Private Sub CommandButton12_Click() 2 Dim wshSWK As Worksheet 3 Dim lngListCount As Long 4 5 Set wshSWK = Worksheets("SortWork") 6 lngListCount = ListBox1.ListCount 7 8 wshSWK.Range("A1").CurrentRegion.ClearContents 9 wshSWK.Range("A1:B" & lngListCount) = ListBox1.List 10 wshSWK.Range("C1:C" & lngListCount).FormulaR1C1 = "=RC[-2]" 11 wshSWK.Range("D1:D" & lngListCount).FormulaR1C1 = "=TEXT(RC[-2],""h:mm"")" 12 13 With wshSWK.Sort 14 .SortFields.Clear 15 .SortFields.Add Key:=Range("B1") 16 .SetRange Range("A1").CurrentRegion 17 .Apply 18 End With 19 20 ListBox1.List = wshSWK.Range("C1:D" & lngListCount).Value 21 22 Set wshSWK = Nothing 23 24End Sub

投稿2020/10/10 21:42

編集2020/10/10 23:59
kitasue

総合スコア314

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問