Page 898 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼コンボボックスのリストの並びについて PJ 03/3/17(月) 15:45 ┣Re:コンボボックスのリストの並びについて ichinose 03/3/17(月) 20:25 ┃ ┗Re:コンボボックスのリストの並びについて PJ 03/3/19(水) 19:30 ┗Re:コンボボックスのリストの並びについて Hirofumi 03/3/19(水) 20:11 ─────────────────────────────────────── ■題名 : コンボボックスのリストの並びについて ■名前 : PJ ■日付 : 03/3/17(月) 15:45 -------------------------------------------------------------------------
こんにちは セル上の列をLoopで読み、データをフォームのコンボボックスに additemして行くのですが、フォームを実行するとたとえば日付のリストなど additemされた順に入っているので、並びがぐちゃぐちゃになってしまいます。 実行したときにリストが昇順となるようなプロパティってないんでしょうか? となるとマクロの中で、そのように日付順になるようなコードを書かなくては ならないのでしょうか? |
▼PJ さん: こんばんは。 >セル上の列をLoopで読み、データをフォームのコンボボックスに >additemして行くのですが、フォームを実行するとたとえば日付のリストなど >additemされた順に入っているので、並びがぐちゃぐちゃになってしまいます。 >実行したときにリストが昇順となるようなプロパティってないんでしょうか? >となるとマクロの中で、そのように日付順になるようなコードを書かなくては >ならないのでしょうか? せっかく値がセル上にあるのだから、セルを並び替えてRowsourceプロパティでセル範囲指定すればいいのかな?と思いましたが、シートの位置は変えたくないのでしょうね? ロジックが簡単なのでメンバ数が多いと処理時間がかかってしまいますが、試してみて下さい。尚、最左端のシートのセルA1から下の行に日付が入っているとします。違う場合は、セル範囲の取得を工夫してください。 当該フォームモジュールに、 '===================================================== Private Sub UserForm_Initialize() Dim rng As Range Dim idx As Long With Worksheets(1) Set rng = .Range("a1", .Cells(.Rows.Count, 1).End(xlUp)) End With If rng.Count = 1 Then If rng.Value = "" Then Exit Sub End If End If With ComboBox1 For idx = 1 To rng.Count .AddItem Format(WorksheetFunction.Small(rng, idx), "yyyy/mm/dd") Next idx End With End Sub |
▼ichinose さん:>ありがとうございます! >せっかく値がセル上にあるのだから、セルを並び替えてRowsourceプロパティでセル範囲指定すればいいのかな?と思いましたが、シートの位置は変えたくないのでしょうね? そのとおり(^^ わーありがとうございます。 Small関数、初めて知りました。これでなんとかいけそうです。 それにしても関数って便利ですねぇー! |
解決しちゃったみたいだけど 配列に読み込んでShellSortでソートしちゃう手も有るよ Private Sub UserForm_Initialize() Dim vntValue As Variant With Worksheets("Sheet1") vntValue = .Range(.Cells(1, 1), _ .Cells(.Rows.Count, 1).End(xlUp)).Value End With ShellSortExcel vntValue With ComboBox1 .List = vntValue End With End Sub Private Sub ShellSortExcel(vntList As Variant, _ Optional lngNum As Long = -1, _ Optional lngStart As Long = -1) Dim i As Long Dim j As Long Dim lngGap As Long Dim vntTmp As Variant Dim lngTop As Long Dim lngEnd As Long lngTop = LBound(vntList, 1) If lngStart > -1 Then If lngStart >= LBound(vntList, 1) Then lngTop = lngStart End If End If lngEnd = UBound(vntList, 1) If lngNum > -1 Then If lngTop + lngNum - 1 <= UBound(vntList, 1) Then lngEnd = lngTop + lngNum - 1 End If End If lngGap = 1 Do While lngGap < (lngEnd - lngTop + 1) \ 3 lngGap = 3 * lngGap + 1 Loop Do Until lngGap <= 0 For i = lngGap + lngTop To lngEnd vntTmp = vntList(i, 1) For j = i To lngGap + lngTop Step -lngGap If vntList(j - lngGap, 1) <= vntTmp Then Exit For End If vntList(j, 1) = vntList(j - lngGap, 1) Next j vntList(j, 1) = vntTmp Next i lngGap = lngGap \ 3 Loop End Sub |