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

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

ただいまの
回答率

89.53%

VBA List.Box ソート機能 ユーザ指定

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,042

King_of_Flies

score 312

お疲れ様です。
Takkoです。

VBAで現在ツールを作成しているものです。

現在フォーム内には、
List.Boxがあり、決められた名前のファイルが格納されています。
現在、自動ソート?なのかは分かりませんが、名前順になっています。

ListBoxには
例えばこんなファイルがあります。
ABC.test_解析0524.pdf
ABC.test_解析0525.pdf
【ABC】test_log0524.pdf
【ABC】test_log0525.pdf
【ABC】test_sql0524.pdf
【ABC】test_sql0525.pdf

これは現在名前順でソートされていると思いますが、
例えばこれを以下のようにソートしたい場合、どのような処理を施せばよいでしょうか。

【ABC】test_sql0524.pdf
【ABC】test_sql0525.pdf
【ABC】test_log0524.pdf
【ABC】test_log0525.pdf
ABC.test_解析0524.pdf
ABC.test_解析0525.pdf

フォームに新規でソートというボタンを配置し、
上記のソート順に並び替えたいのですが、
名前順ではないし、ListBoxの配列順でもないため、
どのようにソートすればよいか分かりません。

ファイル名を取得することは出来るので、
取得したファイル名に条件付で名前順ソートをすれば可能だと思うのですが、
やり方がいまいちわかりません。

private Sub sortBtn_Click()
 //試験用にListBoxへ格納
 listBox1.AddItem "ABC.test_解析0524.pdf"
 listBox1.AddItem "ABC.test_解析0525.pdf"
 listBox1.AddItem "【ABC】test_log0524.pdf"
 listBox1.AddItem "【ABC】test_log0525.pdf"
 listBox1.AddItem "【ABC】test_sql0524.pdf"
 listBox1.AddItem "【ABC】test_sql0525.pdf"
 //ソート処理
 //全く分からない。listBox1.Sorted?

End Sub

一応ロジックで考えると、
ACC.test_解析のグループ
【ABC】test_log0524のグループ
【ABC】test_sql0524のグループ
で三つに切り分けて、
その三つを指定の文字列を含むものから優先に名前順ソートして、
ListBoxに入れなおせばよいのだとは思いますが・・・。

間違っていたらすいません。

アドバイス、お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

書いてみました。
若干面倒な処理ですが、整理して書けば単純なソート処理と大差ありません。
サンプルなので配列で処理してますが、これをリストボックスに置き換えていただければよいです。

Sub test()
    Dim items As Variant
    items = Array( _
        "ABC.test_解析0524.pdf", _
        "ABC.test_解析0525.pdf", _
        "【ABC】test_log0524.pdf", _
        "【ABC】test_log0525.pdf", _
        "【ABC】test_sql0524.pdf", _
        "【ABC】test_sql0525.pdf")

    Dim i As Long
    Dim j As Long
    Dim tmp As Variant
    Dim g1 As Long
    Dim g2 As Long
    Dim c1 As String
    Dim c2 As String

    ' ソート処理
    For i = 0 To UBound(items) - 1
        For j = i + 1 To UBound(items)
            ' グループ判定
            g1 = IsGroup(items(i), c1)
            g2 = IsGroup(items(j), c2)
            ' 入れ替え判定
            If (g1 = g2 And c1 > c2) Or _
               (g1 <> g2 And g1 > g2) Then
               ' 入れ替え
                tmp = items(i)
                items(i) = items(j)
                items(j) = tmp
            End If
        Next
    Next

    For i = 0 To UBound(items)
        Debug.Print items(i)
    Next
End Sub

' グループ判定し、優先度を表す番号と比較文字列を返却
Function IsGroup(item As Variant, cs As String)
    If InStr(1, item, "【ABC】test_sql") > 0 Then
        IsGroup = 1
        cs = Mid(item, 14)
    ElseIf InStr(1, item, "【ABC】test_log") > 0 Then
        IsGroup = 2
        cs = Mid(item, 14)
    ElseIf InStr(1, item, "ABC.test_解析") > 0 Then
        IsGroup = 3
        cs = Mid(item, 10)
    Else
        IsGroup = 4
        cs = item
    End If
End Function

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 17:48

    c1に"20170525"
    c2に"20170524"が入ってきたとして、
    この比較のIfの中に入ってしまいます。

    キャンセル

  • 2017/05/25 18:04

    あ、自力解決できました!

    キャンセル

  • 2017/05/26 08:35

    おはようございます。
    返事が遅くなり申し訳ありません。
    自力解決できたようでよかったです。

    キャンセル

0

わざわざ、コードを書いているので、コードを書かない方法をEXCEL用で例示します。
(EXCEL君は、表計算ソフトなので、らしい使い方の例、EXCEL以外では別途考慮が必要)

1.新規にマクロ有効ブックを作成します。
2.Sheet1!I4:I10 へ、適切なソート対象文字列を記入します。
3.EXCELの開発タブより(開発タブが有効になっていなければ、有効にします。)
4.EXCEL VBA で、ユーザフォームを追加し、リストボックスを追加します。
5.追加したリストボックスの、RowSource : Sheet1!I4:I10 、ControlSource : Sheet1!I2 とします。
6.シート上の、Sheet1!I4:I10 へ入力したソート対象文字列を、任意にソートしなおしたり、入れ替えたりして、リストボックスの表示が、どの様に変化するか確認します。
7.コンボボックスも、似たようなものです。

※VB6 では、ControlSourceは、種々データにリンクが可能でしたが、EXCEL VBA では、
シート上のセル、セル群に限定されているようです。
この様な感覚が掴めていると、VBAの他のコントロールや、
VB.NET / C# でも、各コントロールのデータバインドへの応用が可能です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る