過去ログ

                                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された順に入っているので、並びがぐちゃぐちゃになってしまいます。
実行したときにリストが昇順となるようなプロパティってないんでしょうか?
となるとマクロの中で、そのように日付順になるようなコードを書かなくては
ならないのでしょうか?
 ───────────────────────────────────────  ■題名 : Re:コンボボックスのリストの並びについて  ■名前 : ichinose  ■日付 : 03/3/17(月) 20:25  -------------------------------------------------------------------------
   ▼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
 ───────────────────────────────────────  ■題名 : Re:コンボボックスのリストの並びについて  ■名前 : PJ  ■日付 : 03/3/19(水) 19:30  -------------------------------------------------------------------------
   ▼ichinose さん:>ありがとうございます!
>せっかく値がセル上にあるのだから、セルを並び替えてRowsourceプロパティでセル範囲指定すればいいのかな?と思いましたが、シートの位置は変えたくないのでしょうね?

そのとおり(^^

わーありがとうございます。
Small関数、初めて知りました。これでなんとかいけそうです。
それにしても関数って便利ですねぇー!
 ───────────────────────────────────────  ■題名 : Re:コンボボックスのリストの並びについて  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 03/3/19(水) 20:11  -------------------------------------------------------------------------
   解決しちゃったみたいだけど
配列に読み込んで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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 898